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 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) => payment.paymentables.map((p) => p.invoiceId).contains(invoiceId) && !payment.isDeleted) .toList(); } var memoizedDropdownPaymentList = memo5(( BuiltMap paymentMap, BuiltList paymentList, BuiltMap invoiceMap, BuiltMap clientMap, BuiltMap userMap, ) => dropdownPaymentsSelector( paymentMap, paymentList, invoiceMap, clientMap, userMap)); List dropdownPaymentsSelector( BuiltMap paymentMap, BuiltList paymentList, BuiltMap invoiceMap, BuiltMap clientMap, BuiltMap userMap, ) { 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); }); return list; } var memoizedFilteredPaymentList = memo8((String filterEntityId, EntityType filterEntityType, BuiltMap paymentMap, BuiltList paymentList, BuiltMap invoiceMap, BuiltMap clientMap, BuiltMap userMap, ListUIState paymentListState) => filteredPaymentsSelector(filterEntityId, filterEntityType, paymentMap, paymentList, invoiceMap, clientMap, userMap, paymentListState)); List filteredPaymentsSelector( String filterEntityId, EntityType filterEntityType, BuiltMap paymentMap, BuiltList paymentList, BuiltMap invoiceMap, BuiltMap clientMap, BuiltMap userMap, ListUIState paymentListState) { final list = paymentList.where((paymentId) { final payment = paymentMap[paymentId]; if (!payment.matchesStates(paymentListState.stateFilters)) { return false; } final client = clientMap[payment.clientId] ?? ClientEntity(id: payment.clientId); 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.matchesFilter(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); }); 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); } bool hasPaymentChanges( PaymentEntity payment, BuiltMap paymentMap) => payment.isNew ? payment.isChanged : payment != paymentMap[payment.id];