import 'package:redux/redux.dart'; import 'package:time_progress_tracker/models/app_settings.dart'; import 'package:time_progress_tracker/models/time_progress.dart'; import 'package:time_progress_tracker/persistence/app_settings.dart'; import 'package:time_progress_tracker/persistence/time_progress.dart'; import 'package:time_progress_tracker/redux/actions/app_settings_actions.dart'; import 'package:time_progress_tracker/redux/actions/time_progress_actions.dart'; import 'package:time_progress_tracker/redux/app_state.dart'; import 'package:time_progress_tracker/redux/redux_selectors.dart'; List> createStoreMiddleware( TimeProgressRepository progressRepo, AppSettingsRepository settingsRepo) { final saveTimeProgressList = _createSaveTimeProgressList(progressRepo); final loadTimeProgressList = _createLoadTimeProgressList(progressRepo); final saveSettings = _createSaveAppSettings(settingsRepo); final loadSettings = _createLoadAppSettings(settingsRepo); return [ TypedMiddleware(loadTimeProgressList), TypedMiddleware(saveTimeProgressList), TypedMiddleware(saveTimeProgressList), TypedMiddleware(saveTimeProgressList), TypedMiddleware(loadSettings), TypedMiddleware(saveSettings) ]; } Middleware _createSaveTimeProgressList( TimeProgressRepository repository) { return (Store store, dynamic action, NextDispatcher next) { next(action); repository.save( timeProgressListSelector(store.state) .map((timeProgress) => timeProgress.toEntity()) .toList(growable: false), ); }; } Middleware _createLoadTimeProgressList( TimeProgressRepository repository) { return (Store store, dynamic action, NextDispatcher next) { repository.load().then((timeProgresses) { List timeProgressList = timeProgresses.map(TimeProgress.fromEntity).toList(); if (timeProgressList == null) { timeProgressList = []; } store.dispatch(TimeProgressListLoadedAction( timeProgressList, )); }).catchError((_) => store.dispatch(TimeProgressListNotLoadedAction())); }; } Middleware _createSaveAppSettings(AppSettingsRepository repo) => (Store store, dynamic action, NextDispatcher next) { next(action); repo.save(store.state.appSettings.toEntity()); }; Middleware _createLoadAppSettings(AppSettingsRepository repo) => (Store store, dynamic action, NextDispatcher next) { repo.load().then((appSettings) { store.dispatch( AppSettingsLoadedActions(AppSettings.fromEntity(appSettings))); }); };