Removed manual syncWith/reset calls and added an update in PaymentFlowProvider

This commit is contained in:
Arseni
2025-12-26 14:37:45 +03:00
parent 1811571f80
commit 75d5a512cd
3 changed files with 35 additions and 62 deletions

View File

@@ -3,18 +3,22 @@ import 'package:flutter/foundation.dart';
import 'package:pshared/models/payment/methods/data.dart'; import 'package:pshared/models/payment/methods/data.dart';
import 'package:pshared/models/payment/type.dart'; import 'package:pshared/models/payment/type.dart';
import 'package:pshared/models/recipient/recipient.dart'; import 'package:pshared/models/recipient/recipient.dart';
import 'package:pshared/provider/recipient/provider.dart';
import 'package:pshared/provider/recipient/pmethods.dart'; import 'package:pshared/provider/recipient/pmethods.dart';
class PaymentFlowProvider extends ChangeNotifier { class PaymentFlowProvider extends ChangeNotifier {
PaymentType _selectedType; PaymentType _selectedType;
PaymentType? _preferredType;
PaymentMethodData? _manualPaymentData; PaymentMethodData? _manualPaymentData;
MethodMap _availableTypes = {}; MethodMap _availableTypes = {};
Recipient? _recipient; Recipient? _recipient;
PaymentFlowProvider({ PaymentFlowProvider({
required PaymentType initialType, required PaymentType initialType,
}) : _selectedType = initialType; PaymentType? preferredType,
}) : _selectedType = initialType,
_preferredType = preferredType ?? initialType;
PaymentType get selectedType => _selectedType; PaymentType get selectedType => _selectedType;
PaymentMethodData? get manualPaymentData => _manualPaymentData; PaymentMethodData? get manualPaymentData => _manualPaymentData;
@@ -29,30 +33,17 @@ class PaymentFlowProvider extends ChangeNotifier {
PaymentMethodData? get selectedPaymentData => PaymentMethodData? get selectedPaymentData =>
hasRecipient ? _availableTypes[_selectedType] : _manualPaymentData; hasRecipient ? _availableTypes[_selectedType] : _manualPaymentData;
void syncWith({ void update(
required Recipient? recipient, RecipientsProvider recipientsProvider,
required PaymentMethodsProvider methodsProvider, PaymentMethodsProvider methodsProvider,
PaymentType? preferredType, ) =>
}) =>
_applyState( _applyState(
recipient: recipient, recipient: recipientsProvider.currentObject,
availableTypes: methodsProvider.availableTypesForRecipient(recipient), availableTypes: methodsProvider.availableTypesForRecipient(recipientsProvider.currentObject),
preferredType: preferredType, preferredType: _preferredType,
forceResetManualData: false, 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}) { void selectType(PaymentType type, {bool resetManualData = false}) {
if (_selectedType == type && (!resetManualData || _manualPaymentData == null)) { if (_selectedType == type && (!resetManualData || _manualPaymentData == null)) {
return; return;
@@ -70,6 +61,20 @@ class PaymentFlowProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
void setPreferredType(PaymentType? preferredType) {
if (_preferredType == preferredType) {
return;
}
_preferredType = preferredType;
_applyState(
recipient: _recipient,
availableTypes: _availableTypes,
preferredType: _preferredType,
forceResetManualData: false,
);
}
PaymentType _resolveSelectedType({ PaymentType _resolveSelectedType({
required Recipient? recipient, required Recipient? recipient,
required MethodMap availableTypes, required MethodMap availableTypes,

View File

@@ -20,11 +20,11 @@ import 'package:pshared/provider/recipient/provider.dart';
import 'package:pshared/provider/recipient/pmethods.dart'; import 'package:pshared/provider/recipient/pmethods.dart';
import 'package:pshared/provider/payment/wallets.dart'; import 'package:pshared/provider/payment/wallets.dart';
import 'package:pshared/service/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/app.dart';
import 'package:pweb/app/timeago.dart'; import 'package:pweb/app/timeago.dart';
import 'package:pweb/providers/carousel.dart'; import 'package:pweb/providers/carousel.dart';
import 'package:pshared/models/payment/type.dart';
import 'package:pweb/providers/operatioins.dart'; import 'package:pweb/providers/operatioins.dart';
import 'package:pweb/providers/two_factor.dart'; import 'package:pweb/providers/two_factor.dart';
import 'package:pweb/providers/upload_history.dart'; import 'package:pweb/providers/upload_history.dart';
@@ -92,10 +92,13 @@ void main() async {
ChangeNotifierProvider( ChangeNotifierProvider(
create: (_) => WalletTransactionsProvider(MockWalletTransactionsService())..load(), create: (_) => WalletTransactionsProvider(MockWalletTransactionsService())..load(),
), ),
ChangeNotifierProvider( ChangeNotifierProxyProvider2<RecipientsProvider, PaymentMethodsProvider, PaymentFlowProvider>(
create: (_) => PaymentFlowProvider(initialType: PaymentType.bankAccount), create: (_) => PaymentFlowProvider(initialType: PaymentType.bankAccount),
update: (context, recipients, methods, provider) => provider!..update(
recipients,
methods,
),
), ),
ChangeNotifierProvider( ChangeNotifierProvider(
create: (_) => OperationProvider(OperationService())..loadOperations(), create: (_) => OperationProvider(OperationService())..loadOperations(),
), ),

View File

@@ -14,7 +14,6 @@ import 'package:pshared/provider/recipient/provider.dart';
import 'package:pshared/models/payment/wallet.dart'; import 'package:pshared/models/payment/wallet.dart';
import 'package:pshared/provider/payment/wallets.dart'; import 'package:pshared/provider/payment/wallets.dart';
import 'package:pweb/pages/payment_methods/payment_page/body.dart'; import 'package:pweb/pages/payment_methods/payment_page/body.dart';
import 'package:pweb/widgets/sidebar/destinations.dart'; import 'package:pweb/widgets/sidebar/destinations.dart';
import 'package:pweb/services/posthog.dart'; import 'package:pweb/services/posthog.dart';
@@ -59,14 +58,8 @@ class _PaymentPageState extends State<PaymentPage> {
void _initializePaymentPage() { void _initializePaymentPage() {
final flowProvider = context.read<PaymentFlowProvider>(); final flowProvider = context.read<PaymentFlowProvider>();
final methodsProvider = context.read<PaymentMethodsProvider>(); final methodsProvider = context.read<PaymentMethodsProvider>();
_handleWalletAutoSelection(methodsProvider, flowProvider); flowProvider.setPreferredType(widget.initialPaymentType);
_handleWalletAutoSelection(methodsProvider);
final recipient = context.read<RecipientsProvider>().currentObject;
flowProvider.syncWith(
recipient: recipient,
methodsProvider: methodsProvider,
preferredType: widget.initialPaymentType,
);
} }
void _handleSearchChanged(String query) { void _handleSearchChanged(String query) {
@@ -74,30 +67,14 @@ class _PaymentPageState extends State<PaymentPage> {
} }
void _handleRecipientSelected(Recipient recipient) { void _handleRecipientSelected(Recipient recipient) {
final flowProvider = context.read<PaymentFlowProvider>();
final recipientProvider = context.read<RecipientsProvider>(); final recipientProvider = context.read<RecipientsProvider>();
final methodsProvider = context.read<PaymentMethodsProvider>();
recipientProvider.setCurrentObject(recipient.id); recipientProvider.setCurrentObject(recipient.id);
flowProvider.reset(
recipient: recipient,
methodsProvider: methodsProvider,
preferredType: widget.initialPaymentType,
);
_clearSearchField(); _clearSearchField();
} }
void _handleRecipientCleared() { void _handleRecipientCleared() {
final flowProvider = context.read<PaymentFlowProvider>();
final recipientProvider = context.read<RecipientsProvider>(); final recipientProvider = context.read<RecipientsProvider>();
final methodsProvider = context.read<PaymentMethodsProvider>();
recipientProvider.setCurrentObject(null); recipientProvider.setCurrentObject(null);
flowProvider.reset(
recipient: null,
methodsProvider: methodsProvider,
preferredType: widget.initialPaymentType,
);
_clearSearchField(); _clearSearchField();
} }
@@ -129,13 +106,6 @@ class _PaymentPageState extends State<PaymentPage> {
final recipient = context.select<RecipientsProvider, Recipient?>( final recipient = context.select<RecipientsProvider, Recipient?>(
(provider) => provider.currentObject, (provider) => provider.currentObject,
); );
final flowProvider = context.watch<PaymentFlowProvider>();
flowProvider.syncWith(
recipient: recipient,
methodsProvider: methodsProvider,
preferredType: recipient != null ? widget.initialPaymentType : null,
);
return PaymentPageBody( return PaymentPageBody(
onBack: widget.onBack, onBack: widget.onBack,
@@ -152,18 +122,13 @@ class _PaymentPageState extends State<PaymentPage> {
); );
} }
void _handleWalletAutoSelection(PaymentMethodsProvider methodsProvider, PaymentFlowProvider flowProvider) { void _handleWalletAutoSelection(PaymentMethodsProvider methodsProvider) {
final wallet = context.read<WalletsProvider>().selectedWallet; final wallet = context.read<WalletsProvider>().selectedWallet;
if (wallet == null) return; if (wallet == null) return;
final matchingMethod = _getPaymentMethodForWallet(wallet, methodsProvider); final matchingMethod = _getPaymentMethodForWallet(wallet, methodsProvider);
if (matchingMethod != null) { if (matchingMethod != null) {
methodsProvider.setCurrentObject(matchingMethod.id); methodsProvider.setCurrentObject(matchingMethod.id);
flowProvider.syncWith(
recipient: context.read<RecipientsProvider>().currentObject,
methodsProvider: methodsProvider,
preferredType: widget.initialPaymentType,
);
} }
} }