Fixed search field in payment page and cleaned up paymentFlow

This commit is contained in:
Arseni
2025-12-26 13:29:51 +03:00
parent edfdef5211
commit 1811571f80
6 changed files with 182 additions and 51 deletions

View File

@@ -13,6 +13,9 @@ import 'package:pshared/provider/permissions.dart';
import 'package:pshared/provider/account.dart';
import 'package:pshared/provider/organizations.dart';
import 'package:pshared/provider/payment/amount.dart';
import 'package:pshared/provider/payment/flow.dart';
import 'package:pshared/provider/payment/provider.dart';
import 'package:pshared/provider/payment/quotation.dart';
import 'package:pshared/provider/recipient/provider.dart';
import 'package:pshared/provider/recipient/pmethods.dart';
import 'package:pshared/provider/payment/wallets.dart';
@@ -21,7 +24,7 @@ import 'package:pshared/service/payment/wallets.dart';
import 'package:pweb/app/app.dart';
import 'package:pweb/app/timeago.dart';
import 'package:pweb/providers/carousel.dart';
import 'package:pweb/providers/mock_payment.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';
@@ -90,7 +93,7 @@ void main() async {
create: (_) => WalletTransactionsProvider(MockWalletTransactionsService())..load(),
),
ChangeNotifierProvider(
create: (_) => MockPaymentProvider(),
create: (_) => PaymentFlowProvider(initialType: PaymentType.bankAccount),
),
ChangeNotifierProvider(
@@ -99,6 +102,22 @@ void main() async {
ChangeNotifierProvider(
create: (_) => PaymentAmountProvider(),
),
ChangeNotifierProxyProvider4<OrganizationsProvider, PaymentAmountProvider, WalletsProvider, PaymentFlowProvider, QuotationProvider>(
create: (_) => QuotationProvider(),
update: (context, organization, payment, wallets, flow, provider) => provider!..update(
organization,
payment,
wallets,
flow,
),
),
ChangeNotifierProxyProvider2<OrganizationsProvider, QuotationProvider, PaymentProvider>(
create: (_) => PaymentProvider(),
update: (context, organization, quotation, provider) => provider!..update(
organization,
quotation,
),
),
],
child: const PayApp(),
),

View File

@@ -1,13 +1,5 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:pshared/provider/organizations.dart';
import 'package:pshared/provider/payment/amount.dart';
import 'package:pshared/provider/payment/flow.dart';
import 'package:pshared/provider/payment/quotation.dart';
import 'package:pshared/provider/payment/wallets.dart';
import 'package:pweb/pages/dashboard/payouts/form.dart';
@@ -15,16 +7,5 @@ class PaymentFromWrappingWidget extends StatelessWidget {
const PaymentFromWrappingWidget({super.key});
@override
Widget build(BuildContext context) => MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => PaymentAmountProvider(),
),
ChangeNotifierProxyProvider4<OrganizationsProvider, PaymentAmountProvider, WalletsProvider, PaymentFlowProvider, QuotationProvider>(
create: (_) => QuotationProvider(),
update: (context, orgnization, payment, wallet, flow, provider) => provider!..update(orgnization, payment, wallet, flow),
),
],
child: const PaymentFormWidget(),
);
Widget build(BuildContext context) => const PaymentFormWidget();
}

View File

