import 'package:flutter/material.dart'; import 'package:provider/provider.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/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'; 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; @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) { context.read().setQuery(query); } void _handleRecipientSelected(Recipient recipient) { final recipientProvider = context.read(); recipientProvider.setCurrentObject(recipient.id); _clearSearchField(); } void _handleRecipientCleared() { final recipientProvider = context.read(); recipientProvider.setCurrentObject(null); _clearSearchField(); } void _clearSearchField() { _searchController.clear(); _searchFocusNode.unfocus(); context.read().setQuery(''); } void _handleSendPayment() { final flowProvider = context.read(); final paymentProvider = context.read(); 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 Widget build(BuildContext context) { final methodsProvider = context.watch(); final recipientProvider = context.read(); final recipient = context.select( (provider) => provider.currentObject, ); return PaymentPageBody( onBack: widget.onBack, fallbackDestination: widget.fallbackDestination, recipient: recipient, recipientProvider: recipientProvider, methodsProvider: methodsProvider, onWalletSelected: context.read().selectWallet, searchController: _searchController, searchFocusNode: _searchFocusNode, onSearchChanged: _handleSearchChanged, onRecipientSelected: _handleRecipientSelected, onRecipientCleared: _handleRecipientCleared, onSend: _handleSendPayment, ); } }