import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/invoice_model.dart'; 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/credit/credit_actions.dart'; import 'package:invoiceninja_flutter/redux/credit/credit_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 creditUIReducer(CreditUIState state, dynamic action) { return state.rebuild((b) => b ..listUIState.replace(creditListReducer(state.listUIState, action)) ..editing.replace(editingReducer(state.editing, action)) ..editingItemIndex = editingItemReducer(state.editingItemIndex, action) ..selectedId = selectedIdReducer(state.selectedId, action) ..tabIndex = tabIndexReducer(state.tabIndex, action) ..historyActivityId = historyActivityIdReducer(state.historyActivityId, action)); } final tabIndexReducer = combineReducers([ TypedReducer((completer, action) { return action.tabIndex; }), TypedReducer((completer, action) { return 0; }), ]); final historyActivityIdReducer = combineReducers([ TypedReducer((index, action) => action.activityId), ]); final editingItemReducer = combineReducers([ TypedReducer((index, action) => action.creditItemIndex), TypedReducer((index, action) => action.creditItemIndex), ]); Reducer dropdownFilterReducer = combineReducers([ TypedReducer(filtercreditDropdownReducer), ]); String filtercreditDropdownReducer( String dropdownFilter, FilterCreditDropdown action) { return action.filter; } Reducer selectedIdReducer = combineReducers([ TypedReducer((selectedId, action) => action.entityType == EntityType.credit ? action.entityId : selectedId), TypedReducer((selectedId, action) => action.creditId), TypedReducer( (selectedId, action) => action.credit.id), TypedReducer( (selectedId, action) => action.credit.id), TypedReducer((selectedId, action) => action.credit.id), TypedReducer( (selectedId, action) => action.clearSelection ? '' : selectedId), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => action.entityType == EntityType.credit ? '' : selectedId), TypedReducer( (selectedId, action) => action.clearSelection ? '' : action.entityType == EntityType.credit ? action.entityId : selectedId), ]); final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer((credit, action) { return action.credit.rebuild((b) => b..isChanged = true); }), TypedReducer((invoice, action) { return invoice.rebuild((b) => b..isChanged = true); }), TypedReducer((invoice, action) { return invoice.moveLineItem(action.oldIndex, action.newIndex); }), TypedReducer((invoice, action) { return invoice.rebuild((b) => b..isChanged = true); }), TypedReducer((invoice, action) { return invoice.rebuild((b) => b..isChanged = true); }), TypedReducer((credit, action) { final client = action.client; return credit.rebuild((b) => b ..isChanged = true ..clientId = client?.id ?? '' ..invitations.replace((client?.contacts ?? []) .where((contact) => contact.sendEmail) .map((contact) => InvitationEntity(contactId: contact.id)) .toList())); }), TypedReducer((credits, action) { return action.credits[0]; }), TypedReducer((credits, action) { return action.credits[0]; }), TypedReducer((credits, action) { return action.credits[0]; }), TypedReducer(_addCreditItem), TypedReducer(_addCreditItems), TypedReducer(_removeCreditItem), TypedReducer(_updateCreditItem), TypedReducer(_clearEditing), TypedReducer((invoice, action) { return invoice.rebuild((b) => b ..invitations.add( action.invitation ?? InvitationEntity(contactId: action.contact.id))); }), TypedReducer((invoice, action) { return invoice.rebuild((b) => b..invitations.remove(action.invitation)); }), ]); InvoiceEntity _clearEditing(InvoiceEntity credit, dynamic action) { return InvoiceEntity(); } InvoiceEntity _updateEditing(InvoiceEntity credit, dynamic action) { return action.credit; } InvoiceEntity _addCreditItem(InvoiceEntity credit, AddCreditItem action) { return credit.rebuild( (b) => b..lineItems.add(action.creditItem ?? InvoiceItemEntity())); } InvoiceEntity _addCreditItems(InvoiceEntity credit, AddCreditItems action) { return credit.rebuild((b) => b..lineItems.addAll(action.creditItems)); } InvoiceEntity _removeCreditItem(InvoiceEntity credit, DeleteCreditItem action) { if (credit.lineItems.length <= action.index) { return credit; } return credit.rebuild((b) => b..lineItems.removeAt(action.index)); } InvoiceEntity _updateCreditItem(InvoiceEntity credit, UpdateCreditItem action) { if (credit.lineItems.length <= action.index) { return credit; } return credit.rebuild((b) => b..lineItems[action.index] = action.creditItem); } final creditListReducer = combineReducers([ TypedReducer(_sortCredits), TypedReducer(_filterCreditsByState), TypedReducer(_filterCreditsByStatus), TypedReducer(_filterCredits), TypedReducer(_filterCreditsByCustom1), TypedReducer(_filterCreditsByCustom2), TypedReducer(_filterCreditsByCustom3), TypedReducer(_filterCreditsByCustom4), TypedReducer(_startListMultiselect), TypedReducer(_addToListMultiselect), TypedReducer( _removeFromListMultiselect), TypedReducer(_clearListMultiselect), TypedReducer(_viewCreditList), ]); ListUIState _viewCreditList( ListUIState creditListState, ViewCreditList action) { return creditListState.rebuild((b) => b ..filter = null ..filterClearedAt = DateTime.now().millisecondsSinceEpoch); } ListUIState _filterCreditsByCustom1( ListUIState creditListState, FilterCreditsByCustom1 action) { if (creditListState.custom1Filters.contains(action.value)) { return creditListState .rebuild((b) => b..custom1Filters.remove(action.value)); } else { return creditListState.rebuild((b) => b..custom1Filters.add(action.value)); } } ListUIState _filterCreditsByCustom2( ListUIState creditListState, FilterCreditsByCustom2 action) { if (creditListState.custom2Filters.contains(action.value)) { return creditListState .rebuild((b) => b..custom2Filters.remove(action.value)); } else { return creditListState.rebuild((b) => b..custom2Filters.add(action.value)); } } ListUIState _filterCreditsByCustom3( ListUIState creditListState, FilterCreditsByCustom3 action) { if (creditListState.custom3Filters.contains(action.value)) { return creditListState .rebuild((b) => b..custom3Filters.remove(action.value)); } else { return creditListState.rebuild((b) => b..custom3Filters.add(action.value)); } } ListUIState _filterCreditsByCustom4( ListUIState creditListState, FilterCreditsByCustom4 action) { if (creditListState.custom4Filters.contains(action.value)) { return creditListState .rebuild((b) => b..custom4Filters.remove(action.value)); } else { return creditListState.rebuild((b) => b..custom4Filters.add(action.value)); } } ListUIState _filterCreditsByState( ListUIState creditListState, FilterCreditsByState action) { if (creditListState.stateFilters.contains(action.state)) { return creditListState.rebuild((b) => b..stateFilters.remove(action.state)); } else { return creditListState.rebuild((b) => b..stateFilters.add(action.state)); } } ListUIState _filterCreditsByStatus( ListUIState creditListState, FilterCreditsByStatus action) { if (creditListState.statusFilters.contains(action.status)) { return creditListState .rebuild((b) => b..statusFilters.remove(action.status)); } else { return creditListState.rebuild((b) => b..statusFilters.add(action.status)); } } ListUIState _filterCredits(ListUIState creditListState, FilterCredits action) { return creditListState.rebuild((b) => b ..filter = action.filter ..filterClearedAt = action.filter == null ? DateTime.now().millisecondsSinceEpoch : creditListState.filterClearedAt); } ListUIState _sortCredits(ListUIState creditListState, SortCredits action) { return creditListState.rebuild((b) => b ..sortAscending = b.sortField != action.field || !b.sortAscending ..sortField = action.field); } ListUIState _startListMultiselect( ListUIState creditListState, StartCreditMultiselect action) { return creditListState.rebuild((b) => b..selectedIds = ListBuilder()); } ListUIState _addToListMultiselect( ListUIState creditListState, AddToCreditMultiselect action) { return creditListState.rebuild((b) => b..selectedIds.add(action.entity.id)); } ListUIState _removeFromListMultiselect( ListUIState creditListState, RemoveFromCreditMultiselect action) { return creditListState .rebuild((b) => b..selectedIds.remove(action.entity.id)); } ListUIState _clearListMultiselect( ListUIState creditListState, ClearCreditMultiselect action) { return creditListState.rebuild((b) => b..selectedIds = null); } final creditsReducer = combineReducers([ TypedReducer(_updateCredit), TypedReducer(_addCredit), TypedReducer(_setLoadedCredits), TypedReducer(_setLoadedCompany), TypedReducer(_updateCredit), TypedReducer(_markSentCreditSuccess), TypedReducer(_archiveCreditSuccess), TypedReducer(_deleteCreditSuccess), TypedReducer(_restoreCreditSuccess), ]); CreditState _markSentCreditSuccess( CreditState creditState, MarkSentCreditSuccess action) { final creditMap = Map.fromIterable( action.credits, key: (dynamic item) => item.id, value: (dynamic item) => item, ); return creditState.rebuild((b) => b..map.addAll(creditMap)); } CreditState _archiveCreditSuccess( CreditState creditState, ArchiveCreditsSuccess action) { return creditState.rebuild((b) { for (final credit in action.credits) { b.map[credit.id] = credit; } }); } CreditState _deleteCreditSuccess( CreditState creditState, DeleteCreditsSuccess action) { return creditState.rebuild((b) { for (final credit in action.credits) { b.map[credit.id] = credit; } }); } CreditState _restoreCreditSuccess( CreditState creditState, RestoreCreditsSuccess action) { return creditState.rebuild((b) { for (final credit in action.credits) { b.map[credit.id] = credit; } }); } CreditState _addCredit(CreditState creditState, AddCreditSuccess action) { return creditState.rebuild((b) => b ..map[action.credit.id] = action.credit ..list.add(action.credit.id)); } CreditState _updateCredit(CreditState invoiceState, dynamic action) { final InvoiceEntity credit = action.credit; return invoiceState.rebuild((b) => b ..map[credit.id] = credit .rebuild((b) => b..loadedAt = DateTime.now().millisecondsSinceEpoch)); } CreditState _setLoadedCredits( CreditState creditState, LoadCreditsSuccess action) => creditState.loadCredits(action.credits); CreditState _setLoadedCompany( CreditState creditState, LoadCompanySuccess action) { final company = action.userCompany.company; return creditState.loadCredits(company.credits); }