diff --git a/example/README.md b/example/README.md index 0fc2b93..6694b66 100644 --- a/example/README.md +++ b/example/README.md @@ -28,6 +28,7 @@ - [ ] Change Page to Screen? - [ ] Find a way to justify having Page -> View (ViewTemplate + StateHolder) maybe eventually Page = View + PageController where the controller can access to feature flags. +- [ ] How can we create sharable components between feature modules. Meaning a Component could be part of `ModulaA` but imported and included on `ModuleB` and have the same behavior out of the box. How feature flags could work at this level. --- From Atomic Design guides: diff --git a/example/lib/get/get_app_navigator.dart b/example/lib/get/get_app_navigator.dart index 0ef5900..b3e9410 100644 --- a/example/lib/get/get_app_navigator.dart +++ b/example/lib/get/get_app_navigator.dart @@ -1,4 +1,4 @@ -import 'package:buzz/navigation.dart'; +import 'package:buzz/buzz.dart'; import 'package:get/get.dart'; class GetAppNavigator extends Navigator { @@ -23,3 +23,10 @@ class GetAppNavigator extends Navigator { Get.toNamed(path); } } + +class GetFeedbacksExecutor extends FeedbacksExecutor { + @override + void snackBar(String title, String message) { + Get.snackbar(title, message); + } +} diff --git a/example/lib/get/get_main.dart b/example/lib/get/get_main.dart index 54a0bb3..a5cadc7 100644 --- a/example/lib/get/get_main.dart +++ b/example/lib/get/get_main.dart @@ -22,6 +22,7 @@ void main() { Buzz ..init( navigator: GetAppNavigator(), + feedbacksExecutor: GetFeedbacksExecutor(), moduleRegistries: [ ProfileModuleRegistries( () => Get.find(), @@ -50,8 +51,6 @@ void main() { NavigateBackCommand(), ); }, - //TODO: Validate stream being injected here. - profileStream: Get.find().profileStateChanges, ), ), ], diff --git a/example/lib/modular/modular_app_navigator.dart b/example/lib/modular/modular_app_navigator.dart index 2956293..8a69515 100644 --- a/example/lib/modular/modular_app_navigator.dart +++ b/example/lib/modular/modular_app_navigator.dart @@ -1,4 +1,4 @@ -import 'package:buzz/navigation.dart'; +import 'package:buzz/buzz.dart' show Navigator, FeedbacksExecutor; import 'package:flutter_modular/flutter_modular.dart'; class ModularAppNavigator extends Navigator { diff --git a/lib/buzz.dart b/lib/buzz.dart index 01e8bfc..6e74bdd 100644 --- a/lib/buzz.dart +++ b/lib/buzz.dart @@ -1,6 +1,7 @@ library buzz; export 'buzz_impl.dart'; +export 'feedbacks.dart'; export 'infra/event_bus_holder.dart'; export 'infra/registries.dart'; export 'infra/typed_event_bus.dart'; diff --git a/lib/buzz_impl.dart b/lib/buzz_impl.dart index d19d7e4..358401b 100644 --- a/lib/buzz_impl.dart +++ b/lib/buzz_impl.dart @@ -1,4 +1,5 @@ import 'package:buzz/buzz.dart'; +import 'package:buzz/feedbacks.dart'; import 'infra/registries.dart'; import 'utils.dart'; @@ -23,9 +24,11 @@ abstract class IBuzzBase { UiEventBus get uiEvents; Navigator get navigator; + FeedbacksExecutor get feedbacksExecutor; void init({ required Navigator navigator, + FeedbacksExecutor? feedbacksExecutor, List? moduleRegistries, }); @@ -37,6 +40,9 @@ class BuzzBase implements IBuzzBase { @override Navigator get navigator => _navigator; + @override + FeedbacksExecutor get feedbacksExecutor => _feedbacksExecutor; + @override AppEventBus get appEvents => EventBusHolder.of(); @@ -47,14 +53,17 @@ class BuzzBase implements IBuzzBase { UiEventBus get uiEvents => EventBusHolder.of(); late Navigator _navigator; + late FeedbacksExecutor _feedbacksExecutor; List? _moduleRegistries; @override void init({ required Navigator navigator, + FeedbacksExecutor? feedbacksExecutor, List? moduleRegistries, }) { _navigator = navigator; + _feedbacksExecutor = feedbacksExecutor ?? DefaultFeedbacksExecutor(); _moduleRegistries = moduleRegistries; _bindNavigationCommandHandler(); diff --git a/lib/feedbacks.dart b/lib/feedbacks.dart new file mode 100644 index 0000000..733fb01 --- /dev/null +++ b/lib/feedbacks.dart @@ -0,0 +1,45 @@ +import 'package:buzz/buzz.dart'; +import 'package:buzz/utils.dart'; + +abstract class FeedbacksCommand extends Command {} + +class ShowSnackBarCommand extends FeedbacksCommand { + ShowSnackBarCommand( + this.title, { + required this.message, + }); + + final String title; + final String message; +} + +abstract class FeedbacksExecutor { + void snackBar(String title, String message); +} + +class FeedbacksCommandHandler extends TypedEventHandler { + FeedbacksCommandHandler({ + required this.feedbacksExecutor, + }); + + final FeedbacksExecutor feedbacksExecutor; + + @override + void handle(FeedbacksCommand command) { + if (command is ShowSnackBarCommand) { + feedbacksExecutor.snackBar(command.title, command.message); + Buzz.fire(OnShowedSnackBarEvent()); + } + + //TODO: Add more cases + } +} + +class OnShowedSnackBarEvent extends AppEvent {} + +class DefaultFeedbacksExecutor extends FeedbacksExecutor { + @override + void snackBar(String title, String message) { + developerLog('$title:$message'); + } +}