import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:pshared/controllers/balance_mask/wallets.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:pweb/pages/payment_methods/payment_page/body.dart'; import 'package:pweb/app/router/payout_routes.dart'; import 'package:pweb/utils/recipient/filtering.dart'; import 'package:pweb/widgets/sidebar/destinations.dart'; import 'package:pweb/services/posthog.dart'; import 'package:pweb/widgets/dialogs/payment_status_dialog.dart'; import 'package:pweb/controllers/payment_page.dart'; import 'package:pweb/controllers/payout_verification.dart'; import 'package:pweb/utils/payment/payout_verification_flow.dart'; import 'package:pweb/models/control_state.dart'; class PaymentPage extends StatefulWidget { final ValueChanged? onBack; final PaymentType? initialPaymentType; final PayoutDestination fallbackDestination; const PaymentPage({ super.key, this.onBack, this.initialPaymentType, this.fallbackDestination = PayoutDestination.dashboard, }); @override State createState() => _PaymentPageState(); } class _PaymentPageState extends State { late final TextEditingController _searchController; late final FocusNode _searchFocusNode; Recipient? _previousRecipient; String _query = ''; @override void initState() { super.initState(); _searchController = TextEditingController(); _searchFocusNode = FocusNode(); WidgetsBinding.instance.addPostFrameCallback((_) => _initializePaymentPage()); } @override void dispose() { _searchController.dispose(); _searchFocusNode.dispose(); super.dispose(); } void _initializePaymentPage() { final flowProvider = context.read(); flowProvider.setPreferredType(widget.initialPaymentType); } void _handleSearchChanged(String query) { setState(() { _query = query; }); } void _handleRecipientSelected(Recipient recipient) { final recipientProvider = context.read(); setState(() { _previousRecipient = recipientProvider.currentObject; }); recipientProvider.setCurrentObject(recipient.id); _clearSearchField(); } void _handleRecipientCleared() { final recipientProvider = context.read(); setState(() { _previousRecipient = recipientProvider.currentObject; }); recipientProvider.setCurrentObject(null); _clearSearchField(); } void _clearSearchField() { _searchController.clear(); _searchFocusNode.unfocus(); setState(() { _query = ''; }); } Future _handleSendPayment() async { final flowProvider = context.read(); final paymentProvider = context.read(); final controller = context.read(); final verificationController = context.read(); if (paymentProvider.isLoading) return; final verified = await runPayoutVerification( context: context, controller: verificationController, ); if (!verified || !mounted) return; final isSuccess = await controller.sendPayment(); if (!mounted) return; await showPaymentStatusDialog(context, isSuccess: isSuccess); if (!mounted) return; if (isSuccess) { PosthogService.paymentInitiated(method: flowProvider.selectedType); controller.resetAfterSuccess(); context.goToPayout(widget.fallbackDestination); } } @override Widget build(BuildContext context) { final methodsProvider = context.watch(); final recipientProvider = context.watch(); final verificationController = context.watch(); final recipient = recipientProvider.currentObject; final filteredRecipients = filterRecipients( recipients: recipientProvider.recipients, query: _query, ); final sendState = verificationController.isCooldownActive ? ControlState.disabled : ControlState.enabled; return PaymentPageBody( onBack: widget.onBack, fallbackDestination: widget.fallbackDestination, recipient: recipient, previousRecipient: _previousRecipient, recipientProvider: recipientProvider, searchQuery: _query, filteredRecipients: filteredRecipients, methodsProvider: methodsProvider, sendState: sendState, cooldownRemainingSeconds: verificationController.cooldownRemainingSeconds, onWalletSelected: context.read().selectWallet, searchController: _searchController, searchFocusNode: _searchFocusNode, onSearchChanged: _handleSearchChanged, onRecipientSelected: _handleRecipientSelected, onRecipientCleared: _handleRecipientCleared, onSend: _handleSendPayment, ); } }