import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/document/document_actions.dart'; import 'package:invoiceninja_flutter/redux/document/document_state.dart'; import 'package:invoiceninja_flutter/redux/ui/entity_ui_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; import 'package:redux/redux.dart'; EntityUIState documentUIReducer(DocumentUIState state, dynamic action) { return state.rebuild((b) => b ..listUIState.replace(documentListReducer(state.listUIState, action)) ..editing.replace(editingReducer(state.editing, action)) ..selectedId = selectedIdReducer(state.selectedId, action)); } Reducer selectedIdReducer = combineReducers([ TypedReducer((selectedId, action) => action.documentId), TypedReducer( (selectedId, action) => action.document.id), ]); final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer((document, action) { return action.document.rebuild((b) => b..isChanged = true); }), TypedReducer(_clearEditing), ]); DocumentEntity _clearEditing(DocumentEntity document, dynamic action) { return DocumentEntity(); } DocumentEntity _updateEditing(DocumentEntity document, dynamic action) { return action.document; } final documentListReducer = combineReducers([ TypedReducer(_sortDocuments), TypedReducer(_filterDocumentsByState), TypedReducer(_filterDocuments), TypedReducer( _filterDocumentsByCustom1), TypedReducer( _filterDocumentsByCustom2), TypedReducer(_filterDocumentsByClient), TypedReducer(_startListMultiselect), TypedReducer(_addToListMultiselect), TypedReducer( _removeFromListMultiselect), TypedReducer(_clearListMultiselect), ]); ListUIState _filterDocumentsByClient( ListUIState documentListState, FilterDocumentsByEntity action) { return documentListState.rebuild((b) => b ..filterEntityId = action.entityId ..filterEntityType = action.entityType); } ListUIState _filterDocumentsByCustom1( ListUIState documentListState, FilterDocumentsByCustom1 action) { if (documentListState.custom1Filters.contains(action.value)) { return documentListState .rebuild((b) => b..custom1Filters.remove(action.value)); } else { return documentListState .rebuild((b) => b..custom1Filters.add(action.value)); } } ListUIState _filterDocumentsByCustom2( ListUIState documentListState, FilterDocumentsByCustom2 action) { if (documentListState.custom2Filters.contains(action.value)) { return documentListState .rebuild((b) => b..custom2Filters.remove(action.value)); } else { return documentListState .rebuild((b) => b..custom2Filters.add(action.value)); } } ListUIState _filterDocumentsByState( ListUIState documentListState, FilterDocumentsByState action) { if (documentListState.stateFilters.contains(action.state)) { return documentListState .rebuild((b) => b..stateFilters.remove(action.state)); } else { return documentListState.rebuild((b) => b..stateFilters.add(action.state)); } } ListUIState _filterDocuments( ListUIState documentListState, FilterDocuments action) { return documentListState.rebuild((b) => b ..filter = action.filter ..filterClearedAt = action.filter == null ? DateTime.now().millisecondsSinceEpoch : documentListState.filterClearedAt); } ListUIState _sortDocuments( ListUIState documentListState, SortDocuments action) { return documentListState.rebuild((b) => b ..sortAscending = b.sortField != action.field || !b.sortAscending ..sortField = action.field); } ListUIState _startListMultiselect( ListUIState documentListState, StartDocumentMultiselect action) { return documentListState.rebuild((b) => b..selectedIds = ListBuilder()); } ListUIState _addToListMultiselect( ListUIState documentListState, AddToDocumentMultiselect action) { return documentListState.rebuild((b) => b..selectedIds.add(action.entity.id)); } ListUIState _removeFromListMultiselect( ListUIState documentListState, RemoveFromDocumentMultiselect action) { return documentListState .rebuild((b) => b..selectedIds.remove(action.entity.id)); } ListUIState _clearListMultiselect( ListUIState documentListState, ClearDocumentMultiselect action) { return documentListState.rebuild((b) => b..selectedIds = ListBuilder()); } final documentsReducer = combineReducers([ TypedReducer(_updateDocument), TypedReducer(_addDocument), TypedReducer(_setLoadedDocuments), TypedReducer(_setLoadedDocument), TypedReducer(_archiveDocumentRequest), TypedReducer(_archiveDocumentSuccess), TypedReducer(_archiveDocumentFailure), TypedReducer(_deleteDocumentRequest), TypedReducer(_deleteDocumentSuccess), TypedReducer(_deleteDocumentFailure), TypedReducer(_restoreDocumentRequest), TypedReducer(_restoreDocumentSuccess), TypedReducer(_restoreDocumentFailure), ]); DocumentState _archiveDocumentRequest( DocumentState documentState, ArchiveDocumentRequest action) { final document = documentState.map[action.documentId] .rebuild((b) => b..archivedAt = DateTime.now().millisecondsSinceEpoch); return documentState.rebuild((b) => b..map[action.documentId] = document); } DocumentState _archiveDocumentSuccess( DocumentState documentState, ArchiveDocumentSuccess action) { return documentState .rebuild((b) => b..map[action.document.id] = action.document); } DocumentState _archiveDocumentFailure( DocumentState documentState, ArchiveDocumentFailure action) { return documentState .rebuild((b) => b..map[action.document.id] = action.document); } DocumentState _deleteDocumentRequest( DocumentState documentState, DeleteDocumentRequest action) { final document = documentState.map[action.documentId].rebuild((b) => b ..archivedAt = DateTime.now().millisecondsSinceEpoch ..isDeleted = true); return documentState.rebuild((b) => b..map[action.documentId] = document); } DocumentState _deleteDocumentSuccess( DocumentState documentState, DeleteDocumentSuccess action) { return documentState.rebuild((b) => b..map.remove(action.document.id)..list.remove(action.document.id)); } DocumentState _deleteDocumentFailure( DocumentState documentState, DeleteDocumentFailure action) { return documentState .rebuild((b) => b..map[action.document.id] = action.document); } DocumentState _restoreDocumentRequest( DocumentState documentState, RestoreDocumentRequest action) { final document = documentState.map[action.documentId].rebuild((b) => b ..archivedAt = null ..isDeleted = false); return documentState.rebuild((b) => b..map[action.documentId] = document); } DocumentState _restoreDocumentSuccess( DocumentState documentState, RestoreDocumentSuccess action) { return documentState .rebuild((b) => b..map[action.document.id] = action.document); } DocumentState _restoreDocumentFailure( DocumentState documentState, RestoreDocumentFailure action) { return documentState .rebuild((b) => b..map[action.document.id] = action.document); } DocumentState _addDocument( DocumentState documentState, AddDocumentSuccess action) { return documentState.rebuild((b) => b ..map[action.document.id] = action.document ..list.add(action.document.id)); } DocumentState _updateDocument( DocumentState documentState, SaveDocumentSuccess action) { return documentState .rebuild((b) => b..map[action.document.id] = action.document); } DocumentState _setLoadedDocument( DocumentState documentState, LoadDocumentSuccess action) { return documentState .rebuild((b) => b..map[action.document.id] = action.document); } DocumentState _setLoadedDocuments( DocumentState documentState, LoadDocumentsSuccess action) { final state = documentState.rebuild((b) => b ..lastUpdated = DateTime.now().millisecondsSinceEpoch ..map.addAll(Map.fromIterable( action.documents, key: (dynamic item) => item.id, value: (dynamic item) => item, ))); return state.rebuild((b) => b..list.replace(state.map.keys)); }