import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:redux/redux.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/entity_ui_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; import 'package:invoiceninja_flutter/redux/task/task_actions.dart'; import 'package:invoiceninja_flutter/redux/task/task_state.dart'; EntityUIState taskUIReducer(TaskUIState state, dynamic action) { return state.rebuild((b) => b ..listUIState.replace(taskListReducer(state.listUIState, action)) ..editing.replace(editingReducer(state.editing, action)) ..editingTime.replace(editingTimeReducer(state.editingTime, action)) ..selectedId = selectedIdReducer(state.selectedId, action)); } final editingTimeReducer = combineReducers([ TypedReducer(editTaskTime), TypedReducer(editTaskTime), ]); TaskTime editTaskTime(TaskTime taskTime, dynamic action) { return action.taskTime ?? TaskTime(startDate: DateTime(2000).toUtc()); } Reducer selectedIdReducer = combineReducers([ TypedReducer((selectedId, action) => action.taskId), TypedReducer((selectedId, action) => action.task.id), TypedReducer( (selectedId, action) => action.entityId == null ? selectedId : '') ]); final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer((task, action) { return action.task.rebuild((b) => b..isChanged = true); }), TypedReducer(_addTaskTime), TypedReducer(_removeTaskTime), TypedReducer(_updateTaskTime), TypedReducer(_clearEditing), TypedReducer(_clearEditing), ]); TaskEntity _clearEditing(TaskEntity task, dynamic action) { return TaskEntity(); } TaskEntity _updateEditing(TaskEntity task, dynamic action) { return action.task; } final taskListReducer = combineReducers([ TypedReducer(_sortTasks), TypedReducer(_filterTasksByState), TypedReducer(_filterTasksByStatus), TypedReducer(_filterTasks), TypedReducer(_filterTasksByCustom1), TypedReducer(_filterTasksByCustom2), TypedReducer(_filterTasksByClient), ]); ListUIState _filterTasksByClient( ListUIState taskListState, FilterTasksByEntity action) { return taskListState.rebuild((b) => b ..filterEntityId = action.entityId ..filterEntityType = action.entityType); } ListUIState _filterTasksByCustom1( ListUIState taskListState, FilterTasksByCustom1 action) { if (taskListState.custom1Filters.contains(action.value)) { return taskListState.rebuild((b) => b..custom1Filters.remove(action.value)); } else { return taskListState.rebuild((b) => b..custom1Filters.add(action.value)); } } ListUIState _filterTasksByCustom2( ListUIState taskListState, FilterTasksByCustom2 action) { if (taskListState.custom2Filters.contains(action.value)) { return taskListState.rebuild((b) => b..custom2Filters.remove(action.value)); } else { return taskListState.rebuild((b) => b..custom2Filters.add(action.value)); } } ListUIState _filterTasksByState( ListUIState taskListState, FilterTasksByState action) { if (taskListState.stateFilters.contains(action.state)) { return taskListState.rebuild((b) => b..stateFilters.remove(action.state)); } else { return taskListState.rebuild((b) => b..stateFilters.add(action.state)); } } ListUIState _filterTasksByStatus( ListUIState taskListState, FilterTasksByStatus action) { if (taskListState.statusFilters.contains(action.status)) { return taskListState.rebuild((b) => b..statusFilters.remove(action.status)); } else { return taskListState.rebuild((b) => b..statusFilters.add(action.status)); } } ListUIState _filterTasks(ListUIState taskListState, FilterTasks action) { return taskListState.rebuild((b) => b ..filter = action.filter ..filterClearedAt = action.filter == null ? DateTime.now().millisecondsSinceEpoch : taskListState.filterClearedAt); } ListUIState _sortTasks(ListUIState taskListState, SortTasks action) { return taskListState.rebuild((b) => b ..sortAscending = b.sortField != action.field || !b.sortAscending ..sortField = action.field); } TaskEntity _addTaskTime(TaskEntity task, AddTaskTime action) { return task.addTaskTime(action.taskTime); } TaskEntity _removeTaskTime(TaskEntity task, DeleteTaskTime action) { return task.deleteTaskTime(action.index); } TaskEntity _updateTaskTime(TaskEntity task, UpdateTaskTime action) { return task.updateTaskTime(action.taskTime, action.index); } final tasksReducer = combineReducers([ TypedReducer(_updateTask), TypedReducer(_addTask), TypedReducer(_setLoadedTasks), TypedReducer(_setLoadedTask), TypedReducer(_archiveTaskRequest), TypedReducer(_archiveTaskSuccess), TypedReducer(_archiveTaskFailure), TypedReducer(_deleteTaskRequest), TypedReducer(_deleteTaskSuccess), TypedReducer(_deleteTaskFailure), TypedReducer(_restoreTaskRequest), TypedReducer(_restoreTaskSuccess), TypedReducer(_restoreTaskFailure), ]); TaskState _archiveTaskRequest(TaskState taskState, ArchiveTaskRequest action) { final task = taskState.map[action.taskId] .rebuild((b) => b..archivedAt = DateTime.now().millisecondsSinceEpoch); return taskState.rebuild((b) => b..map[action.taskId] = task); } TaskState _archiveTaskSuccess(TaskState taskState, ArchiveTaskSuccess action) { return taskState.rebuild((b) => b..map[action.task.id] = action.task); } TaskState _archiveTaskFailure(TaskState taskState, ArchiveTaskFailure action) { return taskState.rebuild((b) => b..map[action.task.id] = action.task); } TaskState _deleteTaskRequest(TaskState taskState, DeleteTaskRequest action) { final task = taskState.map[action.taskId].rebuild((b) => b ..archivedAt = DateTime.now().millisecondsSinceEpoch ..isDeleted = true); return taskState.rebuild((b) => b..map[action.taskId] = task); } TaskState _deleteTaskSuccess(TaskState taskState, DeleteTaskSuccess action) { return taskState.rebuild((b) => b..map[action.task.id] = action.task); } TaskState _deleteTaskFailure(TaskState taskState, DeleteTaskFailure action) { return taskState.rebuild((b) => b..map[action.task.id] = action.task); } TaskState _restoreTaskRequest(TaskState taskState, RestoreTaskRequest action) { final task = taskState.map[action.taskId].rebuild((b) => b ..archivedAt = null ..isDeleted = false); return taskState.rebuild((b) => b..map[action.taskId] = task); } TaskState _restoreTaskSuccess(TaskState taskState, RestoreTaskSuccess action) { return taskState.rebuild((b) => b..map[action.task.id] = action.task); } TaskState _restoreTaskFailure(TaskState taskState, RestoreTaskFailure action) { return taskState.rebuild((b) => b..map[action.task.id] = action.task); } TaskState _addTask(TaskState taskState, AddTaskSuccess action) { return taskState.rebuild((b) => b ..map[action.task.id] = action.task ..list.add(action.task.id)); } TaskState _updateTask(TaskState taskState, SaveTaskSuccess action) { return taskState.rebuild((b) => b..map[action.task.id] = action.task); } TaskState _setLoadedTask(TaskState taskState, LoadTaskSuccess action) { return taskState.rebuild((b) => b..map[action.task.id] = action.task); } TaskState _setLoadedTasks(TaskState taskState, LoadTasksSuccess action) { final state = taskState.rebuild((b) => b ..lastUpdated = DateTime.now().millisecondsSinceEpoch ..map.addAll(Map.fromIterable( action.tasks, key: (dynamic item) => item.id, value: (dynamic item) => item, ))); return state.rebuild((b) => b..list.replace(state.map.keys)); }