import 'package:invoiceninja/data/models/models.dart'; import 'package:invoiceninja/redux/ui/entity_ui_state.dart'; import 'package:invoiceninja/redux/ui/list_ui_state.dart'; import 'package:redux/redux.dart'; import 'package:invoiceninja/redux/client/client_actions.dart'; import 'package:invoiceninja/redux/client/client_state.dart'; EntityUIState clientUIReducer(ClientUIState state, action) { return state.rebuild((b) => b ..listUIState.replace(clientListReducer(state.listUIState, action)) ..editing.replace(editingReducer(state.selected, action)) ); } final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_addContact), TypedReducer(_removeContact), TypedReducer(_updateContact), ]); ClientEntity _updateEditing(ClientEntity client, action) { return action.client; } ClientEntity _addContact(ClientEntity client, AddContact action) { return client.rebuild((b) => b ..contacts.add(ContactEntity()) ); } ClientEntity _removeContact(ClientEntity client, DeleteContact action) { return client.rebuild((b) => b ..contacts.removeAt(action.index) ); } ClientEntity _updateContact(ClientEntity client, UpdateContact action) { return client.rebuild((b) => b ..contacts[action.index] = action.contact ); } final clientListReducer = combineReducers([ TypedReducer(_sortClients), TypedReducer(_filterClientsByState), TypedReducer(_searchClients), ]); ListUIState _filterClientsByState(ListUIState clientListState, FilterClientsByState action) { if (clientListState.stateFilters.contains(action.state)) { return clientListState.rebuild((b) => b ..stateFilters.remove(action.state) ); } else { return clientListState.rebuild((b) => b ..stateFilters.add(action.state) ); } } ListUIState _searchClients(ListUIState clientListState, SearchClients action) { return clientListState.rebuild((b) => b ..search = action.search ); } ListUIState _sortClients(ListUIState clientListState, SortClients action) { return clientListState.rebuild((b) => b ..sortAscending = b.sortField != action.field || ! b.sortAscending ..sortField = action.field ); } final clientsReducer = combineReducers([ TypedReducer(_updateClient), TypedReducer(_addClient), TypedReducer(_setLoadedClients), TypedReducer(_setNoClients), TypedReducer(_archiveClientRequest), TypedReducer(_archiveClientSuccess), TypedReducer(_archiveClientFailure), TypedReducer(_deleteClientRequest), TypedReducer(_deleteClientSuccess), TypedReducer(_deleteClientFailure), TypedReducer(_restoreClientRequest), TypedReducer(_restoreClientSuccess), TypedReducer(_restoreClientFailure), ]); ClientState _archiveClientRequest(ClientState clientState, ArchiveClientRequest action) { var client = clientState.map[action.clientId].rebuild((b) => b ..archivedAt = DateTime.now().millisecondsSinceEpoch ); return clientState.rebuild((b) => b ..map[action.clientId] = client ); } ClientState _archiveClientSuccess(ClientState clientState, ArchiveClientSuccess action) { return clientState.rebuild((b) => b ..map[action.client.id] = action.client ); } ClientState _archiveClientFailure(ClientState clientState, ArchiveClientFailure action) { return clientState.rebuild((b) => b ..map[action.client.id] = action.client ); } ClientState _deleteClientRequest(ClientState clientState, DeleteClientRequest action) { var client = clientState.map[action.clientId].rebuild((b) => b ..archivedAt = DateTime.now().millisecondsSinceEpoch ..isDeleted = true ); return clientState.rebuild((b) => b ..map[action.clientId] = client ); } ClientState _deleteClientSuccess(ClientState clientState, DeleteClientSuccess action) { return clientState.rebuild((b) => b ..map[action.client.id] = action.client ); } ClientState _deleteClientFailure(ClientState clientState, DeleteClientFailure action) { return clientState.rebuild((b) => b ..map[action.client.id] = action.client ); } ClientState _restoreClientRequest(ClientState clientState, RestoreClientRequest action) { var client = clientState.map[action.clientId].rebuild((b) => b ..archivedAt = null ..isDeleted = false ); return clientState.rebuild((b) => b ..map[action.clientId] = client ); } ClientState _restoreClientSuccess(ClientState clientState, RestoreClientSuccess action) { return clientState.rebuild((b) => b ..map[action.client.id] = action.client ); } ClientState _restoreClientFailure(ClientState clientState, RestoreClientFailure action) { return clientState.rebuild((b) => b ..map[action.client.id] = action.client ); } ClientState _addClient( ClientState clientState, AddClientSuccess action) { return clientState.rebuild((b) => b ..map[action.client.id] = action.client ..list.add(action.client.id) ); } ClientState _updateClient( ClientState clientState, SaveClientSuccess action) { return clientState.rebuild((b) => b ..map[action.client.id] = action.client ); } ClientState _setNoClients( ClientState clientState, LoadClientsFailure action) { return clientState; } ClientState _setLoadedClients( ClientState clientState, LoadClientsSuccess action) { return clientState.rebuild( (b) => b ..lastUpdated = DateTime.now().millisecondsSinceEpoch ..map.addAll(Map.fromIterable( action.clients, key: (item) => item.id, value: (item) => item, )) ..list.replace(action.clients.map( (client) => client.id).toList()) ); }