import 'package:built_collection/built_collection.dart'; 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), ]); 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), TypedReducer(_startListMultiselect), TypedReducer(_addToListMultiselect), TypedReducer( _removeFromListMultiselect), TypedReducer(_clearListMultiselect), ]); 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); } ListUIState _startListMultiselect( ListUIState taskListState, StartTaskMultiselect action) { return taskListState.rebuild((b) => b..selectedIds = ListBuilder()); } ListUIState _addToListMultiselect( ListUIState taskListState, AddToTaskMultiselect action) { return taskListState.rebuild((b) => b..selectedIds.add(action.entity.id)); } ListUIState _removeFromListMultiselect( ListUIState taskListState, RemoveFromTaskMultiselect action) { return taskListState.rebuild((b) => b..selectedIds.remove(action.entity.id)); } ListUIState _clearListMultiselect( ListUIState taskListState, ClearTaskMultiselect action) { return taskListState.rebuild((b) => b..selectedIds = null); } final tasksReducer = combineReducers([ TypedReducer(_updateTask), TypedReducer(_addTask), TypedReducer(_setLoadedTasks), TypedReducer(_setLoadedTask), TypedReducer(_companyLoaded), 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 tasks = action.taskIds.map((id) => taskState.map[id]).toList(); for (int i = 0; i < tasks.length; i++) { tasks[i] = tasks[i] .rebuild((b) => b..archivedAt = DateTime.now().millisecondsSinceEpoch); } return taskState.rebuild((b) { for (final task in tasks) { b.map[task.id] = task; } }); } TaskState _archiveTaskSuccess(TaskState taskState, ArchiveTaskSuccess action) { return taskState.rebuild((b) { for (final task in action.tasks) { b.map[task.id] = task; } }); } TaskState _archiveTaskFailure(TaskState taskState, ArchiveTaskFailure action) { return taskState.rebuild((b) { for (final task in action.tasks) { b.map[task.id] = task; } }); } TaskState _deleteTaskRequest(TaskState taskState, DeleteTaskRequest action) { final tasks = action.taskIds.map((id) => taskState.map[id]).toList(); for (int i = 0; i < tasks.length; i++) { tasks[i] = tasks[i].rebuild((b) => b ..archivedAt = DateTime.now().millisecondsSinceEpoch ..isDeleted = true); } return taskState.rebuild((b) { for (final task in tasks) { b.map[task.id] = task; } }); } TaskState _deleteTaskSuccess(TaskState taskState, DeleteTaskSuccess action) { return taskState.rebuild((b) { for (final task in action.tasks) { b.map[task.id] = task; } }); } TaskState _deleteTaskFailure(TaskState taskState, DeleteTaskFailure action) { return taskState.rebuild((b) { for (final task in action.tasks) { b.map[task.id] = task; } }); } TaskState _restoreTaskRequest(TaskState taskState, RestoreTaskRequest action) { final tasks = action.taskIds.map((id) => taskState.map[id]).toList(); for (int i = 0; i < tasks.length; i++) { tasks[i] = tasks[i].rebuild((b) => b ..archivedAt = null ..isDeleted = false); } return taskState.rebuild((b) { for (final task in tasks) { b.map[task.id] = task; } }); } TaskState _restoreTaskSuccess(TaskState taskState, RestoreTaskSuccess action) { return taskState.rebuild((b) { for (final task in action.tasks) { b.map[task.id] = task; } }); } TaskState _restoreTaskFailure(TaskState taskState, RestoreTaskFailure action) { return taskState.rebuild((b) { for (final task in action.tasks) { b.map[task.id] = 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) => taskState.loadTasks(action.tasks); TaskState _companyLoaded( TaskState taskState, LoadCompanySuccess action) { final tasks = action.userCompany.company.tasks; if (tasks == null || tasks.isEmpty) { return taskState; } return taskState.loadTasks(tasks); }