import 'dart:async'; 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/project/project_actions.dart'; import 'package:invoiceninja_flutter/redux/project/project_state.dart'; EntityUIState projectUIReducer(ProjectUIState state, dynamic action) { return state.rebuild((b) => b ..listUIState.replace(projectListReducer(state.listUIState, action)) ..editing.replace(editingReducer(state.editing, action)) ..selectedId = selectedIdReducer(state.selectedId, action) ..tabIndex = tabIndexReducer(state.tabIndex, action) ..saveCompleter = saveCompleterReducer(state.saveCompleter, action) ..cancelCompleter = cancelCompleterReducer(state.cancelCompleter, action)); } final tabIndexReducer = combineReducers([ TypedReducer((completer, action) { return action.tabIndex; }), TypedReducer((completer, action) { return 0; }), ]); final saveCompleterReducer = combineReducers>([ TypedReducer, EditProject>((completer, action) { return action.completer; }), ]); final cancelCompleterReducer = combineReducers>([ TypedReducer, EditProject>((completer, action) { return action.cancelCompleter; }), ]); Reducer selectedIdReducer = combineReducers([ TypedReducer((selectedId, action) => action.entityType == EntityType.project ? action.entityId : selectedId), TypedReducer((selectedId, action) => action.projectId), TypedReducer( (selectedId, action) => action.project.id), TypedReducer( (selectedId, action) => action.clearSelection ? '' : selectedId), TypedReducer((selectedId, action) => ''), ]); final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer((projects, action) { return action.projects[0]; }), TypedReducer((projects, action) { return action.projects[0]; }), TypedReducer((projects, action) { return action.projects[0]; }), TypedReducer(_updateEditing), TypedReducer((project, action) { return action.project.rebuild((b) => b..isChanged = true); }), TypedReducer(_clearEditing), ]); ProjectEntity _clearEditing(ProjectEntity project, dynamic dynamicAction) { return ProjectEntity(); } ProjectEntity _updateEditing(ProjectEntity project, dynamic action) { return action.project; } final projectListReducer = combineReducers([ TypedReducer(_sortProjects), TypedReducer(_filterProjectsByState), TypedReducer(_filterProjects), TypedReducer(_filterProjectsByCustom1), TypedReducer(_filterProjectsByCustom2), TypedReducer(_filterProjectsByCustom3), TypedReducer(_filterProjectsByCustom4), TypedReducer(_startListMultiselect), TypedReducer(_addToListMultiselect), TypedReducer( _removeFromListMultiselect), TypedReducer(_clearListMultiselect), ]); ListUIState _filterProjectsByCustom1( ListUIState projectListState, FilterProjectsByCustom1 action) { if (projectListState.custom1Filters.contains(action.value)) { return projectListState .rebuild((b) => b..custom1Filters.remove(action.value)); } else { return projectListState.rebuild((b) => b..custom1Filters.add(action.value)); } } ListUIState _filterProjectsByCustom2( ListUIState projectListState, FilterProjectsByCustom2 action) { if (projectListState.custom2Filters.contains(action.value)) { return projectListState .rebuild((b) => b..custom2Filters.remove(action.value)); } else { return projectListState.rebuild((b) => b..custom2Filters.add(action.value)); } } ListUIState _filterProjectsByCustom3( ListUIState projectListState, FilterProjectsByCustom3 action) { if (projectListState.custom3Filters.contains(action.value)) { return projectListState .rebuild((b) => b..custom3Filters.remove(action.value)); } else { return projectListState.rebuild((b) => b..custom3Filters.add(action.value)); } } ListUIState _filterProjectsByCustom4( ListUIState projectListState, FilterProjectsByCustom4 action) { if (projectListState.custom4Filters.contains(action.value)) { return projectListState .rebuild((b) => b..custom4Filters.remove(action.value)); } else { return projectListState.rebuild((b) => b..custom4Filters.add(action.value)); } } ListUIState _filterProjectsByState( ListUIState projectListState, FilterProjectsByState action) { if (projectListState.stateFilters.contains(action.state)) { return projectListState .rebuild((b) => b..stateFilters.remove(action.state)); } else { return projectListState.rebuild((b) => b..stateFilters.add(action.state)); } } ListUIState _filterProjects( ListUIState projectListState, FilterProjects action) { return projectListState.rebuild((b) => b ..filter = action.filter ..filterClearedAt = action.filter == null ? DateTime.now().millisecondsSinceEpoch : projectListState.filterClearedAt); } ListUIState _sortProjects(ListUIState projectListState, SortProjects action) { return projectListState.rebuild((b) => b ..sortAscending = b.sortField != action.field || !b.sortAscending ..sortField = action.field); } ListUIState _startListMultiselect( ListUIState projectListState, StartProjectMultiselect action) { return projectListState.rebuild((b) => b..selectedIds = ListBuilder()); } ListUIState _addToListMultiselect( ListUIState projectListState, AddToProjectMultiselect action) { return projectListState.rebuild((b) => b..selectedIds.add(action.entity.id)); } ListUIState _removeFromListMultiselect( ListUIState projectListState, RemoveFromProjectMultiselect action) { return projectListState .rebuild((b) => b..selectedIds.remove(action.entity.id)); } ListUIState _clearListMultiselect( ListUIState projectListState, ClearProjectMultiselect action) { return projectListState.rebuild((b) => b..selectedIds = null); } final projectsReducer = combineReducers([ TypedReducer(_updateProject), TypedReducer(_addProject), TypedReducer(_setLoadedProjects), TypedReducer(_setLoadedCompany), TypedReducer(_setLoadedProject), TypedReducer(_archiveProjectSuccess), TypedReducer(_deleteProjectSuccess), TypedReducer(_restoreProjectSuccess), ]); ProjectState _archiveProjectSuccess( ProjectState projectState, ArchiveProjectSuccess action) { return projectState.rebuild((b) { for (final project in action.projects) { b.map[project.id] = project; } }); } ProjectState _deleteProjectSuccess( ProjectState projectState, DeleteProjectSuccess action) { return projectState.rebuild((b) { for (final project in action.projects) { b.map[project.id] = project; } }); } ProjectState _restoreProjectSuccess( ProjectState projectState, RestoreProjectSuccess action) { return projectState.rebuild((b) { for (final project in action.projects) { b.map[project.id] = project; } }); } ProjectState _addProject(ProjectState projectState, AddProjectSuccess action) { return projectState.rebuild((b) => b ..map[action.project.id] = action.project ..list.add(action.project.id)); } ProjectState _updateProject( ProjectState projectState, SaveProjectSuccess action) { return projectState .rebuild((b) => b..map[action.project.id] = action.project); } ProjectState _setLoadedProject( ProjectState projectState, LoadProjectSuccess action) { return projectState .rebuild((b) => b..map[action.project.id] = action.project); } ProjectState _setLoadedProjects( ProjectState projectState, LoadProjectsSuccess action) => projectState.loadProjects(action.projects); ProjectState _setLoadedCompany( ProjectState projectState, LoadCompanySuccess action) { final company = action.userCompany.company; return projectState.loadProjects(company.projects); }