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)) ..editingTimeIndex = editingTimeReducer(state.editingTimeIndex, action) ..selectedId = selectedIdReducer(state.selectedId, action) ..forceSelected = forceSelectedReducer(state.forceSelected, action) ..tabIndex = tabIndexReducer(state.tabIndex, action)); } final forceSelectedReducer = combineReducers([ TypedReducer((completer, action) => true), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), ]); final tabIndexReducer = combineReducers([ TypedReducer((completer, action) { return action.tabIndex; }), TypedReducer((completer, action) { return 0; }), ]); final editingTimeReducer = combineReducers([ TypedReducer((index, action) => action.taskTimeIndex), TypedReducer((index, action) => action.taskTimeIndex), /* TypedReducer((index, action) => action.invoiceItemIndex), TypedReducer( (index, action) => action.invoiceItemIndex), */ ]); /* TaskTime editTaskTime(TaskTime taskTime, dynamic action) { return action.taskTime ?? TaskTime(startDate: DateTime(2000).toUtc()); } */ Reducer selectedIdReducer = combineReducers([ TypedReducer((selectedId, action) => action.entityType == EntityType.task ? action.entityId : selectedId), TypedReducer((selectedId, action) => action.taskId), TypedReducer((selectedId, action) => selectedId.isNotEmpty || action.autoSelect ? action.task.id : ''), TypedReducer( (selectedId, action) => action.clearSelection ? '' : selectedId), TypedReducer((selectedId, action) => ''), ]); final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer((tasks, action) { return action.tasks[0]; }), TypedReducer((tasks, action) { return action.tasks[0]; }), TypedReducer((tasks, action) { return action.tasks[0]; }), TypedReducer(_updateEditing), TypedReducer((task, action) { return action.task.rebuild((b) => b..isChanged = true); }), TypedReducer(_addTaskTime), TypedReducer(_removeTaskTime), TypedReducer(_updateTaskTime), 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(_startListMultiselect), TypedReducer(_addToListMultiselect), TypedReducer( _removeFromListMultiselect), TypedReducer(_clearListMultiselect), TypedReducer(_viewTaskList), ]); ListUIState _viewTaskList(ListUIState taskListState, ViewTaskList action) { return taskListState.rebuild((b) => b ..filter = null ..filterClearedAt = DateTime.now().millisecondsSinceEpoch); } 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) .rebuild((b) => b.showAsRunning = action.showAsRunning); } 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(_setLoadedCompany), TypedReducer(_setLoadedTask), TypedReducer(_archiveTaskSuccess), TypedReducer(_deleteTaskSuccess), TypedReducer(_restoreTaskSuccess), TypedReducer(_sortTasksSuccess), ]); TaskState _sortTasksSuccess(TaskState taskState, SortTasksSuccess action) { return taskState.rebuild((b) { for (final statusId in action.taskIds.keys) { for (final taskId in action.taskIds[statusId]) { b.map[taskId] = taskState.map[taskId].rebuild((b) => b ..statusId = statusId ..statusOrder = action.taskIds[statusId].indexOf(taskId)); } } }); } TaskState _archiveTaskSuccess(TaskState taskState, ArchiveTaskSuccess action) { return taskState.rebuild((b) { for (final task in action.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 _restoreTaskSuccess(TaskState taskState, RestoreTaskSuccess 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 _setLoadedCompany(TaskState taskState, LoadCompanySuccess action) { final company = action.userCompany.company; return taskState.loadTasks(company.tasks); }