diff --git a/frontend/pshared/lib/provider/payment/flow.dart b/frontend/pshared/lib/provider/payment/flow.dart index 12b909f..e045149 100644 --- a/frontend/pshared/lib/provider/payment/flow.dart +++ b/frontend/pshared/lib/provider/payment/flow.dart @@ -3,18 +3,22 @@ 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/provider.dart'; import 'package:pshared/provider/recipient/pmethods.dart'; class PaymentFlowProvider extends ChangeNotifier { PaymentType _selectedType; + PaymentType? _preferredType; PaymentMethodData? _manualPaymentData; MethodMap _availableTypes = {}; Recipient? _recipient; PaymentFlowProvider({ required PaymentType initialType, - }) : _selectedType = initialType; + PaymentType? preferredType, + }) : _selectedType = initialType, + _preferredType = preferredType ?? initialType; PaymentType get selectedType => _selectedType; PaymentMethodData? get manualPaymentData => _manualPaymentData; @@ -29,30 +33,17 @@ class PaymentFlowProvider extends ChangeNotifier { PaymentMethodData? get selectedPaymentData => hasRecipient ? _availableTypes[_selectedType] : _manualPaymentData; - void syncWith({ - required Recipient? recipient, - required PaymentMethodsProvider methodsProvider, - PaymentType? preferredType, - }) => + void update( + RecipientsProvider recipientsProvider, + PaymentMethodsProvider methodsProvider, + ) => _applyState( - recipient: recipient, - availableTypes: methodsProvider.availableTypesForRecipient(recipient), - preferredType: preferredType, + recipient: recipientsProvider.currentObject, + availableTypes: methodsProvider.availableTypesForRecipient(recipientsProvider.currentObject), + 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; @@ -70,6 +61,20 @@ class PaymentFlowProvider extends ChangeNotifier { notifyListeners(); } + void setPreferredType(PaymentType? preferredType) { + if (_preferredType == preferredType) { + return; + } + + _preferredType = preferredType; + _applyState( + recipient: _recipient, + availableTypes: _availableTypes, + preferredType: _preferredType, + forceResetManualData: false, + ); + } + PaymentType _resolveSelectedType({ required Recipient? recipient, required MethodMap availableTypes, diff --git a/frontend/pweb/lib/main.dart b/frontend/pweb/lib/main.dart index af111dd..a93a4f9 100644 --- a/frontend/pweb/lib/main.dart +++ b/frontend/pweb/lib/main.dart @@ -20,11 +20,11 @@ import 'package:pshared/provider/recipient/provider.dart'; import 'package:pshared/provider/recipient/pmethods.dart'; import 'package:pshared/provider/payment/wallets.dart'; import 'package:pshared/service/payment/wallets.dart'; +import 'package:pshared/models/payment/type.dart'; import 'package:pweb/app/app.dart'; import 'package:pweb/app/timeago.dart'; import 'package:pweb/providers/carousel.dart'; -import 'package:pshared/models/payment/type.dart'; import 'package:pweb/providers/operatioins.dart'; import 'package:pweb/providers/two_factor.dart'; import 'package:pweb/providers/upload_history.dart'; @@ -92,10 +92,13 @@ void main() async { ChangeNotifierProvider( create: (_) => WalletTransactionsProvider(MockWalletTransactionsService())..load(), ), - ChangeNotifierProvider( + ChangeNotifierProxyProvider2( create: (_) => PaymentFlowProvider(initialType: PaymentType.bankAccount), + update: (context, recipients, methods, provider) => provider!..update( + recipients, + methods, + ), ), - ChangeNotifierProvider( create: (_) => OperationProvider(OperationService())..loadOperations(), ), diff --git a/frontend/pweb/lib/pages/payment_methods/page.dart b/frontend/pweb/lib/pages/payment_methods/page.dart index ea2631e..153c5b1 100644 --- a/frontend/pweb/lib/pages/payment_methods/page.dart +++ b/frontend/pweb/lib/pages/payment_methods/page.dart @@ -14,7 +14,6 @@ import 'package:pshared/provider/recipient/provider.dart'; import 'package:pshared/models/payment/wallet.dart'; import 'package:pshared/provider/payment/wallets.dart'; - import 'package:pweb/pages/payment_methods/payment_page/body.dart'; import 'package:pweb/widgets/sidebar/destinations.dart'; import 'package:pweb/services/posthog.dart'; @@ -59,14 +58,8 @@ class _PaymentPageState extends State { void _initializePaymentPage() { final flowProvider = context.read(); final methodsProvider = context.read(); - _handleWalletAutoSelection(methodsProvider, flowProvider); - - final recipient = context.read().currentObject; - flowProvider.syncWith( - recipient: recipient, - methodsProvider: methodsProvider, - preferredType: widget.initialPaymentType, - ); + flowProvider.setPreferredType(widget.initialPaymentType); + _handleWalletAutoSelection(methodsProvider); } void _handleSearchChanged(String query) { @@ -74,30 +67,14 @@ class _PaymentPageState extends State { } void _handleRecipientSelected(Recipient recipient) { - final flowProvider = context.read(); final recipientProvider = context.read(); - final methodsProvider = context.read(); - recipientProvider.setCurrentObject(recipient.id); - flowProvider.reset( - recipient: recipient, - methodsProvider: methodsProvider, - preferredType: widget.initialPaymentType, - ); _clearSearchField(); } void _handleRecipientCleared() { - final flowProvider = context.read(); final recipientProvider = context.read(); - final methodsProvider = context.read(); - recipientProvider.setCurrentObject(null); - flowProvider.reset( - recipient: null, - methodsProvider: methodsProvider, - preferredType: widget.initialPaymentType, - ); _clearSearchField(); } @@ -129,13 +106,6 @@ class _PaymentPageState extends State { final recipient = context.select( (provider) => provider.currentObject, ); - final flowProvider = context.watch(); - - flowProvider.syncWith( - recipient: recipient, - methodsProvider: methodsProvider, - preferredType: recipient != null ? widget.initialPaymentType : null, - ); return PaymentPageBody( onBack: widget.onBack, @@ -152,18 +122,13 @@ class _PaymentPageState extends State { ); } - void _handleWalletAutoSelection(PaymentMethodsProvider methodsProvider, PaymentFlowProvider flowProvider) { + void _handleWalletAutoSelection(PaymentMethodsProvider methodsProvider) { final wallet = context.read().selectedWallet; if (wallet == null) return; final matchingMethod = _getPaymentMethodForWallet(wallet, methodsProvider); if (matchingMethod != null) { methodsProvider.setCurrentObject(matchingMethod.id); - flowProvider.syncWith( - recipient: context.read().currentObject, - methodsProvider: methodsProvider, - preferredType: widget.initialPaymentType, - ); } }