Moved all the payment data preparation logic from the paymentFlowProvider to the payment and walletproviders
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter/foundation.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/recipient/recipient.dart';
|
||||
import 'package:pshared/provider/recipient/provider.dart';
|
||||
@@ -11,7 +13,7 @@ class PaymentFlowProvider extends ChangeNotifier {
|
||||
PaymentType _selectedType;
|
||||
PaymentType? _preferredType;
|
||||
PaymentMethodData? _manualPaymentData;
|
||||
MethodMap _availableTypes = {};
|
||||
List<PaymentMethod> _recipientMethods = [];
|
||||
Recipient? _recipient;
|
||||
|
||||
PaymentFlowProvider({
|
||||
@@ -23,15 +25,22 @@ class PaymentFlowProvider extends ChangeNotifier {
|
||||
PaymentType get selectedType => _selectedType;
|
||||
PaymentMethodData? get manualPaymentData => _manualPaymentData;
|
||||
Recipient? get recipient => _recipient;
|
||||
PaymentMethod? get selectedMethod => hasRecipient
|
||||
? _recipientMethods.firstWhereOrNull((method) => method.type == _selectedType)
|
||||
: null;
|
||||
|
||||
bool get hasRecipient => _recipient != null;
|
||||
|
||||
MethodMap get availableTypes => hasRecipient
|
||||
? _availableTypes
|
||||
? _buildAvailableTypes(_recipientMethods)
|
||||
: {for (final type in PaymentType.values) type: null};
|
||||
|
||||
PaymentMethodData? get selectedPaymentData =>
|
||||
hasRecipient ? _availableTypes[_selectedType] : _manualPaymentData;
|
||||
hasRecipient ? selectedMethod?.data : _manualPaymentData;
|
||||
|
||||
List<PaymentMethod> get methodsForRecipient => hasRecipient
|
||||
? List<PaymentMethod>.unmodifiable(_recipientMethods)
|
||||
: const [];
|
||||
|
||||
void update(
|
||||
RecipientsProvider recipientsProvider,
|
||||
@@ -39,12 +48,16 @@ class PaymentFlowProvider extends ChangeNotifier {
|
||||
) =>
|
||||
_applyState(
|
||||
recipient: recipientsProvider.currentObject,
|
||||
availableTypes: methodsProvider.availableTypesForRecipient(recipientsProvider.currentObject),
|
||||
methods: methodsProvider.methodsForRecipient(recipientsProvider.currentObject),
|
||||
preferredType: _preferredType,
|
||||
forceResetManualData: false,
|
||||
);
|
||||
|
||||
void selectType(PaymentType type, {bool resetManualData = false}) {
|
||||
if (hasRecipient && !availableTypes.containsKey(type)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (_selectedType == type && (!resetManualData || _manualPaymentData == null)) {
|
||||
return;
|
||||
}
|
||||
@@ -69,7 +82,7 @@ class PaymentFlowProvider extends ChangeNotifier {
|
||||
_preferredType = preferredType;
|
||||
_applyState(
|
||||
recipient: _recipient,
|
||||
availableTypes: _availableTypes,
|
||||
methods: _recipientMethods,
|
||||
preferredType: _preferredType,
|
||||
forceResetManualData: false,
|
||||
);
|
||||
@@ -101,10 +114,11 @@ class PaymentFlowProvider extends ChangeNotifier {
|
||||
|
||||
void _applyState({
|
||||
required Recipient? recipient,
|
||||
required MethodMap availableTypes,
|
||||
required List<PaymentMethod> methods,
|
||||
required PaymentType? preferredType,
|
||||
required bool forceResetManualData,
|
||||
}) {
|
||||
final availableTypes = _buildAvailableTypes(methods);
|
||||
final resolvedType = _resolveSelectedType(
|
||||
recipient: recipient,
|
||||
availableTypes: availableTypes,
|
||||
@@ -118,8 +132,8 @@ class PaymentFlowProvider extends ChangeNotifier {
|
||||
hasChanges = true;
|
||||
}
|
||||
|
||||
if (!mapEquals(_availableTypes, availableTypes)) {
|
||||
_availableTypes = availableTypes;
|
||||
if (!_hasSameMethods(methods)) {
|
||||
_recipientMethods = methods;
|
||||
hasChanges = true;
|
||||
}
|
||||
|
||||
@@ -135,4 +149,18 @@ class PaymentFlowProvider extends ChangeNotifier {
|
||||
|
||||
if (hasChanges) notifyListeners();
|
||||
}
|
||||
|
||||
MethodMap _buildAvailableTypes(List<PaymentMethod> methods) => {
|
||||
for (final method in methods) method.type: method.data,
|
||||
};
|
||||
|
||||
bool _hasSameMethods(List<PaymentMethod> methods) {
|
||||
if (_recipientMethods.length != methods.length) return false;
|
||||
for (var i = 0; i < methods.length; i++) {
|
||||
final current = _recipientMethods[i];
|
||||
final next = methods[i];
|
||||
if (current.id != next.id || current.updatedAt != next.updatedAt) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:pshared/models/payment/wallet.dart';
|
||||
@@ -38,10 +39,7 @@ class WalletsProvider with ChangeNotifier {
|
||||
throw Exception('update wallet is not implemented');
|
||||
}
|
||||
|
||||
void selectWallet(Wallet wallet) {
|
||||
_selectedWallet = wallet;
|
||||
notifyListeners();
|
||||
}
|
||||
void selectWallet(Wallet wallet) => _setSelectedWallet(wallet);
|
||||
|
||||
Future<void> loadWalletsWithBalances() async {
|
||||
_setResource(_resource.copyWith(isLoading: true, error: null));
|
||||
@@ -98,6 +96,25 @@ class WalletsProvider with ChangeNotifier {
|
||||
|
||||
void _setResource(Resource<List<Wallet>> newResource) {
|
||||
_resource = newResource;
|
||||
_selectedWallet = _resolveSelectedWallet(_selectedWallet, wallets);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Wallet? _resolveSelectedWallet(Wallet? current, List<Wallet> available) {
|
||||
if (available.isEmpty) return null;
|
||||
final currentId = current?.id;
|
||||
if (currentId != null) {
|
||||
final existing = available.firstWhereOrNull((wallet) => wallet.id == currentId);
|
||||
if (existing != null) return existing;
|
||||
}
|
||||
return available.firstWhereOrNull((wallet) => !wallet.isHidden) ?? available.first;
|
||||
}
|
||||
|
||||
void _setSelectedWallet(Wallet wallet) {
|
||||
if (_selectedWallet?.id == wallet.id && _selectedWallet?.isHidden == wallet.isHidden) {
|
||||
return;
|
||||
}
|
||||
_selectedWallet = wallet;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user