Moved payment data preparation into providers

This commit is contained in:
Arseni
2025-12-25 19:24:45 +03:00
parent b96babdfd4
commit 3ddd7718c2
9 changed files with 126 additions and 156 deletions

View File

@@ -3,11 +3,14 @@ import 'package:flutter/foundation.dart';
import 'package:pshared/models/payment/methods/data.dart';
import 'package:pshared/models/payment/type.dart';
import 'package:pshared/models/recipient/recipient.dart';
import 'package:pshared/provider/recipient/pmethods.dart';
class PaymentFlowProvider extends ChangeNotifier {
PaymentType _selectedType;
PaymentMethodData? _manualPaymentData;
MethodMap _availableTypes = {};
Recipient? _recipient;
PaymentFlowProvider({
required PaymentType initialType,
@@ -15,57 +18,40 @@ class PaymentFlowProvider extends ChangeNotifier {
PaymentType get selectedType => _selectedType;
PaymentMethodData? get manualPaymentData => _manualPaymentData;
Recipient? get recipient => _recipient;
void sync({
bool get hasRecipient => _recipient != null;
MethodMap get availableTypes => hasRecipient
? _availableTypes
: {for (final type in PaymentType.values) type: null};
PaymentMethodData? get selectedPaymentData =>
hasRecipient ? _availableTypes[_selectedType] : _manualPaymentData;
void syncWith({
required Recipient? recipient,
required MethodMap availableTypes,
required PaymentMethodsProvider methodsProvider,
PaymentType? preferredType,
}) {
final resolvedType = _resolveSelectedType(
recipient: recipient,
availableTypes: availableTypes,
preferredType: preferredType,
);
var hasChanges = false;
if (resolvedType != _selectedType) {
_selectedType = resolvedType;
hasChanges = true;
}
if (recipient != null && _manualPaymentData != null) {
_manualPaymentData = null;
hasChanges = true;
}
if (hasChanges) notifyListeners();
}
}) =>
_applyState(
recipient: recipient,
availableTypes: methodsProvider.availableTypesForRecipient(recipient),
preferredType: preferredType,
forceResetManualData: false,
);
void reset({
required Recipient? recipient,
required MethodMap availableTypes,
required PaymentMethodsProvider methodsProvider,
PaymentType? preferredType,
}) {
final resolvedType = _resolveSelectedType(
recipient: recipient,
availableTypes: availableTypes,
preferredType: preferredType,
);
var hasChanges = false;
if (resolvedType != _selectedType) {
_selectedType = resolvedType;
hasChanges = true;
}
if (_manualPaymentData != null) {
_manualPaymentData = null;
hasChanges = true;
}
if (hasChanges) notifyListeners();
}
}) =>
_applyState(
recipient: recipient,
availableTypes: methodsProvider.availableTypesForRecipient(recipient),
preferredType: preferredType,
forceResetManualData: true,
);
void selectType(PaymentType type, {bool resetManualData = false}) {
if (_selectedType == type && (!resetManualData || _manualPaymentData == null)) {
@@ -107,4 +93,41 @@ class PaymentFlowProvider extends ChangeNotifier {
return availableTypes.keys.first;
}
void _applyState({
required Recipient? recipient,
required MethodMap availableTypes,
required PaymentType? preferredType,
required bool forceResetManualData,
}) {
final resolvedType = _resolveSelectedType(
recipient: recipient,
availableTypes: availableTypes,
preferredType: preferredType,
);
var hasChanges = false;
if (_recipient != recipient) {
_recipient = recipient;
hasChanges = true;
}
if (!mapEquals(_availableTypes, availableTypes)) {
_availableTypes = availableTypes;
hasChanges = true;
}
if (resolvedType != _selectedType) {
_selectedType = resolvedType;
hasChanges = true;
}
if ((recipient != null || forceResetManualData) && _manualPaymentData != null) {
_manualPaymentData = null;
hasChanges = true;
}
if (hasChanges) notifyListeners();
}
}