// Package imports: import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.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_expense/recurring_expense_actions.dart'; import 'package:invoiceninja_flutter/redux/recurring_expense/recurring_expense_state.dart'; import 'package:invoiceninja_flutter/redux/ui/entity_ui_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; EntityUIState recurringExpenseUIReducer( RecurringExpenseUIState state, dynamic action) { return state.rebuild((b) => b ..listUIState .replace(recurringExpenseListReducer(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), TypedReducer( (completer, action) => false), ]); final int? Function(int, dynamic) 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.recurringExpense ? action.entityId : selectedId), TypedReducer( (String? selectedId, dynamic action) => action.recurringExpenseId), TypedReducer( (String? selectedId, dynamic action) => action.recurringExpense.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.clearSelection ? '' : action.entityType == EntityType.recurringExpense ? action.entityId : selectedId), ]); final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer( (recurringExpenses, action) { return action.recurringExpenses[0]; }), TypedReducer( (recurringExpenses, action) { return action.recurringExpenses[0]; }), TypedReducer( (recurringExpenses, action) { return action.recurringExpenses[0]; }), TypedReducer(_updateEditing), TypedReducer( (recurringExpense, action) { return action.recurringExpense.rebuild((b) => b..isChanged = true); }), TypedReducer(_clearEditing), ]); ExpenseEntity _clearEditing(ExpenseEntity? recurringExpense, dynamic action) { return ExpenseEntity(entityType: EntityType.recurringExpense); } ExpenseEntity? _updateEditing(ExpenseEntity? recurringExpense, dynamic action) { return action.recurringExpense; } final recurringExpenseListReducer = combineReducers([ TypedReducer(_sortRecurringExpenses), TypedReducer( _filterRecurringExpensesByState), TypedReducer( _filterRecurringExpensesByStatus), TypedReducer(_filterRecurringExpenses), TypedReducer( _filterRecurringExpensesByCustom1), TypedReducer( _filterRecurringExpensesByCustom2), TypedReducer( _startListMultiselect), TypedReducer( _addToListMultiselect), TypedReducer( _removeFromListMultiselect), TypedReducer( _clearListMultiselect), TypedReducer( _viewRecurringExpenseList), TypedReducer( (state, action) => state.rebuild((b) => b ..filter = null ..filterClearedAt = DateTime.now().millisecondsSinceEpoch)), ]); ListUIState _viewRecurringExpenseList( ListUIState recurringExpenseListState, ViewRecurringExpenseList action) { return recurringExpenseListState.rebuild((b) => b ..selectedIds = null ..filter = null ..filterClearedAt = DateTime.now().millisecondsSinceEpoch); } ListUIState _filterRecurringExpensesByCustom1( ListUIState recurringExpenseListState, FilterRecurringExpensesByCustom1 action) { if (recurringExpenseListState.custom1Filters.contains(action.value)) { return recurringExpenseListState .rebuild((b) => b..custom1Filters.remove(action.value)); } else { return recurringExpenseListState .rebuild((b) => b..custom1Filters.add(action.value)); } } ListUIState _filterRecurringExpensesByCustom2( ListUIState recurringExpenseListState, FilterRecurringExpensesByCustom2 action) { if (recurringExpenseListState.custom2Filters.contains(action.value)) { return recurringExpenseListState .rebuild((b) => b..custom2Filters.remove(action.value)); } else { return recurringExpenseListState .rebuild((b) => b..custom2Filters.add(action.value)); } } ListUIState _filterRecurringExpensesByState( ListUIState recurringExpenseListState, FilterRecurringExpensesByState action) { if (recurringExpenseListState.stateFilters.contains(action.state)) { return recurringExpenseListState .rebuild((b) => b..stateFilters.remove(action.state)); } else { return recurringExpenseListState .rebuild((b) => b..stateFilters.add(action.state)); } } ListUIState _filterRecurringExpensesByStatus( ListUIState recurringExpenseListState, FilterRecurringExpensesByStatus action) { if (recurringExpenseListState.statusFilters.contains(action.status)) { return recurringExpenseListState .rebuild((b) => b..statusFilters.remove(action.status)); } else { return recurringExpenseListState .rebuild((b) => b..statusFilters.add(action.status)); } } ListUIState _filterRecurringExpenses( ListUIState recurringExpenseListState, FilterRecurringExpenses action) { return recurringExpenseListState.rebuild((b) => b ..filter = action.filter ..filterClearedAt = action.filter == null ? DateTime.now().millisecondsSinceEpoch : recurringExpenseListState.filterClearedAt); } ListUIState _sortRecurringExpenses( ListUIState recurringExpenseListState, SortRecurringExpenses action) { return recurringExpenseListState.rebuild((b) => b ..sortAscending = b.sortField != action.field || !b.sortAscending! ..sortField = action.field); } ListUIState _startListMultiselect( ListUIState productListState, StartRecurringExpenseMultiselect action) { return productListState.rebuild((b) => b..selectedIds = ListBuilder()); } ListUIState _addToListMultiselect( ListUIState productListState, AddToRecurringExpenseMultiselect action) { return productListState.rebuild((b) => b..selectedIds.add(action.entity!.id)); } ListUIState _removeFromListMultiselect(ListUIState productListState, RemoveFromRecurringExpenseMultiselect action) { return productListState .rebuild((b) => b..selectedIds.remove(action.entity!.id)); } ListUIState _clearListMultiselect( ListUIState productListState, ClearRecurringExpenseMultiselect action) { return productListState.rebuild((b) => b..selectedIds = null); } final recurringExpensesReducer = combineReducers([ TypedReducer( _updateRecurringExpense), TypedReducer( _addRecurringExpense), TypedReducer( _setLoadedRecurringExpenses), TypedReducer( _setLoadedRecurringExpense), TypedReducer( _startRecurringExpensesSuccess), TypedReducer( _stopRecurringExpensesSuccess), TypedReducer(_setLoadedCompany), TypedReducer( _archiveRecurringExpenseSuccess), TypedReducer( _deleteRecurringExpenseSuccess), TypedReducer( _restoreRecurringExpenseSuccess), TypedReducer(_purgeClientSuccess), ]); RecurringExpenseState _purgeClientSuccess( RecurringExpenseState expenseState, PurgeClientSuccess action) { final ids = expenseState.map.values .where((each) => each.clientId == action.clientId) .map((each) => each.id) .toList(); return expenseState.rebuild((b) => b ..map.removeWhere((p0, p1) => ids.contains(p0)) ..list.removeWhere((p0) => ids.contains(p0))); } RecurringExpenseState _archiveRecurringExpenseSuccess( RecurringExpenseState recurringExpenseState, ArchiveRecurringExpensesSuccess action) { return recurringExpenseState.rebuild((b) { for (final recurringExpense in action.recurringExpenses) { b.map[recurringExpense.id] = recurringExpense; } }); } RecurringExpenseState _deleteRecurringExpenseSuccess( RecurringExpenseState recurringExpenseState, DeleteRecurringExpensesSuccess action) { return recurringExpenseState.rebuild((b) { for (final recurringExpense in action.recurringExpenses) { b.map[recurringExpense.id] = recurringExpense; } }); } RecurringExpenseState _restoreRecurringExpenseSuccess( RecurringExpenseState recurringExpenseState, RestoreRecurringExpensesSuccess action) { return recurringExpenseState.rebuild((b) { for (final recurringExpense in action.recurringExpenses) { b.map[recurringExpense.id] = recurringExpense; } }); } RecurringExpenseState _addRecurringExpense( RecurringExpenseState recurringExpenseState, AddRecurringExpenseSuccess action) { return recurringExpenseState.rebuild((b) => b ..map[action.recurringExpense.id] = action.recurringExpense .rebuild((b) => b..loadedAt = DateTime.now().millisecondsSinceEpoch) ..list.add(action.recurringExpense.id)); } RecurringExpenseState _updateRecurringExpense( RecurringExpenseState recurringExpenseState, SaveRecurringExpenseSuccess action) { return recurringExpenseState.rebuild((b) => b ..map[action.recurringExpense.id] = action.recurringExpense .rebuild((b) => b..loadedAt = DateTime.now().millisecondsSinceEpoch)); } RecurringExpenseState _startRecurringExpensesSuccess( RecurringExpenseState recurringExpenseState, StartRecurringExpensesSuccess action) { return recurringExpenseState.rebuild((b) { for (final recurringExpense in action.expenses) { b.map[recurringExpense.id] = recurringExpense; } }); } RecurringExpenseState _stopRecurringExpensesSuccess( RecurringExpenseState recurringExpenseState, StopRecurringExpensesSuccess action) { return recurringExpenseState.rebuild((b) { for (final recurringExpense in action.expenses) { b.map[recurringExpense.id] = recurringExpense; } }); } RecurringExpenseState _setLoadedRecurringExpense( RecurringExpenseState recurringExpenseState, LoadRecurringExpenseSuccess action) { return recurringExpenseState.rebuild((b) => b ..map[action.recurringExpense.id] = action.recurringExpense .rebuild((b) => b..loadedAt = DateTime.now().millisecondsSinceEpoch)); } RecurringExpenseState _setLoadedRecurringExpenses( RecurringExpenseState recurringExpenseState, LoadRecurringExpensesSuccess action) => recurringExpenseState.loadRecurringExpenses(action.recurringExpenses); RecurringExpenseState _setLoadedCompany( RecurringExpenseState recurringExpenseState, LoadCompanySuccess action) { final company = action.userCompany.company; return recurringExpenseState.loadRecurringExpenses(company.recurringExpenses); }