import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/invoice_model.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/quote/quote_actions.dart'; import 'package:invoiceninja_flutter/redux/quote/quote_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 quoteUIReducer(QuoteUIState state, dynamic action) { return state.rebuild((b) => b ..listUIState.replace(quoteListReducer(state.listUIState, action)) ..editing.replace(editingReducer(state.editing, action)) ..editingItem.replace(editingItemReducer(state.editingItem, action)) ..selectedId = selectedIdReducer(state.selectedId, action)); } final editingItemReducer = combineReducers([ TypedReducer(editQuoteItem), TypedReducer(editQuoteItem), ]); InvoiceItemEntity editQuoteItem(InvoiceItemEntity quoteItem, dynamic action) { return action.quoteItem ?? InvoiceItemEntity(); } Reducer dropdownFilterReducer = combineReducers([ TypedReducer(filterClientDropdownReducer), ]); String filterClientDropdownReducer( String dropdownFilter, FilterQuoteDropdown action) { return action.filter; } Reducer selectedIdReducer = combineReducers([ TypedReducer( (selectedId, action) => action.quoteId), TypedReducer( (selectedId, action) => action.quote.id), TypedReducer( (selectedId, action) => action.quote.id), ]); final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_addQuoteItem), TypedReducer(_addQuoteItems), TypedReducer(_removeQuoteItem), TypedReducer(_updateQuoteItem), TypedReducer(_clearEditing), ]); InvoiceEntity _clearEditing(InvoiceEntity client, dynamic action) { return InvoiceEntity(); } InvoiceEntity _updateEditing(InvoiceEntity quote, dynamic action) { return action.quote; } InvoiceEntity _addQuoteItem(InvoiceEntity quote, AddQuoteItem action) { return quote.rebuild( (b) => b..invoiceItems.add(action.quoteItem ?? InvoiceItemEntity())); } InvoiceEntity _addQuoteItems(InvoiceEntity quote, AddQuoteItems action) { return quote.rebuild((b) => b..invoiceItems.addAll(action.quoteItems)); } InvoiceEntity _removeQuoteItem(InvoiceEntity quote, DeleteQuoteItem action) { if (quote.invoiceItems.length <= action.index) { return quote; } return quote.rebuild((b) => b..invoiceItems.removeAt(action.index)); } InvoiceEntity _updateQuoteItem(InvoiceEntity quote, UpdateQuoteItem action) { if (quote.invoiceItems.length <= action.index) { return quote; } return quote.rebuild((b) => b..invoiceItems[action.index] = action.quoteItem); } final quoteListReducer = combineReducers([ TypedReducer(_sortQuotes), TypedReducer(_filterQuotesByState), TypedReducer(_filterQuotesByStatus), TypedReducer(_filterQuotesByEntity), TypedReducer(_filterQuotes), TypedReducer(_filterQuotesByCustom1), TypedReducer(_filterQuotesByCustom2), ]); ListUIState _filterQuotesByCustom1( ListUIState quoteListState, FilterQuotesByCustom1 action) { if (quoteListState.custom1Filters.contains(action.value)) { return quoteListState .rebuild((b) => b..custom1Filters.remove(action.value)); } else { return quoteListState.rebuild((b) => b..custom1Filters.add(action.value)); } } ListUIState _filterQuotesByCustom2( ListUIState quoteListState, FilterQuotesByCustom2 action) { if (quoteListState.custom2Filters.contains(action.value)) { return quoteListState .rebuild((b) => b..custom2Filters.remove(action.value)); } else { return quoteListState.rebuild((b) => b..custom2Filters.add(action.value)); } } ListUIState _filterQuotesByState( ListUIState quoteListState, FilterQuotesByState action) { if (quoteListState.stateFilters.contains(action.state)) { return quoteListState.rebuild((b) => b..stateFilters.remove(action.state)); } else { return quoteListState.rebuild((b) => b..stateFilters.add(action.state)); } } ListUIState _filterQuotesByStatus( ListUIState quoteListState, FilterQuotesByStatus action) { if (quoteListState.statusFilters.contains(action.status)) { return quoteListState .rebuild((b) => b..statusFilters.remove(action.status)); } else { return quoteListState.rebuild((b) => b..statusFilters.add(action.status)); } } ListUIState _filterQuotesByEntity( ListUIState quoteListState, FilterQuotesByEntity action) { return quoteListState.rebuild((b) => b ..filterEntityId = action.entityId ..filterEntityType = action.entityType); } ListUIState _filterQuotes(ListUIState quoteListState, FilterQuotes action) { return quoteListState.rebuild((b) => b ..filter = action.filter ..filterClearedAt = action.filter == null ? DateTime.now().millisecondsSinceEpoch : quoteListState.filterClearedAt); } ListUIState _sortQuotes(ListUIState quoteListState, SortQuotes action) { return quoteListState.rebuild((b) => b ..sortAscending = b.sortField != action.field || !b.sortAscending ..sortField = action.field); } final quotesReducer = combineReducers([ TypedReducer(_updateQuote), TypedReducer(_addQuote), TypedReducer(_setLoadedQuotes), TypedReducer(_updateQuote), TypedReducer(_markSentQuoteSuccess), TypedReducer(_archiveQuoteRequest), TypedReducer(_archiveQuoteSuccess), TypedReducer(_archiveQuoteFailure), TypedReducer(_deleteQuoteRequest), TypedReducer(_deleteQuoteSuccess), TypedReducer(_deleteQuoteFailure), TypedReducer(_restoreQuoteRequest), TypedReducer(_restoreQuoteSuccess), TypedReducer(_restoreQuoteFailure), TypedReducer(_convertQuoteSuccess), ]); QuoteState _markSentQuoteSuccess( QuoteState quoteState, MarkSentQuoteSuccess action) { return quoteState.rebuild((b) => b..map[action.quote.id] = action.quote); } QuoteState _archiveQuoteRequest( QuoteState quoteState, ArchiveQuoteRequest action) { final quote = quoteState.map[action.quoteId] .rebuild((b) => b..archivedAt = DateTime.now().millisecondsSinceEpoch); return quoteState.rebuild((b) => b..map[action.quoteId] = quote); } QuoteState _archiveQuoteSuccess( QuoteState quoteState, ArchiveQuoteSuccess action) { return quoteState.rebuild((b) => b..map[action.quote.id] = action.quote); } QuoteState _archiveQuoteFailure( QuoteState quoteState, ArchiveQuoteFailure action) { return quoteState.rebuild((b) => b..map[action.quote.id] = action.quote); } QuoteState _deleteQuoteRequest( QuoteState quoteState, DeleteQuoteRequest action) { if (!quoteState.map.containsKey(action.quoteId)) { return quoteState; } final quote = quoteState.map[action.quoteId].rebuild((b) => b ..archivedAt = DateTime.now().millisecondsSinceEpoch ..isDeleted = true); return quoteState.rebuild((b) => b..map[action.quoteId] = quote); } QuoteState _deleteQuoteSuccess( QuoteState quoteState, DeleteQuoteSuccess action) { if (!quoteState.map.containsKey(action.quote.id)) { return quoteState; } return quoteState.rebuild((b) => b..map[action.quote.id] = action.quote); } QuoteState _deleteQuoteFailure( QuoteState quoteState, DeleteQuoteFailure action) { return quoteState.rebuild((b) => b..map[action.quote.id] = action.quote); } QuoteState _restoreQuoteRequest( QuoteState quoteState, RestoreQuoteRequest action) { final quote = quoteState.map[action.quoteId].rebuild((b) => b ..archivedAt = null ..isDeleted = false); return quoteState.rebuild((b) => b..map[action.quoteId] = quote); } QuoteState _restoreQuoteSuccess( QuoteState quoteState, RestoreQuoteSuccess action) { return quoteState.rebuild((b) => b..map[action.quote.id] = action.quote); } QuoteState _restoreQuoteFailure( QuoteState quoteState, RestoreQuoteFailure action) { return quoteState.rebuild((b) => b..map[action.quote.id] = action.quote); } QuoteState _convertQuoteSuccess( QuoteState quoteState, ConvertQuoteSuccess action) { final quote = action.quote.rebuild((b) => b ..quoteInvoiceId = action.invoice.id ..invoiceStatusId = kInvoiceStatusApproved); return quoteState.rebuild((b) => b..map[action.quote.id] = quote); } QuoteState _addQuote(QuoteState quoteState, AddQuoteSuccess action) { return quoteState.rebuild((b) => b ..map[action.quote.id] = action.quote ..list.add(action.quote.id)); } QuoteState _updateQuote(QuoteState quoteState, dynamic action) { return quoteState.rebuild((b) => b..map[action.quote.id] = action.quote); } QuoteState _setLoadedQuotes(QuoteState quoteState, LoadQuotesSuccess action) { final state = quoteState.rebuild((b) => b ..lastUpdated = DateTime.now().millisecondsSinceEpoch ..map.addAll(Map.fromIterable( action.quotes, key: (dynamic item) => item.id, value: (dynamic item) => item, ))); return state.rebuild((b) => b..list.replace(state.map.keys)); }