@@ -8,6 +8,7 @@ import 'package:pshared/models/payment/methods/type.dart';
import 'package:pshared/models/payment/type.dart';
import 'package:pshared/models/recipient/recipient.dart';
import 'package:pshared/provider/payment/flow.dart';
import 'package:pshared/provider/payment/provider.dart';
import 'package:pshared/provider/recipient/pmethods.dart';
import 'package:pshared/provider/recipient/provider.dart';
import 'package:pshared/models/payment/wallet.dart';
@@ -38,16 +39,12 @@ class PaymentPage extends StatefulWidget {
class _PaymentPageState extends State<PaymentPage> {
late final TextEditingController _searchController;
late final FocusNode _searchFocusNode;
late final PaymentFlowProvider _flowProvider;
@override
void initState() {
super.initState();
_searchController = TextEditingController();
_searchFocusNode = FocusNode();
_flowProvider = PaymentFlowProvider(
initialType: widget.initialPaymentType ?? PaymentType.bankAccount,
);
WidgetsBinding.instance.addPostFrameCallback((_) => _initializePaymentPage());
}
@@ -56,16 +53,16 @@ class _PaymentPageState extends State<PaymentPage> {
void dispose() {
_searchController.dispose();
_searchFocusNode.dispose();
_flowProvider.dispose();
super.dispose();
}
void _initializePaymentPage() {
final flowProvider = context.read<PaymentFlowProvider>();
final methodsProvider = context.read<PaymentMethodsProvider>();
_handleWalletAutoSelection(methodsProvider);
_handleWalletAutoSelection(methodsProvider, flowProvider);
final recipient = context.read<RecipientsProvider>().currentObject;
_flowProvider.syncWith(
flowProvider.syncWith(
recipient: recipient,
methodsProvider: methodsProvider,
preferredType: widget.initialPaymentType,
@@ -77,11 +74,12 @@ 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(
flowProvider.reset(
recipient: recipient,
methodsProvider: methodsProvider,
preferredType: widget.initialPaymentType,
@@ -90,11 +88,12 @@ class _PaymentPageState extends State<PaymentPage> {
}
void _handleRecipientCleared() {
final flowProvider = context.read<PaymentFlowProvider>();
final recipientProvider = context.read<RecipientsProvider>();
final methodsProvider = context.read<PaymentMethodsProvider>();
recipientProvider.setCurrentObject(null);
_flowProvider.reset(
flowProvider.reset(
recipient: null,
methodsProvider: methodsProvider,
preferredType: widget.initialPaymentType,
@@ -109,8 +108,18 @@ class _PaymentPageState extends State<PaymentPage> {
}
void _handleSendPayment() {
// TODO: Handle Payment logic
PosthogService.paymentInitiated(method: _flowProvider.selectedType);
final flowProvider = context.read<PaymentFlowProvider>();
final paymentProvider = context.read<PaymentProvider>();
if (paymentProvider.isLoading) return;
paymentProvider.pay().then((_) {
PosthogService.paymentInitiated(method: flowProvider.selectedType);
}).catchError((error) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(error.toString())),
);
});
}
@override
@@ -120,38 +129,41 @@ class _PaymentPageState extends State<PaymentPage> {
final recipient = context.select<RecipientsProvider, Recipient?>(
(provider) => provider.currentObject,
);
final flowProvider = context.watch<PaymentFlowProvider>();
_flowProvider.syncWith(
flowProvider.syncWith(
recipient: recipient,
methodsProvider: methodsProvider,
preferredType: recipient != null ? widget.initialPaymentType : null,
);
return ChangeNotifierProvider.value(
value: _flowProvider,
child: PaymentPageBody(
onBack: widget.onBack,
fallbackDestination: widget.fallbackDestination,
recipient: recipient,
recipientProvider: recipientProvider,
methodsProvider: methodsProvider,
searchController: _searchController,
searchFocusNode: _searchFocusNode,
onSearchChanged: _handleSearchChanged,
onRecipientSelected: _handleRecipientSelected,
onRecipientCleared: _handleRecipientCleared,
onSend: _handleSendPayment,
),
return PaymentPageBody(
onBack: widget.onBack,
fallbackDestination: widget.fallbackDestination,
recipient: recipient,
recipientProvider: recipientProvider,
methodsProvider: methodsProvider,
searchController: _searchController,
searchFocusNode: _searchFocusNode,
onSearchChanged: _handleSearchChanged,
onRecipientSelected: _handleRecipientSelected,
onRecipientCleared: _handleRecipientCleared,
onSend: _handleSendPayment,
);
}
void _handleWalletAutoSelection(PaymentMethodsProvider methodsProvider) {
void _handleWalletAutoSelection(PaymentMethodsProvider methodsProvider, PaymentFlowProvider flowProvider) {
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,
);
}
}
@@ -169,4 +181,4 @@ class _PaymentPageState extends State<PaymentPage> {
(method.description?.contains(wallet.walletUserID) ?? false),
);
}
}
}