import 'package:invoiceninja_flutter/.env.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/repositories/client_repository.dart'; import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/redux/product/product_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; import 'package:invoiceninja_flutter/ui/client/client_screen.dart'; import 'package:invoiceninja_flutter/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/client/view/client_view_vm.dart'; import 'package:redux/redux.dart'; List> createStoreClientsMiddleware([ ClientRepository repository = const ClientRepository(), ]) { final viewClientList = _viewClientList(); final viewClient = _viewClient(); final editClient = _editClient(); final loadClients = _loadClients(repository); final loadClient = _loadClient(repository); final saveClient = _saveClient(repository); final archiveClient = _archiveClient(repository); final deleteClient = _deleteClient(repository); final restoreClient = _restoreClient(repository); final saveDocument = _saveDocument(repository); return [ TypedMiddleware(viewClientList), TypedMiddleware(viewClient), TypedMiddleware(editClient), TypedMiddleware(loadClients), TypedMiddleware(loadClient), TypedMiddleware(saveClient), TypedMiddleware(archiveClient), TypedMiddleware(deleteClient), TypedMiddleware(restoreClient), TypedMiddleware(saveDocument), ]; } Middleware _editClient() { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as EditClient; next(action); store.dispatch(UpdateCurrentRoute(ClientEditScreen.route)); if (store.state.prefState.isMobile) { navigatorKey.currentState.pushNamed(ClientEditScreen.route); } }; } Middleware _viewClient() { return (Store store, dynamic dynamicAction, NextDispatcher next) async { final action = dynamicAction as ViewClient; next(action); store.dispatch(UpdateCurrentRoute(ClientViewScreen.route)); if (store.state.prefState.isMobile) { navigatorKey.currentState.pushNamed(ClientViewScreen.route); } }; } Middleware _viewClientList() { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as ViewClientList; next(action); if (store.state.isStale) { store.dispatch(RefreshData()); } store.dispatch(UpdateCurrentRoute(ClientScreen.route)); if (store.state.prefState.isMobile) { navigatorKey.currentState.pushNamedAndRemoveUntil( ClientScreen.route, (Route route) => false); } }; } Middleware _archiveClient(ClientRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as ArchiveClientsRequest; final prevClients = action.clientIds.map((id) => store.state.clientState.map[id]).toList(); repository .bulkAction( store.state.credentials, action.clientIds, EntityAction.archive) .then((List clients) { store.dispatch(ArchiveClientsSuccess(clients)); if (action.completer != null) { action.completer.complete(null); } }).catchError((Object error) { print(error); store.dispatch(ArchiveClientsFailure(prevClients)); if (action.completer != null) { action.completer.completeError(error); } }); next(action); }; } Middleware _deleteClient(ClientRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as DeleteClientsRequest; final prevClients = action.clientIds.map((id) => store.state.clientState.map[id]).toList(); repository .bulkAction( store.state.credentials, action.clientIds, EntityAction.delete) .then((List clients) { store.dispatch(DeleteClientsSuccess(clients)); if (action.completer != null) { action.completer.complete(null); } }).catchError((Object error) { print(error); store.dispatch(DeleteClientsFailure(prevClients)); if (action.completer != null) { action.completer.completeError(error); } }); next(action); }; } Middleware _restoreClient(ClientRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as RestoreClientsRequest; final prevClients = action.clientIds.map((id) => store.state.clientState.map[id]).toList(); repository .bulkAction( store.state.credentials, action.clientIds, EntityAction.restore) .then((List clients) { store.dispatch(RestoreClientSuccess(clients)); if (action.completer != null) { action.completer.complete(null); } }).catchError((Object error) { print(error); store.dispatch(RestoreClientFailure(prevClients)); if (action.completer != null) { action.completer.completeError(error); } }); next(action); }; } Middleware _saveClient(ClientRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as SaveClientRequest; repository .saveData(store.state.credentials, action.client) .then((ClientEntity client) { if (action.client.isNew) { store.dispatch(AddClientSuccess(client)); } else { store.dispatch(SaveClientSuccess(client)); } action.completer.complete(client); final clientUIState = store.state.clientUIState; if (clientUIState.saveCompleter != null) { clientUIState.saveCompleter.complete(client); } }).catchError((Object error) { print(error); store.dispatch(SaveClientFailure(error)); action.completer.completeError(error); }); next(action); }; } Middleware _loadClient(ClientRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as LoadClient; if (Config.DEMO_MODE) { next(action); return; } store.dispatch(LoadClientRequest()); repository .loadItem(store.state.credentials, action.clientId) .then((client) { store.dispatch(LoadClientSuccess(client)); if (action.completer != null) { action.completer.complete(null); } }).catchError((Object error) { print(error); store.dispatch(LoadClientFailure(error)); if (action.completer != null) { action.completer.completeError(error); } }); next(action); }; } Middleware _loadClients(ClientRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as LoadClients; store.dispatch(LoadClientsRequest()); repository.loadList(store.state.credentials).then((data) { store.dispatch(LoadClientsSuccess(data)); if (action.completer != null) { action.completer.complete(null); } store.dispatch(LoadProducts()); }).catchError((Object error) { print(error); store.dispatch(LoadClientsFailure(error)); if (action.completer != null) { action.completer.completeError(error); } }); next(action); }; } Middleware _saveDocument(ClientRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as SaveClientDocumentRequest; if (store.state.isEnterprisePlan) { repository .uploadDocument( store.state.credentials, action.client, action.multipartFile) .then((client) { store.dispatch(SaveClientSuccess(client)); action.completer.complete(null); }).catchError((Object error) { print(error); store.dispatch(SaveClientDocumentFailure(error)); action.completer.completeError(error); }); } else { const error = 'Uploading documents requires an enterprise plan'; store.dispatch(SaveClientDocumentFailure(error)); action.completer.completeError(error); } next(action); }; }