import 'package:flutter/widgets.dart'; import 'package:invoiceninja/constants.dart'; import 'package:invoiceninja/data/file_storage.dart'; import 'package:invoiceninja/data/repositories/persistence_repository.dart'; import 'package:invoiceninja/redux/app/app_state.dart'; import 'package:invoiceninja/redux/auth/auth_actions.dart'; import 'package:invoiceninja/redux/dashboard/dashboard_actions.dart'; import 'package:invoiceninja/redux/product/product_actions.dart'; import 'package:invoiceninja/routes.dart'; import 'package:redux/redux.dart'; import 'package:path_provider/path_provider.dart'; List> createStorePersistenceMiddleware([ PersistenceRepository repository = const PersistenceRepository( fileStorage: const FileStorage( kStateFilename, getApplicationDocumentsDirectory, ), ), ]) { final loadState = _createLoadState(repository); final dataLoaded = _createDataLoaded(repository); final deleteState = _createDeleteState(repository); return [ TypedMiddleware(deleteState), TypedMiddleware(loadState), TypedMiddleware(dataLoaded), TypedMiddleware(dataLoaded), TypedMiddleware(dataLoaded), TypedMiddleware(dataLoaded), TypedMiddleware(dataLoaded), TypedMiddleware(dataLoaded), TypedMiddleware(dataLoaded), ]; } Middleware _createLoadState(PersistenceRepository repository) { return (Store store, action, NextDispatcher next) { repository.loadData().then((state) { store.dispatch(LoadStateSuccess(state)); Navigator.of(action.context).pushReplacementNamed(AppRoutes.dashboard); }).catchError((error) { print(error); store.dispatch(LoadUserLogin()); }); next(action); }; } Middleware _createDataLoaded(PersistenceRepository repository) { return (Store store, action, NextDispatcher next) { // first process the action so the data is in the state next(action); if (store.state.isLoaded()) { repository.saveData(store.state); } }; } Middleware _createDeleteState(PersistenceRepository repository) { return (Store store, action, NextDispatcher next) { repository.delete(); next(action); }; }