import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_middleware.dart'; import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:redux/redux.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; import 'package:invoiceninja_flutter/ui/task/task_screen.dart'; import 'package:invoiceninja_flutter/ui/task/edit/task_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/task/view/task_view_vm.dart'; import 'package:invoiceninja_flutter/redux/task/task_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/data/repositories/task_repository.dart'; List> createStoreTasksMiddleware([ TaskRepository repository = const TaskRepository(), ]) { final viewTaskList = _viewTaskList(); final viewTask = _viewTask(); final editTask = _editTask(); final loadTasks = _loadTasks(repository); final loadTask = _loadTask(repository); final saveTask = _saveTask(repository); final archiveTask = _archiveTask(repository); final deleteTask = _deleteTask(repository); final restoreTask = _restoreTask(repository); return [ TypedMiddleware(viewTaskList), TypedMiddleware(viewTask), TypedMiddleware(editTask), TypedMiddleware(loadTasks), TypedMiddleware(loadTask), TypedMiddleware(saveTask), TypedMiddleware(archiveTask), TypedMiddleware(deleteTask), TypedMiddleware(restoreTask), ]; } Middleware _editTask() { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as EditTask; if (!action.force && hasChanges(store: store, context: action.context, action: action)) { return; } next(action); store.dispatch(UpdateCurrentRoute(TaskEditScreen.route)); if (isMobile(action.context)) { action.navigator.pushNamed(TaskEditScreen.route); } }; } Middleware _viewTask() { return (Store store, dynamic dynamicAction, NextDispatcher next) async { final action = dynamicAction as ViewTask; if (!action.force && hasChanges(store: store, context: action.context, action: action)) { return; } next(action); store.dispatch(UpdateCurrentRoute(TaskViewScreen.route)); if (isMobile(action.context)) { action.navigator.pushNamed(TaskViewScreen.route); } }; } Middleware _viewTaskList() { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as ViewTaskList; if (!action.force && hasChanges(store: store, context: action.context, action: action)) { return; } next(action); if (store.state.isStale) { store.dispatch(RefreshData()); } store.dispatch(UpdateCurrentRoute(TaskScreen.route)); if (isMobile(action.context)) { action.navigator.pushNamedAndRemoveUntil( TaskScreen.route, (Route route) => false); } }; } Middleware _archiveTask(TaskRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as ArchiveTaskRequest; final prevTasks = action.taskIds.map((id) => store.state.taskState.map[id]).toList(); repository .bulkAction( store.state.credentials, action.taskIds, EntityAction.archive) .then((List tasks) { store.dispatch(ArchiveTaskSuccess(tasks)); if (action.completer != null) { action.completer.complete(null); } }).catchError((Object error) { print(error); store.dispatch(ArchiveTaskFailure(prevTasks)); if (action.completer != null) { action.completer.completeError(error); } }); next(action); }; } Middleware _deleteTask(TaskRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as DeleteTaskRequest; final prevTasks = action.taskIds.map((id) => store.state.taskState.map[id]).toList(); repository .bulkAction( store.state.credentials, action.taskIds, EntityAction.delete) .then((List tasks) { store.dispatch(DeleteTaskSuccess(tasks)); if (action.completer != null) { action.completer.complete(null); } }).catchError((Object error) { print(error); store.dispatch(DeleteTaskFailure(prevTasks)); if (action.completer != null) { action.completer.completeError(error); } }); next(action); }; } Middleware _restoreTask(TaskRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as RestoreTaskRequest; final prevTasks = action.taskIds.map((id) => store.state.taskState.map[id]).toList(); repository .bulkAction( store.state.credentials, action.taskIds, EntityAction.restore) .then((List tasks) { store.dispatch(RestoreTaskSuccess(tasks)); if (action.completer != null) { action.completer.complete(null); } }).catchError((Object error) { print(error); store.dispatch(RestoreTaskFailure(prevTasks)); if (action.completer != null) { action.completer.completeError(error); } }); next(action); }; } Middleware _saveTask(TaskRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as SaveTaskRequest; repository .saveData(store.state.credentials, action.task) .then((TaskEntity task) { if (action.task.isNew) { store.dispatch(AddTaskSuccess(task)); } else { store.dispatch(SaveTaskSuccess(task)); } action.completer.complete(task); }).catchError((Object error) { print(error); store.dispatch(SaveTaskFailure(error)); action.completer.completeError(error); }); next(action); }; } Middleware _loadTask(TaskRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as LoadTask; final AppState state = store.state; if (state.isLoading) { next(action); return; } store.dispatch(LoadTaskRequest()); repository.loadItem(state.credentials, action.taskId).then((task) { store.dispatch(LoadTaskSuccess(task)); if (action.completer != null) { action.completer.complete(null); } }).catchError((Object error) { print(error); store.dispatch(LoadTaskFailure(error)); if (action.completer != null) { action.completer.completeError(error); } }); next(action); }; } Middleware _loadTasks(TaskRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as LoadTasks; final AppState state = store.state; if (state.isLoading) { next(action); return; } store.dispatch(LoadTasksRequest()); repository.loadList(store.state.credentials).then((data) { store.dispatch(LoadTasksSuccess(data)); if (action.completer != null) { action.completer.complete(null); } store.dispatch(LoadVendors()); }).catchError((Object error) { print(error); store.dispatch(LoadTasksFailure(error)); if (action.completer != null) { action.completer.completeError(error); } }); next(action); }; }