import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/redux/client/client_reducer.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/company/company_state.dart'; import 'package:invoiceninja_flutter/redux/company_gateway/company_gateway_actions.dart'; import 'package:invoiceninja_flutter/redux/credit/credit_actions.dart'; import 'package:invoiceninja_flutter/redux/dashboard/dashboard_actions.dart'; import 'package:invoiceninja_flutter/redux/dashboard/dashboard_reducer.dart'; import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart'; import 'package:invoiceninja_flutter/redux/group/group_actions.dart'; import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart'; import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart'; import 'package:invoiceninja_flutter/redux/project/project_actions.dart'; import 'package:invoiceninja_flutter/redux/quote/quote_actions.dart'; import 'package:invoiceninja_flutter/redux/reports/reports_reducer.dart'; import 'package:invoiceninja_flutter/redux/settings/settings_actions.dart'; import 'package:invoiceninja_flutter/redux/task/task_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_state.dart'; import 'package:invoiceninja_flutter/redux/product/product_reducer.dart'; import 'package:invoiceninja_flutter/redux/invoice/invoice_reducer.dart'; import 'package:invoiceninja_flutter/redux/user/user_actions.dart'; import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart'; import 'package:redux/redux.dart'; import 'package:invoiceninja_flutter/redux/document/document_reducer.dart'; import 'package:invoiceninja_flutter/redux/expense/expense_reducer.dart'; import 'package:invoiceninja_flutter/redux/payment/payment_reducer.dart'; import 'package:invoiceninja_flutter/redux/project/project_reducer.dart'; import 'package:invoiceninja_flutter/redux/quote/quote_reducer.dart'; import 'package:invoiceninja_flutter/redux/task/task_reducer.dart'; import 'package:invoiceninja_flutter/redux/vendor/vendor_reducer.dart'; // STARTER: import - do not remove comment import 'package:invoiceninja_flutter/redux/task_status/task_status_reducer.dart'; import 'package:invoiceninja_flutter/redux/expense_category/expense_category_reducer.dart'; import 'package:invoiceninja_flutter/redux/recurring_invoice/recurring_invoice_reducer.dart'; import 'package:invoiceninja_flutter/redux/webhook/webhook_reducer.dart'; import 'package:invoiceninja_flutter/redux/token/token_reducer.dart'; import 'package:invoiceninja_flutter/redux/payment_term/payment_term_reducer.dart'; import 'package:invoiceninja_flutter/redux/design/design_reducer.dart'; import 'package:invoiceninja_flutter/redux/credit/credit_reducer.dart'; import 'package:invoiceninja_flutter/redux/user/user_reducer.dart'; import 'package:invoiceninja_flutter/redux/tax_rate/tax_rate_reducer.dart'; import 'package:invoiceninja_flutter/redux/company_gateway/company_gateway_reducer.dart'; import 'package:invoiceninja_flutter/redux/group/group_reducer.dart'; UIState uiReducer(UIState state, dynamic action) { if (action is ClearEntityFilter || (action is FilterByEntity && action.entityType == state.filterEntityType && action.entityId == state.filterEntityId)) { state = state.rebuild((b) => b ..filterEntityType = null ..filterEntityId = null); } else if (action is FilterByEntity) { state = state.rebuild((b) => b ..filterEntityType = action.entityType ..filterEntityId = action.entityId); } final currentRoute = currentRouteReducer(state.currentRoute, action); return state.rebuild((b) => b ..filter = filterReducer(state.filter, action) ..filterClearedAt = filterClearedAtReducer(state.filterClearedAt, action) ..filterEntityId = filterEntityIdReducer( state.filterEntityId, state.filterEntityType, action) ..selectedCompanyIndex = selectedCompanyIndexReducer(state.selectedCompanyIndex, action) ..previousRoute = state.currentRoute == currentRoute ? state.previousRoute : state.currentRoute.endsWith('edit') ? state.previousRoute : state.currentRoute ..currentRoute = currentRoute ..previewStack.replace(previewStackReducer(state.previewStack, action)) ..productUIState.replace(productUIReducer(state.productUIState, action)) ..clientUIState.replace(clientUIReducer(state.clientUIState, action)) ..invoiceUIState.replace(invoiceUIReducer(state.invoiceUIState, action)) ..dashboardUIState .replace(dashboardUIReducer(state.dashboardUIState, action)) ..reportsUIState.replace(reportsUIReducer(state.reportsUIState, action)) // STARTER: reducer - do not remove comment ..taskStatusUIState .replace(taskStatusUIReducer(state.taskStatusUIState, action)) ..expenseCategoryUIState .replace(expenseCategoryUIReducer(state.expenseCategoryUIState, action)) ..recurringInvoiceUIState.replace( recurringInvoiceUIReducer(state.recurringInvoiceUIState, action)) ..webhookUIState.replace(webhookUIReducer(state.webhookUIState, action)) ..tokenUIState.replace(tokenUIReducer(state.tokenUIState, action)) ..paymentTermUIState .replace(paymentTermUIReducer(state.paymentTermUIState, action)) ..designUIState.replace(designUIReducer(state.designUIState, action)) ..creditUIState.replace(creditUIReducer(state.creditUIState, action)) ..userUIState.replace(userUIReducer(state.userUIState, action)) ..taxRateUIState.replace(taxRateUIReducer(state.taxRateUIState, action)) ..companyGatewayUIState .replace(companyGatewayUIReducer(state.companyGatewayUIState, action)) ..groupUIState.replace(groupUIReducer(state.groupUIState, action)) ..documentUIState.replace(documentUIReducer(state.documentUIState, action)) ..expenseUIState.replace(expenseUIReducer(state.expenseUIState, action)) ..vendorUIState.replace(vendorUIReducer(state.vendorUIState, action)) ..taskUIState.replace(taskUIReducer(state.taskUIState, action)) ..projectUIState.replace(projectUIReducer(state.projectUIState, action)) ..paymentUIState.replace(paymentUIReducer(state.paymentUIState, action)) ..quoteUIState.replace(quoteUIReducer(state.quoteUIState, action)) ..settingsUIState .replace(settingsUIReducer(state.settingsUIState, action))); } String filterEntityIdReducer( String entityId, EntityType entityType, dynamic action) { if (action is ViewClient && entityType == EntityType.client) { return action.clientId; } else if (action is ViewInvoice && entityType == EntityType.invoice) { return action.invoiceId; } else if (action is ViewPayment && entityType == EntityType.payment) { return action.paymentId; } else if (action is ViewQuote && entityType == EntityType.quote) { return action.quoteId; } else if (action is ViewCredit && entityType == EntityType.credit) { return action.creditId; } else if (action is ViewProject && entityType == EntityType.project) { return action.projectId; } else if (action is ViewTask && entityType == EntityType.task) { return action.taskId; } else if (action is ViewVendor && entityType == EntityType.vendor) { return action.vendorId; } else if (action is ViewExpense && entityType == EntityType.expense) { return action.expenseId; } else if (action is ViewGroup && entityType == EntityType.group) { return action.groupId; } else if (action is ViewCompanyGateway && entityType == EntityType.companyGateway) { return action.companyGatewayId; // TODO add to starter } else if (action is ViewUser && entityType == EntityType.user) { return action.userId; } return entityId; } Reducer filterReducer = combineReducers([ TypedReducer((filter, action) { return action.filter; }), TypedReducer((state, action) { return action.filter; }), ]); Reducer filterClearedAtReducer = combineReducers([ TypedReducer((filterClearedAt, action) { return action.filter == null ? DateTime.now().millisecondsSinceEpoch : filterClearedAt; }), TypedReducer((state, action) { return DateTime.now().millisecondsSinceEpoch; }), ]); Reducer currentRouteReducer = combineReducers([ TypedReducer((currentRoute, action) { return action.route; }), ]); Reducer previousRouteReducer = combineReducers([ TypedReducer((currentRoute, action) { return currentRoute; }), ]); Reducer selectedCompanyIndexReducer = combineReducers([ TypedReducer((selectedCompanyIndex, action) { return action.companyIndex; }), ]); Reducer settingsUIReducer = combineReducers([ TypedReducer((state, action) { return state.rebuild((b) => b ..company.replace(action.company ?? state.company) ..origCompany.replace(action.company ?? state.origCompany) ..group.replace(action.group ?? state.group) ..origGroup.replace(action.group ?? state.origGroup) ..client.replace(action.client ?? state.client) ..origClient.replace(action.client ?? state.origClient) ..user.replace(action.user ?? state.user) ..origUser.replace(action.user ?? state.origUser) ..updatedAt = DateTime.now().millisecondsSinceEpoch ..section = action.section ?? state.section ..tabIndex = action.tabIndex ..isChanged = false ..entityType = action.client != null ? EntityType.client : action.group != null ? EntityType.group : state.entityType); }), TypedReducer((state, action) { return state.rebuild((b) => b ..company.replace(action.company) ..isChanged = true); }), TypedReducer((state, action) { switch (state.entityType) { case EntityType.client: return state.rebuild((b) => b ..client.settings.replace(action.settings) ..isChanged = true); case EntityType.group: return state.rebuild((b) => b ..group.settings.replace(action.settings) ..isChanged = true); default: return state.rebuild((b) => b ..company.settings.replace(action.settings) ..isChanged = true); } }), TypedReducer((state, action) { return state.rebuild((b) => b ..user.replace(action.user) ..isChanged = true); }), TypedReducer((state, action) { return state.rebuild((b) => b ..company.replace(state.origCompany) ..group.replace(state.origGroup) ..client.replace(state.origClient) ..user.replace(state.origUser) ..isChanged = false ..updatedAt = DateTime.now().millisecondsSinceEpoch); }), TypedReducer((state, action) { return state.rebuild((b) => b ..company.replace(action.company) ..origCompany.replace(action.company) ..updatedAt = DateTime.now().millisecondsSinceEpoch ..isChanged = false); }), TypedReducer((state, action) { return state.rebuild((b) => b ..group.replace(action.group) ..origGroup.replace(action.group) ..updatedAt = DateTime.now().millisecondsSinceEpoch ..isChanged = false); }), TypedReducer((state, action) { return state.rebuild((b) => b ..client.replace(action.client) ..origClient.replace(action.client) ..updatedAt = DateTime.now().millisecondsSinceEpoch ..isChanged = false); }), TypedReducer((state, action) { return state.rebuild((b) => b ..user.replace(action.user) ..origUser.replace(action.user) ..isChanged = false); }), TypedReducer((state, action) { return state.rebuild((b) => b ..filter = action.filter ..filterClearedAt = action.filter == null ? DateTime.now().millisecondsSinceEpoch : state.filterClearedAt); }), TypedReducer((state, action) { return state.rebuild((b) => b ..updatedAt = DateTime.now().millisecondsSinceEpoch ..company.replace(state.origCompany) ..entityType = EntityType.company ..isChanged = false); }), TypedReducer((state, action) { return state.rebuild((b) => b..tabIndex = action.tabIndex); }), ]); Reducer> previewStackReducer = combineReducers([ TypedReducer, PreviewEntity>((previewStack, action) { if (action.entityType == null) { return previewStack; } if (previewStack.isNotEmpty && previewStack.last == action.entityType) { return BuiltList([]); } return BuiltList([ ...previewStack.where((entityType) => entityType != action.entityType), action.entityType ]); }), TypedReducer, ClearPreviewStack>( (previewStack, action) { return BuiltList([]); }), TypedReducer, PopPreviewStack>((previewStack, action) { return BuiltList( [...previewStack.sublist(0, previewStack.length - 1)]); }), ]);