import 'package:invoiceninja_flutter/data/models/invoice_model.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:memoize/memoize.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; var memoizedFilteredRecurringInvoiceList = memo6(( SelectionState selectionState, BuiltMap recurringInvoiceMap, BuiltMap clientMap, BuiltList recurringInvoiceList, ListUIState recurringInvoiceListState, BuiltMap userMap, ) => filteredRecurringInvoicesSelector( selectionState, recurringInvoiceMap, clientMap, recurringInvoiceList, recurringInvoiceListState, userMap, )); List filteredRecurringInvoicesSelector( SelectionState selectionState, BuiltMap recurringInvoiceMap, BuiltMap clientMap, BuiltList recurringInvoiceList, ListUIState invoiceListState, BuiltMap userMap, ) { final filterEntityId = selectionState.filterEntityId; final filterEntityType = selectionState.filterEntityType; final list = recurringInvoiceList.where((recurringInvoiceId) { final invoice = recurringInvoiceMap[recurringInvoiceId]; final client = clientMap[invoice.clientId] ?? ClientEntity(id: invoice.clientId); if (invoice.id == selectionState.selectedId) { return true; } if (!client.isActive && !client.matchesEntityFilter(filterEntityType, filterEntityId)) { return false; } if (filterEntityType == EntityType.client && client.id != filterEntityId) { return false; } else if (filterEntityType == EntityType.user && invoice.assignedUserId != filterEntityId) { return false; } else if (filterEntityType == EntityType.subscription && invoice.subscriptionId != filterEntityId) { return false; } else if (filterEntityType == EntityType.design && invoice.designId != filterEntityId) { return false; } else if (filterEntityType == EntityType.group && client.groupId != filterEntityId) { return false; } if (!invoice.matchesStates(invoiceListState.stateFilters)) { return false; } if (!invoice.matchesStatuses(invoiceListState.statusFilters)) { return false; } if (!invoice.matchesFilter(invoiceListState.filter) && !client.displayName .toLowerCase() .contains(invoiceListState.filter.toLowerCase())) { return false; } if (invoiceListState.custom1Filters.isNotEmpty && !invoiceListState.custom1Filters.contains(invoice.customValue1)) { return false; } else if (invoiceListState.custom2Filters.isNotEmpty && !invoiceListState.custom2Filters.contains(invoice.customValue2)) { return false; } else if (invoiceListState.custom3Filters.isNotEmpty && !invoiceListState.custom3Filters.contains(invoice.customValue3)) { return false; } else if (invoiceListState.custom4Filters.isNotEmpty && !invoiceListState.custom4Filters.contains(invoice.customValue4)) { return false; } return true; }).toList(); list.sort((recurringInvoiceAId, recurringInvoiceBId) { final recurringInvoiceA = recurringInvoiceMap[recurringInvoiceAId]; final recurringInvoiceB = recurringInvoiceMap[recurringInvoiceBId]; return recurringInvoiceA.compareTo( invoice: recurringInvoiceB, sortField: invoiceListState.sortField, sortAscending: invoiceListState.sortAscending, clientMap: clientMap, userMap: userMap, ); }); return list; } var memoizedRecurringInvoiceStatsForClient = memo2( (String clientId, BuiltMap invoiceMap) => recurringInvoiceStatsForClient(clientId, invoiceMap)); EntityStats recurringInvoiceStatsForClient( String clientId, BuiltMap invoiceMap) { int countActive = 0; int countArchived = 0; invoiceMap.forEach((invoiceId, invoice) { if (invoice.clientId == clientId) { if (invoice.isActive) { countActive++; } else if (invoice.isArchived) { countArchived++; } } }); return EntityStats(countActive: countActive, countArchived: countArchived); } var memoizedRecurringInvoiceStatsForUser = memo2( (String userId, BuiltMap invoiceMap) => recurringInvoiceStatsForUser(userId, invoiceMap)); EntityStats recurringInvoiceStatsForUser( String userId, BuiltMap invoiceMap) { int countActive = 0; int countArchived = 0; invoiceMap.forEach((invoiceId, invoice) { if (invoice.assignedUserId == userId) { if (invoice.isActive) { countActive++; } else if (invoice.isDeleted) { countArchived++; } } }); return EntityStats(countActive: countActive, countArchived: countArchived); } var memoizedRecurringInvoiceStatsForInvoice = memo2( (String invoiceId, BuiltMap invoiceMap) => recurringInvoiceStatsForInvoice(invoiceId, invoiceMap)); EntityStats recurringInvoiceStatsForInvoice( String recurrinInvoiceId, BuiltMap invoiceMap) { int countActive = 0; int countArchived = 0; invoiceMap.forEach((invoiceId, invoice) { if (invoice.recurringId == recurrinInvoiceId) { if (invoice.isActive) { countActive++; } else if (invoice.isDeleted) { countArchived++; } } }); return EntityStats(countActive: countActive, countArchived: countArchived); } var memoizedRecurringInvoiceStatsForDesign = memo2( (String designId, BuiltMap recurringInvoiceMap) => recurringInvoiceStatsForDesign(designId, recurringInvoiceMap)); EntityStats recurringInvoiceStatsForDesign( String designId, BuiltMap recurringInvoiceMap) { int countActive = 0; int countArchived = 0; recurringInvoiceMap.forEach((invoiceId, invoice) { if (invoice.designId == designId) { if (invoice.isActive) { countActive++; } else if (invoice.isArchived) { countArchived++; } } }); return EntityStats(countActive: countActive, countArchived: countArchived); } var memoizedRecurringInvoiceStatsForSubscription = memo2( (String subscriptionId, BuiltMap invoiceMap) => recurringInvoiceStatsForSubscription(subscriptionId, invoiceMap)); EntityStats recurringInvoiceStatsForSubscription( String subscriptionId, BuiltMap invoiceMap) { int countActive = 0; int countArchived = 0; invoiceMap.forEach((invoiceId, invoice) { if (invoice.subscriptionId == subscriptionId) { if (invoice.isActive) { countActive++; } else if (invoice.isArchived) { countArchived++; } } }); return EntityStats(countActive: countActive, countArchived: countArchived); } bool hasRecurringInvoiceChanges(InvoiceEntity recurringInvoice, BuiltMap recurringInvoiceMap) => recurringInvoice.isNew ? recurringInvoice.isChanged : recurringInvoice != recurringInvoiceMap[recurringInvoice.id];