import 'package:redux/redux.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/entity_ui_state.dart'; import 'package:invoiceninja_flutter/redux/transaction/transaction_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; import 'package:invoiceninja_flutter/redux/transaction/transaction_state.dart'; EntityUIState transactionUIReducer(TransactionUIState state, dynamic action) { return state.rebuild((b) => b ..listUIState.replace(transactionListReducer(state.listUIState, action)) ..editing.replace(editingReducer(state.editing, action)) ..selectedId = selectedIdReducer(state.selectedId, action) ..forceSelected = forceSelectedReducer(state.forceSelected, action) ..tabIndex = tabIndexReducer(state.tabIndex, 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; }), ]); Reducer selectedIdReducer = combineReducers([ TypedReducer((completer, action) => ''), TypedReducer((completer, action) => ''), TypedReducer((selectedId, action) => action.entityType == EntityType.transaction ? action.entityId : selectedId), TypedReducer( (String selectedId, dynamic action) => action.transactionId), TypedReducer( (String selectedId, dynamic action) => action.transaction.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) => action.clearSelection ? '' : action.entityType == EntityType.transaction ? action.entityId : selectedId), ]); final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer( (transactions, action) { return action.transactions[0]; }), TypedReducer( (transactions, action) { return action.transactions[0]; }), TypedReducer( (transactions, action) { return action.transactions[0]; }), TypedReducer(_updateEditing), TypedReducer((transaction, action) { return action.transaction.rebuild((b) => b..isChanged = true); }), TypedReducer(_clearEditing), ]); TransactionEntity _clearEditing(TransactionEntity transaction, dynamic action) { return TransactionEntity(); } TransactionEntity _updateEditing( TransactionEntity transaction, dynamic action) { return action.transaction; } final transactionListReducer = combineReducers([ TypedReducer(_sortTransactions), TypedReducer( _filterTransactionsByState), TypedReducer( _filterTransactionsByStatus), TypedReducer(_filterTransactions), TypedReducer( _filterTransactionsByCustom1), TypedReducer( _filterTransactionsByCustom2), TypedReducer(_startListMultiselect), TypedReducer(_addToListMultiselect), TypedReducer( _removeFromListMultiselect), TypedReducer(_clearListMultiselect), TypedReducer(_viewTransactionList), ]); ListUIState _viewTransactionList( ListUIState transactionListState, ViewTransactionList action) { return transactionListState.rebuild((b) => b ..selectedIds = null ..filter = null ..filterClearedAt = DateTime.now().millisecondsSinceEpoch); } ListUIState _filterTransactionsByCustom1( ListUIState transactionListState, FilterTransactionsByCustom1 action) { if (transactionListState.custom1Filters.contains(action.value)) { return transactionListState .rebuild((b) => b..custom1Filters.remove(action.value)); } else { return transactionListState .rebuild((b) => b..custom1Filters.add(action.value)); } } ListUIState _filterTransactionsByCustom2( ListUIState transactionListState, FilterTransactionsByCustom2 action) { if (transactionListState.custom2Filters.contains(action.value)) { return transactionListState .rebuild((b) => b..custom2Filters.remove(action.value)); } else { return transactionListState .rebuild((b) => b..custom2Filters.add(action.value)); } } ListUIState _filterTransactionsByState( ListUIState transactionListState, FilterTransactionsByState action) { if (transactionListState.stateFilters.contains(action.state)) { return transactionListState .rebuild((b) => b..stateFilters.remove(action.state)); } else { return transactionListState .rebuild((b) => b..stateFilters.add(action.state)); } } ListUIState _filterTransactionsByStatus( ListUIState transactionListState, FilterTransactionsByStatus action) { if (transactionListState.statusFilters.contains(action.status)) { return transactionListState .rebuild((b) => b..statusFilters.remove(action.status)); } else { return transactionListState .rebuild((b) => b..statusFilters.add(action.status)); } } ListUIState _filterTransactions( ListUIState transactionListState, FilterTransactions action) { return transactionListState.rebuild((b) => b ..filter = action.filter ..filterClearedAt = action.filter == null ? DateTime.now().millisecondsSinceEpoch : transactionListState.filterClearedAt); } ListUIState _sortTransactions( ListUIState transactionListState, SortTransactions action) { return transactionListState.rebuild((b) => b ..sortAscending = b.sortField != action.field || !b.sortAscending ..sortField = action.field); } ListUIState _startListMultiselect( ListUIState productListState, StartTransactionMultiselect action) { return productListState.rebuild((b) => b..selectedIds = ListBuilder()); } ListUIState _addToListMultiselect( ListUIState productListState, AddToTransactionMultiselect action) { return productListState.rebuild((b) => b..selectedIds.add(action.entity.id)); } ListUIState _removeFromListMultiselect( ListUIState productListState, RemoveFromTransactionMultiselect action) { return productListState .rebuild((b) => b..selectedIds.remove(action.entity.id)); } ListUIState _clearListMultiselect( ListUIState productListState, ClearTransactionMultiselect action) { return productListState.rebuild((b) => b..selectedIds = null); } final transactionsReducer = combineReducers([ TypedReducer(_updateTransaction), TypedReducer(_addTransaction), TypedReducer( _setLoadedTransactions), TypedReducer(_setLoadedTransaction), TypedReducer(_setLoadedCompany), TypedReducer( _archiveTransactionSuccess), TypedReducer( _deleteTransactionSuccess), TypedReducer( _restoreTransactionSuccess), ]); TransactionState _archiveTransactionSuccess( TransactionState transactionState, ArchiveTransactionsSuccess action) { return transactionState.rebuild((b) { for (final transaction in action.transactions) { b.map[transaction.id] = transaction; } }); } TransactionState _deleteTransactionSuccess( TransactionState transactionState, DeleteTransactionsSuccess action) { return transactionState.rebuild((b) { for (final transaction in action.transactions) { b.map[transaction.id] = transaction; } }); } TransactionState _restoreTransactionSuccess( TransactionState transactionState, RestoreTransactionsSuccess action) { return transactionState.rebuild((b) { for (final transaction in action.transactions) { b.map[transaction.id] = transaction; } }); } TransactionState _addTransaction( TransactionState transactionState, AddTransactionSuccess action) { return transactionState.rebuild((b) => b ..map[action.transaction.id] = action.transaction ..list.add(action.transaction.id)); } TransactionState _updateTransaction( TransactionState transactionState, SaveTransactionSuccess action) { return transactionState .rebuild((b) => b..map[action.transaction.id] = action.transaction); } TransactionState _setLoadedTransaction( TransactionState transactionState, LoadTransactionSuccess action) { return transactionState .rebuild((b) => b..map[action.transaction.id] = action.transaction); } TransactionState _setLoadedTransactions( TransactionState transactionState, LoadTransactionsSuccess action) => transactionState.loadTransactions(action.transactions); TransactionState _setLoadedCompany( TransactionState transactionState, LoadCompanySuccess action) { final company = action.userCompany.company; return transactionState.loadTransactions(company.transactions); }