// Package imports: import 'package:built_collection/built_collection.dart'; import 'package:redux/redux.dart'; // Project imports: import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/recurring_invoice/recurring_invoice_actions.dart'; import 'package:invoiceninja_flutter/redux/recurring_invoice/recurring_invoice_state.dart'; import 'package:invoiceninja_flutter/redux/ui/entity_ui_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; EntityUIState recurringInvoiceUIReducer( RecurringInvoiceUIState state, dynamic action) { return state.rebuild((b) => b ..listUIState .replace(recurringInvoiceListReducer(state.listUIState, action)) ..editing.replace(editingReducer(state.editing, action)) ..editingItemIndex = editingItemIndexReducer(state.editingItemIndex, action) ..selectedId = selectedIdReducer(state.selectedId, action) ..forceSelected = forceSelectedReducer(state.forceSelected, action) ..tabIndex = tabIndexReducer(state.tabIndex, action) ..historyActivityId = historyActivityIdReducer(state.historyActivityId, 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; }), ]); final historyActivityIdReducer = combineReducers([ TypedReducer( (index, action) => action.activityId), ]); final editingItemIndexReducer = combineReducers([ TypedReducer((index, action) => action.itemIndex), TypedReducer( (index, action) => action.itemIndex), ]); Reducer dropdownFilterReducer = combineReducers([ TypedReducer( filterRecurringInvoiceDropdownReducer), ]); String filterRecurringInvoiceDropdownReducer( String dropdownFilter, FilterRecurringInvoiceDropdown action) { return action.filter; } Reducer selectedIdReducer = combineReducers([ TypedReducer( (completer, action) => ''), TypedReducer( (completer, action) => ''), TypedReducer((selectedId, action) => action.entityType == EntityType.recurringInvoice ? action.entityId : selectedId), TypedReducer( (selectedId, action) => action.recurringInvoiceId), TypedReducer( (selectedId, action) => action.recurringInvoice.id), TypedReducer( (selectedId, action) => action.invoice.id), TypedReducer( (selectedId, action) => action.invoice.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) => ''), TypedReducer((selectedId, action) => action.entityType == EntityType.recurringInvoice ? '' : selectedId), TypedReducer( (selectedId, action) => action.clearSelection ? '' : action.entityType == EntityType.recurringInvoice ? action.entityId : selectedId), ]); final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer( (recurringInvoice, action) { return action.recurringInvoice.rebuild((b) => b..isChanged = true); }), TypedReducer( (recurringInvoice, action) { return recurringInvoice.rebuild((b) => b..isChanged = true); }), TypedReducer((invoice, action) { return invoice.moveLineItem(action.oldIndex, action.newIndex); }), TypedReducer( (recurringInvoice, action) { return recurringInvoice.rebuild((b) => b..isChanged = true); }), TypedReducer( (recurringInvoice, action) { return recurringInvoice.rebuild((b) => b..isChanged = true); }), TypedReducer( (recurringInvoice, action) { final client = action.client; return recurringInvoice.rebuild((b) => b ..isChanged = true ..clientId = client?.id ?? '' ..invitations.replace((client?.emailContacts ?? []) .map((contact) => InvitationEntity(clientContactId: contact.id)) .toList())); }), TypedReducer( (recurringInvoices, action) { return action.recurringInvoices[0]; }), TypedReducer( (recurringInvoices, action) { return action.recurringInvoices[0]; }), TypedReducer( (recurringInvoices, action) { return action.recurringInvoices[0]; }), TypedReducer( _addRecurringInvoiceItem), TypedReducer( _addRecurringInvoiceItems), TypedReducer( _removeRecurringInvoiceItem), TypedReducer( _updateRecurringInvoiceItem), TypedReducer(_clearEditing), TypedReducer( (recurringInvoice, action) { return recurringInvoice.rebuild((b) => b ..invitations.add(action.invitation ?? InvitationEntity(clientContactId: action.contact.id))); }), TypedReducer( (recurringInvoice, action) { return recurringInvoice .rebuild((b) => b..invitations.remove(action.invitation)); }), ]); InvoiceEntity _clearEditing(InvoiceEntity recurringInvoice, dynamic action) { return InvoiceEntity(); } InvoiceEntity _updateEditing(InvoiceEntity recurringInvoice, dynamic action) { return action.recurringInvoice; } InvoiceEntity _addRecurringInvoiceItem( InvoiceEntity recurringInvoice, AddRecurringInvoiceItem action) { final item = action.invoiceItem ?? InvoiceItemEntity(); return recurringInvoice.rebuild((b) => b..lineItems.add(item)); } InvoiceEntity _addRecurringInvoiceItems( InvoiceEntity recurringInvoice, AddRecurringInvoiceItems action) { return recurringInvoice.rebuild((b) => b..lineItems.addAll(action.items)); } InvoiceEntity _removeRecurringInvoiceItem( InvoiceEntity recurringInvoice, DeleteRecurringInvoiceItem action) { if (recurringInvoice.lineItems.length <= action.index) { return recurringInvoice; } return recurringInvoice.rebuild((b) => b..lineItems.removeAt(action.index)); } InvoiceEntity _updateRecurringInvoiceItem( InvoiceEntity recurringInvoice, UpdateRecurringInvoiceItem action) { if (recurringInvoice.lineItems.length <= action.index) { return recurringInvoice; } return recurringInvoice .rebuild((b) => b..lineItems[action.index] = action.item); } final recurringInvoiceListReducer = combineReducers([ TypedReducer(_sortRecurringInvoices), TypedReducer( _filterRecurringInvoicesByState), TypedReducer( _filterRecurringInvoicesByStatus), TypedReducer(_filterRecurringInvoices), TypedReducer( _filterRecurringInvoicesByCustom1), TypedReducer( _filterRecurringInvoicesByCustom2), TypedReducer( _filterRecurringInvoicesByCustom3), TypedReducer( _filterRecurringInvoicesByCustom4), TypedReducer( _startListMultiselect), TypedReducer( _addToListMultiselect), TypedReducer( _removeFromListMultiselect), TypedReducer( _clearListMultiselect), ]); ListUIState _filterRecurringInvoicesByCustom1( ListUIState recurringInvoiceListState, FilterRecurringInvoicesByCustom1 action) { if (recurringInvoiceListState.custom1Filters.contains(action.value)) { return recurringInvoiceListState .rebuild((b) => b..custom1Filters.remove(action.value)); } else { return recurringInvoiceListState .rebuild((b) => b..custom1Filters.add(action.value)); } } ListUIState _filterRecurringInvoicesByCustom2( ListUIState recurringInvoiceListState, FilterRecurringInvoicesByCustom2 action) { if (recurringInvoiceListState.custom2Filters.contains(action.value)) { return recurringInvoiceListState .rebuild((b) => b..custom2Filters.remove(action.value)); } else { return recurringInvoiceListState .rebuild((b) => b..custom2Filters.add(action.value)); } } ListUIState _filterRecurringInvoicesByCustom3( ListUIState recurringInvoiceListState, FilterRecurringInvoicesByCustom3 action) { if (recurringInvoiceListState.custom3Filters.contains(action.value)) { return recurringInvoiceListState .rebuild((b) => b..custom3Filters.remove(action.value)); } else { return recurringInvoiceListState .rebuild((b) => b..custom3Filters.add(action.value)); } } ListUIState _filterRecurringInvoicesByCustom4( ListUIState recurringInvoiceListState, FilterRecurringInvoicesByCustom4 action) { if (recurringInvoiceListState.custom4Filters.contains(action.value)) { return recurringInvoiceListState .rebuild((b) => b..custom4Filters.remove(action.value)); } else { return recurringInvoiceListState .rebuild((b) => b..custom4Filters.add(action.value)); } } ListUIState _filterRecurringInvoicesByState( ListUIState recurringInvoiceListState, FilterRecurringInvoicesByState action) { if (recurringInvoiceListState.stateFilters.contains(action.state)) { return recurringInvoiceListState .rebuild((b) => b..stateFilters.remove(action.state)); } else { return recurringInvoiceListState .rebuild((b) => b..stateFilters.add(action.state)); } } ListUIState _filterRecurringInvoicesByStatus( ListUIState recurringInvoiceListState, FilterRecurringInvoicesByStatus action) { if (recurringInvoiceListState.statusFilters.contains(action.status)) { return recurringInvoiceListState .rebuild((b) => b..statusFilters.remove(action.status)); } else { return recurringInvoiceListState .rebuild((b) => b..statusFilters.add(action.status)); } } ListUIState _filterRecurringInvoices( ListUIState recurringInvoiceListState, FilterRecurringInvoices action) { return recurringInvoiceListState.rebuild((b) => b ..filter = action.filter ..filterClearedAt = action.filter == null ? DateTime.now().millisecondsSinceEpoch : recurringInvoiceListState.filterClearedAt); } ListUIState _sortRecurringInvoices( ListUIState recurringInvoiceListState, SortRecurringInvoices action) { return recurringInvoiceListState.rebuild((b) => b ..sortAscending = b.sortField != action.field || !b.sortAscending ..sortField = action.field); } ListUIState _startListMultiselect(ListUIState recurringInvoiceListState, StartRecurringInvoiceMultiselect action) { return recurringInvoiceListState .rebuild((b) => b..selectedIds = ListBuilder()); } ListUIState _addToListMultiselect(ListUIState recurringInvoiceListState, AddToRecurringInvoiceMultiselect action) { return recurringInvoiceListState .rebuild((b) => b..selectedIds.add(action.entity.id)); } ListUIState _removeFromListMultiselect(ListUIState recurringInvoiceListState, RemoveFromRecurringInvoiceMultiselect action) { return recurringInvoiceListState .rebuild((b) => b..selectedIds.remove(action.entity.id)); } ListUIState _clearListMultiselect(ListUIState recurringInvoiceListState, ClearRecurringInvoiceMultiselect action) { return recurringInvoiceListState.rebuild((b) => b..selectedIds = null); } final recurringInvoicesReducer = combineReducers([ TypedReducer( _updateRecurringInvoice), TypedReducer( _addRecurringInvoice), TypedReducer( _setLoadedRecurringInvoices), TypedReducer(_setLoadedCompany), TypedReducer( _updateRecurringInvoice), TypedReducer( _emailRecurringInvoiceSuccess), TypedReducer( _startRecurringInvoicesSuccess), TypedReducer( _stopRecurringInvoicesSuccess), TypedReducer( _archiveRecurringInvoiceSuccess), TypedReducer( _deleteRecurringInvoiceSuccess), TypedReducer( _restoreRecurringInvoiceSuccess), ]); RecurringInvoiceState _archiveRecurringInvoiceSuccess( RecurringInvoiceState recurringInvoiceState, ArchiveRecurringInvoicesSuccess action) { return recurringInvoiceState.rebuild((b) { for (final recurringInvoice in action.recurringInvoices) { b.map[recurringInvoice.id] = recurringInvoice; } }); } RecurringInvoiceState _deleteRecurringInvoiceSuccess( RecurringInvoiceState recurringInvoiceState, DeleteRecurringInvoicesSuccess action) { return recurringInvoiceState.rebuild((b) { for (final recurringInvoice in action.recurringInvoices) { b.map[recurringInvoice.id] = recurringInvoice; } }); } RecurringInvoiceState _emailRecurringInvoiceSuccess( RecurringInvoiceState recurringInvoiceState, EmailRecurringInvoiceSuccess action) { return recurringInvoiceState .rebuild((b) => b..map[action.invoice.id] = action.invoice); } RecurringInvoiceState _restoreRecurringInvoiceSuccess( RecurringInvoiceState recurringInvoiceState, RestoreRecurringInvoicesSuccess action) { return recurringInvoiceState.rebuild((b) { for (final recurringInvoice in action.recurringInvoices) { b.map[recurringInvoice.id] = recurringInvoice; } }); } RecurringInvoiceState _startRecurringInvoicesSuccess( RecurringInvoiceState recurringInvoiceState, StartRecurringInvoicesSuccess action) { return recurringInvoiceState.rebuild((b) { for (final recurringInvoice in action.invoices) { b.map[recurringInvoice.id] = recurringInvoice; } }); } RecurringInvoiceState _stopRecurringInvoicesSuccess( RecurringInvoiceState recurringInvoiceState, StopRecurringInvoicesSuccess action) { return recurringInvoiceState.rebuild((b) { for (final recurringInvoice in action.invoices) { b.map[recurringInvoice.id] = recurringInvoice; } }); } RecurringInvoiceState _addRecurringInvoice( RecurringInvoiceState recurringInvoiceState, AddRecurringInvoiceSuccess action) { return recurringInvoiceState.rebuild((b) => b ..map[action.recurringInvoice.id] = action.recurringInvoice .rebuild((b) => b..loadedAt = DateTime.now().millisecondsSinceEpoch) ..list.add(action.recurringInvoice.id)); } RecurringInvoiceState _updateRecurringInvoice( RecurringInvoiceState recurringInvoiceState, dynamic action) { final InvoiceEntity recurringInvoice = action.recurringInvoice; return recurringInvoiceState.rebuild((b) => b ..map[action.recurringInvoice.id] = recurringInvoice .rebuild((b) => b..loadedAt = DateTime.now().millisecondsSinceEpoch)); } RecurringInvoiceState _setLoadedRecurringInvoices( RecurringInvoiceState recurringInvoiceState, LoadRecurringInvoicesSuccess action) => recurringInvoiceState.loadRecurringInvoices(action.recurringInvoices); RecurringInvoiceState _setLoadedCompany( RecurringInvoiceState recurringInvoiceState, LoadCompanySuccess action) { final company = action.userCompany.company; return recurringInvoiceState.loadRecurringInvoices(company.recurringInvoices); }