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, }) : _selectedType = initialType; PaymentType get selectedType => _selectedType; PaymentMethodData? get manualPaymentData => _manualPaymentData; Recipient? get recipient => _recipient; 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 PaymentMethodsProvider methodsProvider, PaymentType? preferredType, }) => _applyState( recipient: recipient, availableTypes: methodsProvider.availableTypesForRecipient(recipient), preferredType: preferredType, forceResetManualData: false, ); void reset({ required Recipient? recipient, required PaymentMethodsProvider methodsProvider, PaymentType? preferredType, }) => _applyState( recipient: recipient, availableTypes: methodsProvider.availableTypesForRecipient(recipient), preferredType: preferredType, forceResetManualData: true, ); void selectType(PaymentType type, {bool resetManualData = false}) { if (_selectedType == type && (!resetManualData || _manualPaymentData == null)) { return; } _selectedType = type; if (resetManualData) { _manualPaymentData = null; } notifyListeners(); } void setManualPaymentData(PaymentMethodData? data) { _manualPaymentData = data; notifyListeners(); } PaymentType _resolveSelectedType({ required Recipient? recipient, required MethodMap availableTypes, PaymentType? preferredType, }) { if (recipient == null) { return preferredType ?? _selectedType; } if (availableTypes.isEmpty) { return preferredType ?? PaymentType.bankAccount; } if (availableTypes.keys.contains(_selectedType)) { return _selectedType; } if (preferredType != null && availableTypes.keys.contains(preferredType)) { return preferredType; } 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(); } }