import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/group_model.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/group/group_actions.dart'; import 'package:invoiceninja_flutter/redux/group/group_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 groupUIReducer(GroupUIState state, dynamic action) { return state.rebuild((b) => b ..listUIState.replace(groupListReducer(state.listUIState, action)) ..editing.replace(editingReducer(state.editing, action)) ..selectedId = selectedIdReducer(state.selectedId, action) ..forceSelected = forceSelectedReducer(state.forceSelected, action)); } final forceSelectedReducer = combineReducers([ TypedReducer((completer, action) => true), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), TypedReducer((completer, action) => false), ]); Reducer selectedIdReducer = combineReducers([ TypedReducer((selectedId, action) => action.entityType == EntityType.group ? action.entityId : selectedId), TypedReducer( (String selectedId, action) => action.groupId), TypedReducer( (String selectedId, action) => action.group.id), TypedReducer( (selectedId, action) => action.clearSelection ? '' : selectedId), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => action.entityType == EntityType.group ? '' : selectedId), TypedReducer( (selectedId, action) => action.clearSelection ? '' : action.entityType == EntityType.group ? action.entityId : selectedId), ]); final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer((groups, action) { return action.groups[0]; }), TypedReducer((groups, action) { return action.groups[0]; }), TypedReducer((groups, action) { return action.groups[0]; }), TypedReducer(_updateEditing), TypedReducer((group, action) { return action.group.rebuild((b) => b..isChanged = true); }), TypedReducer(_clearEditing), ]); GroupEntity _clearEditing(GroupEntity group, dynamic action) { return GroupEntity(); } GroupEntity _updateEditing(GroupEntity group, dynamic action) { return action.group; } final groupListReducer = combineReducers([ TypedReducer(_sortGroups), TypedReducer(_filterGroupsByState), TypedReducer(_filterGroups), TypedReducer(_filterGroupsByCustom1), TypedReducer(_filterGroupsByCustom2), TypedReducer(_startListMultiselect), TypedReducer(_addToListMultiselect), TypedReducer( _removeFromListMultiselect), TypedReducer(_clearListMultiselect), TypedReducer(_viewGroupList), ]); ListUIState _viewGroupList(ListUIState groupListState, ViewGroupList action) { return groupListState.rebuild((b) => b ..filter = null ..filterClearedAt = DateTime.now().millisecondsSinceEpoch); } ListUIState _filterGroupsByCustom1( ListUIState groupListState, FilterGroupsByCustom1 action) { if (groupListState.custom1Filters.contains(action.value)) { return groupListState .rebuild((b) => b..custom1Filters.remove(action.value)); } else { return groupListState.rebuild((b) => b..custom1Filters.add(action.value)); } } ListUIState _filterGroupsByCustom2( ListUIState groupListState, FilterGroupsByCustom2 action) { if (groupListState.custom2Filters.contains(action.value)) { return groupListState .rebuild((b) => b..custom2Filters.remove(action.value)); } else { return groupListState.rebuild((b) => b..custom2Filters.add(action.value)); } } ListUIState _filterGroupsByState( ListUIState groupListState, FilterGroupsByState action) { if (groupListState.stateFilters.contains(action.state)) { return groupListState.rebuild((b) => b..stateFilters.remove(action.state)); } else { return groupListState.rebuild((b) => b..stateFilters.add(action.state)); } } ListUIState _filterGroups(ListUIState groupListState, FilterGroups action) { return groupListState.rebuild((b) => b ..filter = action.filter ..filterClearedAt = action.filter == null ? DateTime.now().millisecondsSinceEpoch : groupListState.filterClearedAt); } ListUIState _sortGroups(ListUIState groupListState, SortGroups action) { return groupListState.rebuild((b) => b ..sortAscending = b.sortField != action.field || !b.sortAscending ..sortField = action.field); } ListUIState _startListMultiselect( ListUIState groupListState, StartGroupMultiselect action) { return groupListState.rebuild((b) => b..selectedIds = ListBuilder()); } ListUIState _addToListMultiselect( ListUIState groupListState, AddToGroupMultiselect action) { return groupListState.rebuild((b) => b..selectedIds.add(action.entity.id)); } ListUIState _removeFromListMultiselect( ListUIState groupListState, RemoveFromGroupMultiselect action) { return groupListState.rebuild((b) => b..selectedIds.remove(action.entity.id)); } ListUIState _clearListMultiselect( ListUIState groupListState, ClearGroupMultiselect action) { return groupListState.rebuild((b) => b..selectedIds = null); } final groupsReducer = combineReducers([ TypedReducer(_updateGroup), TypedReducer(_addGroup), TypedReducer(_setLoadedGroups), TypedReducer(_setLoadedGroup), TypedReducer(_setLoadedCompany), TypedReducer(_archiveGroupSuccess), TypedReducer(_deleteGroupSuccess), TypedReducer(_restoreGroupSuccess), ]); GroupState _archiveGroupSuccess( GroupState groupState, ArchiveGroupSuccess action) { return groupState.rebuild((b) { for (final group in action.groups) { b.map[group.id] = group; } }); } GroupState _deleteGroupSuccess( GroupState groupState, DeleteGroupSuccess action) { return groupState.rebuild((b) { for (final group in action.groups) { b.map[group.id] = group; } }); } GroupState _restoreGroupSuccess( GroupState groupState, RestoreGroupSuccess action) { return groupState.rebuild((b) { for (final group in action.groups) { b.map[group.id] = group; } }); } GroupState _addGroup(GroupState groupState, AddGroupSuccess action) { return groupState.rebuild((b) => b ..map[action.group.id] = action.group ..list.add(action.group.id)); } GroupState _updateGroup(GroupState groupState, SaveGroupSuccess action) { return groupState.rebuild((b) => b..map[action.group.id] = action.group); } GroupState _setLoadedGroup(GroupState groupState, LoadGroupSuccess action) { return groupState.rebuild((b) => b..map[action.group.id] = action.group); } GroupState _setLoadedGroups(GroupState groupState, LoadGroupsSuccess action) { final state = groupState.rebuild((b) => b ..map.addAll(Map.fromIterable( action.groups, key: (dynamic item) => item.id, value: (dynamic item) => item, ))); return state.rebuild((b) => b..list.replace(state.map.keys)); } GroupState _setLoadedCompany(GroupState groupState, LoadCompanySuccess action) { final state = groupState.rebuild((b) => b ..map.addAll(Map.fromIterable( action.userCompany.company.groups, key: (dynamic item) => item.id, value: (dynamic item) => item, ))); return state.rebuild((b) => b..list.replace(state.map.keys)); }