// Package imports: import 'package:built_collection/built_collection.dart'; import 'package:memoize/memoize.dart'; // Project imports: import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; var memoizedPaymentsByInvoice = memo3((String invoiceId, BuiltMap paymentMap, BuiltList paymentList) => paymentsByInvoiceSelector(invoiceId, paymentMap, paymentList)); List paymentsByInvoiceSelector(String invoiceId, BuiltMap paymentMap, BuiltList paymentList) { return paymentList.map((paymentId) => paymentMap[paymentId]).where((payment) { return payment!.paymentables.map((p) => p.invoiceId).contains(invoiceId) && !payment.isDeleted!; }).toList(); } var memoizedPaymentsByCredit = memo3((String invoiceId, BuiltMap paymentMap, BuiltList paymentList) => paymentsByCreditSelector(invoiceId, paymentMap, paymentList)); List paymentsByCreditSelector(String creditId, BuiltMap paymentMap, BuiltList paymentList) { return paymentList.map((paymentId) => paymentMap[paymentId]).where((payment) { return payment!.paymentables.map((p) => p.creditId).contains(creditId) && !payment.isDeleted!; }).toList(); } var memoizedDropdownPaymentList = memo6(( BuiltMap paymentMap, BuiltList paymentList, BuiltMap invoiceMap, BuiltMap clientMap, BuiltMap userMap, BuiltMap paymentTypeMap, ) => dropdownPaymentsSelector(paymentMap, paymentList, invoiceMap, clientMap, userMap, paymentTypeMap)); List dropdownPaymentsSelector( BuiltMap paymentMap, BuiltList paymentList, BuiltMap invoiceMap, BuiltMap clientMap, BuiltMap userMap, BuiltMap paymentTypeMap, ) { final list = paymentList .where((paymentId) => paymentMap[paymentId]!.isActive) .toList(); list.sort((paymentAId, paymentBId) { final paymentA = paymentMap[paymentAId]!; final paymentB = paymentMap[paymentBId]; return paymentA.compareTo( payment: paymentB, sortAscending: true, sortField: PaymentFields.date, invoiceMap: invoiceMap, clientMap: clientMap, userMap: userMap, paymentTypeMap: paymentTypeMap, ); }); return list; } var memoizedFilteredPaymentList = memo8((SelectionState selectionState, BuiltMap paymentMap, BuiltList paymentList, BuiltMap invoiceMap, BuiltMap clientMap, BuiltMap userMap, BuiltMap paymentTypeMap, ListUIState paymentListState) => filteredPaymentsSelector( selectionState, paymentMap, paymentList, invoiceMap, clientMap, userMap, paymentTypeMap, paymentListState, )); List filteredPaymentsSelector( SelectionState selectionState, BuiltMap paymentMap, BuiltList paymentList, BuiltMap invoiceMap, BuiltMap clientMap, BuiltMap userMap, BuiltMap paymentTypeMap, ListUIState paymentListState) { final filterEntityId = selectionState.filterEntityId; final filterEntityType = selectionState.filterEntityType; final list = paymentList.where((paymentId) { final payment = paymentMap[paymentId]!; if (!payment.matchesStates(paymentListState.stateFilters)) { return false; } if (!payment.matchesStatuses(paymentListState.statusFilters)) { return false; } final client = clientMap[payment.clientId] ?? ClientEntity(id: payment.clientId); if (payment.id == selectionState.selectedId) { return true; } if (!client.isActive && !client.matchesEntityFilter(filterEntityType, filterEntityId)) { return false; } if (filterEntityType == EntityType.client && payment.clientId != filterEntityId) { return false; } else if (filterEntityType == EntityType.invoice) { if (!payment.paymentables .map((p) => p.invoiceId) .contains(filterEntityId)) { return false; } } else if (filterEntityType == EntityType.user && payment.assignedUserId != filterEntityId) { return false; } else if (filterEntityType == EntityType.companyGateway && payment.companyGatewayId != filterEntityId) { return false; } if (!payment.matchesFilter(paymentListState.filter) && !client.matchesNameOrEmail(paymentListState.filter)) { return false; } return true; }).toList(); list.sort((paymentAId, paymentBId) { final paymentA = paymentMap[paymentAId]!; final paymentB = paymentMap[paymentBId]; return paymentA.compareTo( payment: paymentB, sortAscending: paymentListState.sortAscending, sortField: paymentListState.sortField, invoiceMap: invoiceMap, clientMap: clientMap, userMap: userMap, paymentTypeMap: paymentTypeMap, ); }); return list; } var memoizedPaymentStatsForClient = memo3((String clientId, BuiltMap paymentMap, BuiltMap invoiceMap) => paymentStatsForClient(clientId, paymentMap, invoiceMap)); EntityStats paymentStatsForClient( String clientId, BuiltMap paymentMap, BuiltMap invoiceMap) { int countActive = 0; int countArchived = 0; paymentMap.forEach((paymentId, payment) { if (payment.clientId == clientId) { if (payment.isActive) { countActive++; } else if (payment.isArchived) { countArchived++; } } }); return EntityStats(countActive: countActive, countArchived: countArchived); } var memoizedPaymentStatsForUser = memo3((String userId, BuiltMap paymentMap, BuiltMap invoiceMap) => paymentStatsForClient(userId, paymentMap, invoiceMap)); EntityStats paymentStatsForUser( String userId, BuiltMap paymentMap, BuiltMap invoiceMap) { int countActive = 0; int countArchived = 0; paymentMap.forEach((paymentId, payment) { if (payment.assignedUserId == userId) { if (payment.isActive) { countActive++; } else if (payment.isArchived) { countArchived++; } } }); return EntityStats(countActive: countActive, countArchived: countArchived); }