Fixed search field in payment page and cleaned up payment flow #187

Closed
protuberanets wants to merge 5 commits from SEND018 into main
3 changed files with 35 additions and 62 deletions
Showing only changes of commit 75d5a512cd - Show all commits

View File

@@ -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,

View File

@@ -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<RecipientsProvider, PaymentMethodsProvider, PaymentFlowProvider>(
create: (_) => PaymentFlowProvider(initialType: PaymentType.bankAccount),
update: (context, recipients, methods, provider) => provider!..update(
recipients,
methods,
),
),
ChangeNotifierProvider(
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/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<PaymentPage> {
void _initializePaymentPage() {
final flowProvider = context.read<PaymentFlowProvider>();
final methodsProvider = context.read<PaymentMethodsProvider>();
_handleWalletAutoSelection(methodsProvider, flowProvider);
final recipient = context.read<RecipientsProvider>().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<PaymentPage> {
}
void _handleRecipientSelected(Recipient recipient) {
final flowProvider = context.read<PaymentFlowProvider>();
final recipientProvider = context.read<RecipientsProvider>();
final methodsProvider = context.read<PaymentMethodsProvider>();
recipientProvider.setCurrentObject(recipient.id);
flowProvider.reset(
recipient: recipient,
methodsProvider: methodsProvider,
preferredType: widget.initialPaymentType,
);
_clearSearchField();
}
void _handleRecipientCleared() {
final flowProvider = context.read<PaymentFlowProvider>();
final recipientProvider = context.read<RecipientsProvider>();
final methodsProvider = context.read<PaymentMethodsProvider>();
recipientProvider.setCurrentObject(null);
flowProvider.reset(
recipient: null,
methodsProvider: methodsProvider,
preferredType: widget.initialPaymentType,
);
_clearSearchField();
}
@@ -129,13 +106,6 @@ class _PaymentPageState extends State<PaymentPage> {
final recipient = context.select<RecipientsProvider, Recipient?>(
(provider) => provider.currentObject,
);
final flowProvider = context.watch<PaymentFlowProvider>();
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<PaymentPage> {
);
}
void _handleWalletAutoSelection(PaymentMethodsProvider methodsProvider, PaymentFlowProvider flowProvider) {
void _handleWalletAutoSelection(PaymentMethodsProvider methodsProvider) {
final wallet = context.read<WalletsProvider>().selectedWallet;
if (wallet == null) return;
final matchingMethod = _getPaymentMethodForWallet(wallet, methodsProvider);
if (matchingMethod != null) {
methodsProvider.setCurrentObject(matchingMethod.id);
flowProvider.syncWith(
recipient: context.read<RecipientsProvider>().currentObject,
methodsProvider: methodsProvider,
preferredType: widget.initialPaymentType,
);
}
}