refactoring for recipient addition page
This commit is contained in:
@@ -1,14 +1,16 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import 'package:collection/collection.dart';
|
||||
|
||||
import 'package:pshared/models/describable.dart';
|
||||
import 'package:pshared/models/organization/bound.dart';
|
||||
import 'package:pshared/models/payment/methods/data.dart';
|
||||
import 'package:pshared/models/payment/methods/type.dart';
|
||||
import 'package:pshared/models/payment/type.dart';
|
||||
import 'package:pshared/models/permissions/bound.dart';
|
||||
import 'package:pshared/models/recipient/payment_method_draft.dart';
|
||||
import 'package:pshared/models/storable.dart';
|
||||
import 'package:pshared/provider/organizations.dart';
|
||||
import 'package:pshared/provider/recipient/provider.dart';
|
||||
@@ -58,42 +60,49 @@ class RecipientMethodsCacheProvider extends ChangeNotifier {
|
||||
|
||||
Future<void> syncRecipientMethods({
|
||||
required String recipientId,
|
||||
required Map<PaymentType, PaymentMethodData> methods,
|
||||
required List<RecipientMethodDraft> methods,
|
||||
required Map<PaymentType, String> names,
|
||||
}) async {
|
||||
await _ensureLoaded(recipientId);
|
||||
final current = List<PaymentMethod>.from(_methodsByRecipient[recipientId] ?? const []);
|
||||
final currentByType = {for (final method in current) method.type: method};
|
||||
final currentById = {for (final method in current) method.id: method};
|
||||
final desired = methods.where((m) => m.data != null).toList();
|
||||
final desiredExisting = desired.where((m) => m.existing != null).toList();
|
||||
final desiredExistingIds = desiredExisting.map((m) => m.existing!.id).toSet();
|
||||
|
||||
for (final entry in currentByType.entries) {
|
||||
if (!methods.containsKey(entry.key)) {
|
||||
await PaymentMethodService.delete(entry.value);
|
||||
current.removeWhere((method) => method.id == entry.value.id);
|
||||
for (final method in current.toList()) {
|
||||
if (!desiredExistingIds.contains(method.id)) {
|
||||
await PaymentMethodService.delete(method);
|
||||
current.removeWhere((m) => m.id == method.id);
|
||||
}
|
||||
}
|
||||
|
||||
for (final entry in methods.entries) {
|
||||
final type = entry.key;
|
||||
final data = entry.value;
|
||||
final existing = currentByType[type];
|
||||
if (existing != null) {
|
||||
final updated = existing.copyWith(data: data);
|
||||
final updatedList = await PaymentMethodService.update(updated);
|
||||
final updatedMethod = updatedList.firstWhereOrNull((m) => m.id == updated.id) ?? updated;
|
||||
final index = current.indexWhere((m) => m.id == updatedMethod.id);
|
||||
if (index != -1) {
|
||||
current[index] = updatedMethod;
|
||||
}
|
||||
} else {
|
||||
final created = await _createMethod(
|
||||
recipientId: recipientId,
|
||||
data: data,
|
||||
name: names[type] ?? type.name,
|
||||
);
|
||||
current.add(created);
|
||||
for (final entry in desiredExisting) {
|
||||
final existing = entry.existing;
|
||||
final data = entry.data;
|
||||
if (existing == null || data == null) continue;
|
||||
final currentMethod = currentById[existing.id] ?? existing;
|
||||
final updated = currentMethod.copyWith(data: data);
|
||||
final updatedList = await PaymentMethodService.update(updated);
|
||||
final updatedMethod = updatedList.firstWhereOrNull((m) => m.id == updated.id) ?? updated;
|
||||
final index = current.indexWhere((m) => m.id == updatedMethod.id);
|
||||
if (index != -1) {
|
||||
current[index] = updatedMethod;
|
||||
}
|
||||
}
|
||||
|
||||
for (final entry in desired.where((m) => m.existing == null)) {
|
||||
final data = entry.data;
|
||||
if (data == null) continue;
|
||||
final type = entry.type;
|
||||
final created = await _createMethod(
|
||||
recipientId: recipientId,
|
||||
data: data,
|
||||
name: names[type] ?? type.name,
|
||||
);
|
||||
current.add(created);
|
||||
}
|
||||
|
||||
_methodsByRecipient[recipientId] = _sortedMethods(current);
|
||||
notifyListeners();
|
||||
}
|
||||
@@ -143,4 +152,4 @@ class RecipientMethodsCacheProvider extends ChangeNotifier {
|
||||
|
||||
List<PaymentMethod> _sortedMethods(List<PaymentMethod> methods) =>
|
||||
methods.toList()..sort((a, b) => a.storable.createdAt.compareTo(b.storable.createdAt));
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
|
||||
import 'package:pshared/data/mapper/recipient/recipient.dart';
|
||||
import 'package:pshared/models/recipient/filter.dart';
|
||||
import 'package:pshared/models/recipient/recipient.dart';
|
||||
import 'package:pshared/models/recipient/status.dart';
|
||||
import 'package:pshared/models/recipient/type.dart';
|
||||
@@ -11,71 +10,12 @@ import 'package:pshared/service/recipient/service.dart';
|
||||
|
||||
class RecipientsProvider extends GenericProvider<Recipient> {
|
||||
late OrganizationsProvider _organizations;
|
||||
|
||||
RecipientFilter _selectedFilter = RecipientFilter.all;
|
||||
String _query = '';
|
||||
String? _previousRecipientRef;
|
||||
|
||||
RecipientFilter get selectedFilter => _selectedFilter;
|
||||
String get query => _query;
|
||||
String? _organizationRef;
|
||||
|
||||
List<Recipient> get recipients => List<Recipient>.unmodifiable(items.toList()..sort((a, b) => a.storable.createdAt.compareTo(b.storable.createdAt)));
|
||||
|
||||
RecipientsProvider() : super(service: RecipientService.basicService);
|
||||
|
||||
Recipient? get previousRecipient => _previousRecipientRef == null
|
||||
? null
|
||||
: getItemByRef(_previousRecipientRef!);
|
||||
|
||||
List<Recipient> get filteredRecipients {
|
||||
List<Recipient> filtered = recipients.where((r) {
|
||||
switch (_selectedFilter) {
|
||||
case RecipientFilter.ready:
|
||||
return r.status == RecipientStatus.ready;
|
||||
case RecipientFilter.registered:
|
||||
return r.status == RecipientStatus.registered;
|
||||
case RecipientFilter.notRegistered:
|
||||
return r.status == RecipientStatus.notRegistered;
|
||||
case RecipientFilter.all:
|
||||
return true;
|
||||
}
|
||||
}).toList();
|
||||
|
||||
if (_query.isNotEmpty) {
|
||||
filtered = filtered.where((r) => r.matchesQuery(_query)).toList();
|
||||
}
|
||||
|
||||
return filtered;
|
||||
}
|
||||
|
||||
void setFilter(RecipientFilter filter) {
|
||||
_selectedFilter = filter;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void setQuery(String query) {
|
||||
_query = query.trim().toLowerCase();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
@override
|
||||
bool setCurrentObject(String? objectRef) {
|
||||
final currentRef = currentObject?.id;
|
||||
final didUpdate = super.setCurrentObject(objectRef);
|
||||
|
||||
if (didUpdate && currentRef != null && currentRef != objectRef) {
|
||||
_previousRecipientRef = currentRef;
|
||||
}
|
||||
|
||||
return didUpdate;
|
||||
}
|
||||
|
||||
void restorePreviousRecipient() {
|
||||
if (_previousRecipientRef != null) {
|
||||
setCurrentObject(_previousRecipientRef);
|
||||
}
|
||||
}
|
||||
|
||||
Future<Recipient> create({
|
||||
required String name,
|
||||
required String email,
|
||||
@@ -92,8 +32,10 @@ class RecipientsProvider extends GenericProvider<Recipient> {
|
||||
|
||||
void updateProviders(OrganizationsProvider organizations) {
|
||||
_organizations = organizations;
|
||||
if (_organizations.isOrganizationSet) {
|
||||
load(_organizations.current.id, _organizations.current.id);
|
||||
}
|
||||
if (!_organizations.isOrganizationSet) return;
|
||||
final organizationRef = _organizations.current.id;
|
||||
if (_organizationRef == organizationRef) return;
|
||||
_organizationRef = organizationRef;
|
||||
load(organizationRef, organizationRef);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user