import 'package:redux/redux.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.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/stub/stub_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; import 'package:invoiceninja_flutter/redux/stub/stub_state.dart'; EntityUIState stubUIReducer(StubUIState state, dynamic action) { return state.rebuild((b) => b ..listUIState.replace(stubListReducer(state.listUIState, action)) ..editing.replace(editingReducer(state.editing, 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), TypedReducer((completer, action) => false), ]); final tabIndexReducer = combineReducers([ TypedReducer((completer, action) { return action.tabIndex; }), TypedReducer((completer, action) { return 0; }), ]); Reducer selectedIdReducer = combineReducers([ TypedReducer((completer, action) => ''), TypedReducer((completer, action) => ''), TypedReducer((selectedId, action) => action.entityType == EntityType.stub ? action.entityId : selectedId), TypedReducer( (String selectedId, dynamic action) => action.stubId), TypedReducer( (String selectedId, dynamic action) => action.stub.id), TypedReducer((selectedId, action) => action.clearSelection ? '' : selectedId), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => action .clearSelection ? '' : action.entityType == EntityType.stub ? action.entityId : selectedId), ]); final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer((stubs, action) { return action.stubs[0]; }), TypedReducer((stubs, action) { return action.stubs[0]; }), TypedReducer((stubs, action) { return action.stubs[0]; }), TypedReducer(_updateEditing), TypedReducer((stub, action) { return action.stub.rebuild((b) => b..isChanged = true); }), TypedReducer(_clearEditing), ]); StubEntity _clearEditing(StubEntity stub, dynamic action) { return StubEntity(); } StubEntity _updateEditing(StubEntity stub, dynamic action) { return action.stub; } final stubListReducer = combineReducers([ TypedReducer(_sortStubs), TypedReducer(_filterStubsByState), TypedReducer(_filterStubs), TypedReducer(_filterStubsByCustom1), TypedReducer(_filterStubsByCustom2), TypedReducer(_startListMultiselect), TypedReducer(_addToListMultiselect), TypedReducer( _removeFromListMultiselect), TypedReducer(_clearListMultiselect), TypedReducer(_viewStubList), TypedReducer( (state, action) => state.rebuild((b) => b ..filter = null ..filterClearedAt = DateTime.now().millisecondsSinceEpoch)), ]); ListUIState _viewStubList( ListUIState stubListState, ViewStubList action) { return stubListState.rebuild((b) => b ..selectedIds = null ..filter = null ..filterClearedAt = DateTime.now().millisecondsSinceEpoch); } ListUIState _filterStubsByCustom1( ListUIState stubListState, FilterStubsByCustom1 action) { if (stubListState.custom1Filters.contains(action.value)) { return stubListState .rebuild((b) => b..custom1Filters.remove(action.value)); } else { return stubListState.rebuild((b) => b..custom1Filters.add(action.value)); } } ListUIState _filterStubsByCustom2( ListUIState stubListState, FilterStubsByCustom2 action) { if (stubListState.custom2Filters.contains(action.value)) { return stubListState .rebuild((b) => b..custom2Filters.remove(action.value)); } else { return stubListState.rebuild((b) => b..custom2Filters.add(action.value)); } } ListUIState _filterStubsByState( ListUIState stubListState, FilterStubsByState action) { if (stubListState.stateFilters.contains(action.state)) { return stubListState.rebuild((b) => b..stateFilters.remove(action.state)); } else { return stubListState.rebuild((b) => b..stateFilters.add(action.state)); } } ListUIState _filterStubs(ListUIState stubListState, FilterStubs action) { return stubListState.rebuild((b) => b..filter = action.filter ..filterClearedAt = action.filter == null ? DateTime.now().millisecondsSinceEpoch : stubListState.filterClearedAt); } ListUIState _sortStubs(ListUIState stubListState, SortStubs action) { return stubListState.rebuild((b) => b ..sortAscending = b.sortField != action.field || !b.sortAscending ..sortField = action.field); } ListUIState _startListMultiselect( ListUIState productListState, StartStubMultiselect action) { return productListState.rebuild((b) => b..selectedIds = ListBuilder()); } ListUIState _addToListMultiselect( ListUIState productListState, AddToStubMultiselect action) { return productListState .rebuild((b) => b..selectedIds.add(action.entity.id)); } ListUIState _removeFromListMultiselect( ListUIState productListState, RemoveFromStubMultiselect action) { return productListState .rebuild((b) => b..selectedIds.remove(action.entity.id)); } ListUIState _clearListMultiselect( ListUIState productListState, ClearStubMultiselect action) { return productListState.rebuild((b) => b..selectedIds = null); } final stubsReducer = combineReducers([ TypedReducer(_updateStub), TypedReducer(_addStub), TypedReducer(_setLoadedStubs), TypedReducer(_setLoadedStub), TypedReducer(_setLoadedCompany), TypedReducer(_archiveStubSuccess), TypedReducer(_deleteStubSuccess), TypedReducer(_restoreStubSuccess), ]); StubState _archiveStubSuccess( StubState stubState, ArchiveStubsSuccess action) { return stubState.rebuild((b) { for (final stub in action.stubs) { b.map[stub.id] = stub; } }); } StubState _deleteStubSuccess( StubState stubState, DeleteStubsSuccess action) { return stubState.rebuild((b) { for (final stub in action.stubs) { b.map[stub.id] = stub; } }); } StubState _restoreStubSuccess( StubState stubState, RestoreStubsSuccess action) { return stubState.rebuild((b) { for (final stub in action.stubs) { b.map[stub.id] = stub; } }); } StubState _addStub(StubState stubState, AddStubSuccess action) { return stubState.rebuild((b) => b ..map[action.stub.id] = action.stub ..list.add(action.stub.id)); } StubState _updateStub(StubState stubState, SaveStubSuccess action) { return stubState.rebuild((b) => b ..map[action.stub.id] = action.stub); } StubState _setLoadedStub( StubState stubState, LoadStubSuccess action) { return stubState.rebuild((b) => b ..map[action.stub.id] = action.stub); } StubState _setLoadedStubs( StubState stubState, LoadStubsSuccess action) => stubState.loadStubs(action.stubs); StubState _setLoadedCompany( StubState stubState, LoadCompanySuccess action) { final company = action.userCompany.company; return stubState.loadStubs(company.stubs); }