import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:redux/redux.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/ui/list_ui_state.dart'; import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart'; import 'package:invoiceninja_flutter/redux/expense/expense_state.dart'; EntityUIState expenseUIReducer(ExpenseUIState state, dynamic action) { return state.rebuild((b) => b ..listUIState.replace(expenseListReducer(state.listUIState, action)) ..editing.replace(editingReducer(state.editing, action)) ..selectedId = selectedIdReducer(state.selectedId, action)); } Reducer selectedIdReducer = combineReducers([ TypedReducer((selectedId, action) => action.expenseId), TypedReducer( (selectedId, action) => action.expense.id), TypedReducer( (selectedId, action) => action.clearSelection ? '' : selectedId), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), TypedReducer((selectedId, action) => ''), ]); final editingReducer = combineReducers([ TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer((expenses, action) { return action.expenses[0]; }), TypedReducer((expenses, action) { return action.expenses[0]; }), TypedReducer((expenses, action) { return action.expenses[0]; }), TypedReducer(_updateEditing), TypedReducer((expense, action) { return action.expense.rebuild((b) => b..isChanged = true); }), TypedReducer(_clearEditing), ]); ExpenseEntity _clearEditing(ExpenseEntity expense, dynamic action) { return ExpenseEntity(); } ExpenseEntity _updateEditing(ExpenseEntity expense, dynamic action) { return action.expense; } final expenseListReducer = combineReducers([ TypedReducer(_sortExpenses), TypedReducer(_filterExpensesByState), TypedReducer(_filterExpensesByStatus), TypedReducer(_filterExpenses), TypedReducer(_filterExpensesByCustom1), TypedReducer(_filterExpensesByCustom2), TypedReducer(_filterExpensesByCustom3), TypedReducer(_filterExpensesByCustom4), TypedReducer(_startListMultiselect), TypedReducer(_addToListMultiselect), TypedReducer( _removeFromListMultiselect), TypedReducer(_clearListMultiselect), ]); ListUIState _filterExpensesByCustom1( ListUIState expenseListState, FilterExpensesByCustom1 action) { if (expenseListState.custom1Filters.contains(action.value)) { return expenseListState .rebuild((b) => b..custom1Filters.remove(action.value)); } else { return expenseListState.rebuild((b) => b..custom1Filters.add(action.value)); } } ListUIState _filterExpensesByCustom2( ListUIState expenseListState, FilterExpensesByCustom2 action) { if (expenseListState.custom2Filters.contains(action.value)) { return expenseListState .rebuild((b) => b..custom2Filters.remove(action.value)); } else { return expenseListState.rebuild((b) => b..custom2Filters.add(action.value)); } } ListUIState _filterExpensesByCustom3( ListUIState expenseListState, FilterExpensesByCustom3 action) { if (expenseListState.custom3Filters.contains(action.value)) { return expenseListState .rebuild((b) => b..custom3Filters.remove(action.value)); } else { return expenseListState.rebuild((b) => b..custom3Filters.add(action.value)); } } ListUIState _filterExpensesByCustom4( ListUIState expenseListState, FilterExpensesByCustom4 action) { if (expenseListState.custom4Filters.contains(action.value)) { return expenseListState .rebuild((b) => b..custom4Filters.remove(action.value)); } else { return expenseListState.rebuild((b) => b..custom4Filters.add(action.value)); } } ListUIState _filterExpensesByState( ListUIState expenseListState, FilterExpensesByState action) { if (expenseListState.stateFilters.contains(action.state)) { return expenseListState .rebuild((b) => b..stateFilters.remove(action.state)); } else { return expenseListState.rebuild((b) => b..stateFilters.add(action.state)); } } ListUIState _filterExpensesByStatus( ListUIState expenseListState, FilterExpensesByStatus action) { if (expenseListState.statusFilters.contains(action.status)) { return expenseListState .rebuild((b) => b..statusFilters.remove(action.status)); } else { return expenseListState.rebuild((b) => b..statusFilters.add(action.status)); } } ListUIState _filterExpenses( ListUIState expenseListState, FilterExpenses action) { return expenseListState.rebuild((b) => b ..filter = action.filter ..filterClearedAt = action.filter == null ? DateTime.now().millisecondsSinceEpoch : expenseListState.filterClearedAt); } ListUIState _sortExpenses(ListUIState expenseListState, SortExpenses action) { return expenseListState.rebuild((b) => b ..sortAscending = b.sortField != action.field || !b.sortAscending ..sortField = action.field); } ListUIState _startListMultiselect( ListUIState expenseListState, StartExpenseMultiselect action) { return expenseListState.rebuild((b) => b..selectedIds = ListBuilder()); } ListUIState _addToListMultiselect( ListUIState expenseListState, AddToExpenseMultiselect action) { return expenseListState.rebuild((b) => b..selectedIds.add(action.entity.id)); } ListUIState _removeFromListMultiselect( ListUIState expenseListState, RemoveFromExpenseMultiselect action) { return expenseListState .rebuild((b) => b..selectedIds.remove(action.entity.id)); } ListUIState _clearListMultiselect( ListUIState expenseListState, ClearExpenseMultiselect action) { return expenseListState.rebuild((b) => b..selectedIds = null); } final expensesReducer = combineReducers([ TypedReducer(_updateExpense), TypedReducer(_addExpense), TypedReducer(_setLoadedExpenses), TypedReducer(_setLoadedCompany), TypedReducer(_setLoadedExpense), TypedReducer(_archiveExpenseRequest), TypedReducer(_archiveExpenseSuccess), TypedReducer(_archiveExpenseFailure), TypedReducer(_deleteExpenseRequest), TypedReducer(_deleteExpenseSuccess), TypedReducer(_deleteExpenseFailure), TypedReducer(_restoreExpenseRequest), TypedReducer(_restoreExpenseSuccess), TypedReducer(_restoreExpenseFailure), ]); ExpenseState _archiveExpenseRequest( ExpenseState expenseState, ArchiveExpenseRequest action) { final expenses = action.expenseIds.map((id) => expenseState.map[id]).toList(); for (int i = 0; i < expenses.length; i++) { expenses[i] = expenses[i] .rebuild((b) => b..archivedAt = DateTime.now().millisecondsSinceEpoch); } return expenseState.rebuild((b) { for (final expense in expenses) { b.map[expense.id] = expense; } }); } ExpenseState _archiveExpenseSuccess( ExpenseState expenseState, ArchiveExpenseSuccess action) { return expenseState.rebuild((b) { for (final expense in action.expenses) { b.map[expense.id] = expense; } }); } ExpenseState _archiveExpenseFailure( ExpenseState expenseState, ArchiveExpenseFailure action) { return expenseState.rebuild((b) { for (final expense in action.expenses) { b.map[expense.id] = expense; } }); } ExpenseState _deleteExpenseRequest( ExpenseState expenseState, DeleteExpenseRequest action) { final expenses = action.expenseIds.map((id) => expenseState.map[id]).toList(); for (int i = 0; i < expenses.length; i++) { expenses[i] = expenses[i].rebuild((b) => b ..archivedAt = DateTime.now().millisecondsSinceEpoch ..isDeleted = true); } return expenseState.rebuild((b) { for (final expense in expenses) { b.map[expense.id] = expense; } }); } ExpenseState _deleteExpenseSuccess( ExpenseState expenseState, DeleteExpenseSuccess action) { return expenseState.rebuild((b) { for (final expense in action.expenses) { b.map[expense.id] = expense; } }); } ExpenseState _deleteExpenseFailure( ExpenseState expenseState, DeleteExpenseFailure action) { return expenseState.rebuild((b) { for (final expense in action.expenses) { b.map[expense.id] = expense; } }); } ExpenseState _restoreExpenseRequest( ExpenseState expenseState, RestoreExpenseRequest action) { final expenses = action.expenseIds.map((id) => expenseState.map[id]).toList(); for (int i = 0; i < expenses.length; i++) { expenses[i] = expenses[i].rebuild((b) => b ..archivedAt = 0 ..isDeleted = false); } return expenseState.rebuild((b) { for (final expense in expenses) { b.map[expense.id] = expense; } }); } ExpenseState _restoreExpenseSuccess( ExpenseState expenseState, RestoreExpenseSuccess action) { return expenseState.rebuild((b) { for (final expense in action.expenses) { b.map[expense.id] = expense; } }); } ExpenseState _restoreExpenseFailure( ExpenseState expenseState, RestoreExpenseFailure action) { return expenseState.rebuild((b) { for (final expense in action.expenses) { b.map[expense.id] = expense; } }); } ExpenseState _addExpense(ExpenseState expenseState, AddExpenseSuccess action) { return expenseState.rebuild((b) => b ..map[action.expense.id] = action.expense ..list.add(action.expense.id)); } ExpenseState _updateExpense( ExpenseState expenseState, SaveExpenseSuccess action) { return expenseState .rebuild((b) => b..map[action.expense.id] = action.expense); } ExpenseState _setLoadedExpense( ExpenseState expenseState, LoadExpenseSuccess action) { return expenseState .rebuild((b) => b..map[action.expense.id] = action.expense); } ExpenseState _setLoadedExpenses( ExpenseState expenseState, LoadExpensesSuccess action) => expenseState.loadExpenses(action.expenses); ExpenseState _setLoadedCompany( ExpenseState expenseState, LoadCompanySuccess action) { final company = action.userCompany.company; return expenseState.loadExpenses(company.expenses); }