diff --git a/lib/middleware/store_timers_middleware.dart b/lib/middleware/store_timers_middleware.dart new file mode 100644 index 0000000..10a2a9d --- /dev/null +++ b/lib/middleware/store_timers_middleware.dart @@ -0,0 +1,42 @@ +import 'package:redux/redux.dart'; +import 'package:time_progress_calculator/actions/timer_actions.dart'; +import 'package:time_progress_calculator/models/app_state.dart'; +import 'package:time_progress_calculator/models/timer.dart'; +import 'package:time_progress_calculator/persistence/timer_entity.dart'; +import 'package:time_progress_calculator/persistence/timers_repository.dart'; +import 'package:time_progress_calculator/selectors/timer_selectors.dart'; + +List> createStoreTimersMiddleware( + TimersRepository repository) { + final saveTimers = _createSaveTimers(repository); + final loadTimers = _createLoadTimers(repository); + + return [ + TypedMiddleware(loadTimers), + TypedMiddleware(saveTimers), + TypedMiddleware(saveTimers), + TypedMiddleware(saveTimers), + ]; +} + +Middleware _createSaveTimers(TimersRepository repository) { + return (Store store, dynamic action, NextDispatcher next) { + next(action); + + repository.saveTimers( + timersSelector(store.state) + .map((timer) => timer.toEntity()) + .toList(growable: false), + ); + }; +} + +Middleware _createLoadTimers(TimersRepository repository) { + return (Store store, dynamic action, NextDispatcher next) { + repository.loadTimers().then((timers) { + store.dispatch( + TimersLoadedAction(timers.map(Timer.fromEntity).toList()), + ); + }).catchError((_) => store.dispatch(TimersNotLoadedAction())); + }; +}