diff --git a/lib/src/presenting/src/widgets/future_presenter.widget.dart b/lib/src/presenting/src/widgets/future_presenter.widget.dart index d9747c4..b09be06 100644 --- a/lib/src/presenting/src/widgets/future_presenter.widget.dart +++ b/lib/src/presenting/src/widgets/future_presenter.widget.dart @@ -21,9 +21,10 @@ class AstromicFuturePresenter extends StatefulWidget { //SECTION - Widget Arguments final AstromicPresenterController controller; final String id; - final Map? neededArguments; + final Map? neededArguments; // - final Map? r)> stateBuilder; + final Map? r)>? stateBuilder; + final Map, Widget Function(AstromicPresenterState state, PresenterReturnModel? r)>? multiStateBuilder; final AstromicPresenterConfiguration? configuration; //!SECTION @@ -31,11 +32,11 @@ class AstromicFuturePresenter extends StatefulWidget { super.key, required this.controller, required this.id, - required this.stateBuilder, + this.stateBuilder, + this.multiStateBuilder, this.configuration, this.neededArguments, - - }); + }) : assert(stateBuilder != null || multiStateBuilder != null, 'You need to provide either a state or a multi-state builder.'); @override State> createState() => _AstromicFuturePresenterState(); @@ -105,7 +106,7 @@ class _AstromicFuturePresenterState extends State> final Map _defaultstateBuilders = { AstromicPresenterState.initialLoad: const Center(child: CircularProgressIndicator()), AstromicPresenterState.loading: const Center(child: CircularProgressIndicator()), - AstromicPresenterState.empty: const Center(child: Text('No data at the moment!')), + AstromicPresenterState.empty: Container(), AstromicPresenterState.error: const Center(child: Text('an error has occured, check the log!')), AstromicPresenterState.loaded: const Center(child: Text('I have the data, replace this with a widget!')), }; @@ -123,7 +124,7 @@ class _AstromicFuturePresenterState extends State> } //S1 -- Method to reinitialize or update `_future` with a new instance - void _refreshFuture({Map? updatedArgs}) { + void _refreshFuture({Map? updatedArgs}) { // Increment the refresh key to ensure a unique future instance _refreshKey++; setState(() { @@ -132,8 +133,8 @@ class _AstromicFuturePresenterState extends State> } //S1 -- Method to reinitialize or update `_future` with a new instance - void _initializeFuture({Map? updatedArgs}) { - widget.controller.setProvidedArguments(updatedArgs ?? widget.neededArguments ?? {}); + void _initializeFuture({Map? updatedArgs}) { + widget.controller.setProvidedArguments(updatedArgs ?? widget.neededArguments ?? {}); _future = widget.controller.getFuture(widget.id)?.then((dynamic result) => result as T?); } //!SECTION @@ -174,7 +175,18 @@ class _AstromicFuturePresenterState extends State> log('Got this error in the future presenter `${widget.id}`: ${returnedModel?.error}'); } // - return widget.stateBuilder.containsKey(returnedState) ? widget.stateBuilder[returnedState]?.call(returnedModel) ?? defaultBuilder : defaultBuilder; + return widget.stateBuilder != null + ? widget.stateBuilder!.containsKey(returnedState) + ? widget.stateBuilder![returnedState]?.call(returnedModel) ?? defaultBuilder + : defaultBuilder + : widget.multiStateBuilder != null + ? + // + widget.multiStateBuilder!.entries.where((k) => k.key.contains(returnedState)).isNotEmpty + ? widget.multiStateBuilder!.entries.where((k) => k.key.contains(returnedState)).first.value.call(returnedState, returnedModel) + : defaultBuilder + // + : Container(); }); //!SECTION } diff --git a/lib/src/presenting/src/widgets/multi_presenter.widget.dart b/lib/src/presenting/src/widgets/multi_presenter.widget.dart new file mode 100644 index 0000000..7f14b08 --- /dev/null +++ b/lib/src/presenting/src/widgets/multi_presenter.widget.dart @@ -0,0 +1,123 @@ +// //s1 Imports +// //s2 Packages +// //s3 Core Packages +// import 'package:flutter/material.dart'; + +// import '../enums/enums.exports.dart'; +// import '../models/models.exports.dart'; +// import 'presenter_controller.widget.dart'; +// //s3 Internal Packages +// //s3 3rd-party Packages +// //s2 Utility +// //s3 Configs +// // import '../../../../../core/configs/routing/routing.config.dart'; +// //s3 Misc +// //s2 Domain +// //s3 Entities +// //s3 Usecases +// //s2 Presentation +// //s3 Design +// // import '../../../../design-system/design_system.dart'; +// //s3 Presenters +// //s3 Widgets +// //s1 Exports + +// class AstromicMultiPresenterWidget extends StatefulWidget { +// //SECTION - Widget Arguments +// final AstromicPresenterController controller; +// final Map? neededArguments; +// // +// final Map? r)>? stateBuilder; +// final Map, Widget Function(AstromicPresenterState state, PresenterReturnModel? r)>? multiStateBuilder; +// // +// final AstromicPresenterConfiguration? configuration; +// //!SECTION +// // +// const AstromicMultiPresenterWidget({ +// super.key, +// }); + +// @override +// State createState() => _AstromicMultiPresenterWidgetState(); +// } + +// class _AstromicMultiPresenterWidgetState extends State { +// // +// //SECTION - State Variables +// //s1 --State +// //s1 --State +// // +// //s1 --Controllers +// //late AstromicFormController _formController; +// //s1 --Controllers +// // +// //s1 --Constants +// //s1 --Constants +// //!SECTION + +// @override +// void initState() { +// super.initState(); +// // +// //SECTION - State Variables initializations & Listeners +// //s1 --State +// //s1 --State +// // +// //s1 --Controllers & Listeners +// // _formController = AstromicFormController(); +// //s1 --Controllers & Listeners +// // +// //s1 --Late & Async Initializers +// //s1 --Late & Async Initializers +// //!SECTION +// } + +// @override +// void didChangeDependencies() { +// super.didChangeDependencies(); +// // +// //SECTION - State Variables initializations & Listeners +// //s1 --State +// //s1 --State +// // +// //s1 --Controllers & Listeners +// //s1 --Controllers & Listeners +// // +// //!SECTION +// } + +// //SECTION - Dumb Widgets +// //!SECTION + +// //SECTION - Stateless functions +// //!SECTION + +// //SECTION - Action Callbacks +// //!SECTION + +// @override +// Widget build(BuildContext context) { +// //SECTION - Build Setup +// //s1 --Values +// //double w = MediaQuery.of(context).size.width; +// //double h = MediaQuery.of(context).size.height; +// //s1 --Values +// // +// //s1 --Contexted Widgets +// //s1 --Contexted Widgets +// //!SECTION + +// //SECTION - Build Return +// return const Scaffold( +// body: Center(child: Text(AstromicMultiPresenterWidget)), +// ); +// //!SECTION +// } + +// @override +// void dispose() { +// //SECTION - Disposable variables +// //!SECTION +// super.dispose(); +// } +// } diff --git a/lib/src/presenting/src/widgets/stream_presenter.widget.dart b/lib/src/presenting/src/widgets/stream_presenter.widget.dart index b7e35b8..108d6f5 100644 --- a/lib/src/presenting/src/widgets/stream_presenter.widget.dart +++ b/lib/src/presenting/src/widgets/stream_presenter.widget.dart @@ -23,7 +23,9 @@ class AstromicStreamPresenter extends StatefulWidget { final String id; final Map? neededArguments; // - final Map? r)> stateBuilder; + final Map? r)>? stateBuilder; + final Map, Widget Function(AstromicPresenterState state, PresenterReturnModel? r)>? multiStateBuilder; + final AstromicPresenterConfiguration? configuration; //!SECTION // @@ -31,10 +33,11 @@ class AstromicStreamPresenter extends StatefulWidget { super.key, required this.controller, required this.id, - required this.stateBuilder, + this.stateBuilder, + this.multiStateBuilder, this.configuration, this.neededArguments, - }); + }) : assert(stateBuilder != null || multiStateBuilder != null, 'You need to provide either a state or a multi-state builder.'); @override State> createState() => _AstromicStreamPresenterState(); @@ -107,7 +110,7 @@ class _AstromicStreamPresenterState extends State> final Map _defaultstateBuilders = { AstromicPresenterState.initialLoad: const Center(child: CircularProgressIndicator()), AstromicPresenterState.loading: const Center(child: CircularProgressIndicator()), - AstromicPresenterState.empty: const Center(child: Text('No data at the moment!')), + AstromicPresenterState.empty: Container(), AstromicPresenterState.error: const Center(child: Text('an error has occured, check the log!')), AstromicPresenterState.loaded: const Center(child: Text('I have the data, replace this with a widget!')), }; @@ -167,7 +170,18 @@ class _AstromicStreamPresenterState extends State> log('Got this error in the stream presenter `${widget.id}`: ${returnedModel?.error}'); } // - return widget.stateBuilder.containsKey(returnedState) ? widget.stateBuilder[returnedState]?.call(returnedModel) ?? defaultBuilder : defaultBuilder; + return widget.stateBuilder != null + ? widget.stateBuilder!.containsKey(returnedState) + ? widget.stateBuilder![returnedState]?.call(returnedModel) ?? defaultBuilder + : defaultBuilder + : widget.multiStateBuilder != null + ? + // + widget.multiStateBuilder!.entries.where((k) => k.key.contains(returnedState)).isNotEmpty + ? widget.multiStateBuilder!.entries.where((k) => k.key.contains(returnedState)).first.value.call(returnedState, returnedModel) + : defaultBuilder + // + : Container(); // }); //!SECTION