redesigned payment page + a lot of fixes

This commit is contained in:
Arseni
2026-02-21 21:55:20 +03:00
parent a68aa2abff
commit 0c6fa03aba
208 changed files with 4062 additions and 2217 deletions

View File

@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
import 'package:pshared/models/recipient/recipient.dart';
import 'package:pweb/pages/payout_page/send/widgets/back_button.dart';
import 'package:pweb/widgets/sidebar/destinations.dart';
class PaymentPageBackSection extends StatelessWidget {
final ValueChanged<Recipient?>? onBack;
final Recipient? recipient;
final PayoutDestination fallbackDestination;
const PaymentPageBackSection({
super.key,
required this.onBack,
required this.recipient,
required this.fallbackDestination,
});
@override
Widget build(BuildContext context) {
return PaymentBackButton(
onBack: onBack,
recipient: recipient,
fallbackDestination: fallbackDestination,
);
}
}

View File

@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
class PaymentPageContentLayout extends StatelessWidget {
final double maxWidth;
final EdgeInsets padding;
final Widget child;
const PaymentPageContentLayout({
super.key,
required this.maxWidth,
required this.padding,
required this.child,
});
@override
Widget build(BuildContext context) {
return Align(
alignment: Alignment.topCenter,
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: maxWidth),
child: SingleChildScrollView(
padding: padding,
child: child,
),
),
);
}
}

View File

@@ -0,0 +1,64 @@
import 'package:flutter/material.dart';
import 'package:pshared/models/recipient/recipient.dart';
import 'package:pshared/provider/recipient/provider.dart';
import 'package:pweb/pages/payout_page/send/widgets/recipient_details_card.dart';
import 'package:pweb/utils/dimensions.dart';
import 'package:pweb/models/state/visibility.dart';
class PaymentPageRecipientSection extends StatelessWidget {
final AppDimensions dimensions;
final Recipient? recipient;
final RecipientsProvider recipientProvider;
final String searchQuery;
final List<Recipient> filteredRecipients;
final TextEditingController searchController;
final FocusNode searchFocusNode;
final ValueChanged<String> onSearchChanged;
final ValueChanged<Recipient> onRecipientSelected;
final VoidCallback onRecipientCleared;
final VoidCallback onAddRecipient;
final VoidCallback onAddPaymentMethod;
final VisibilityState paymentDetailsVisibility;
final VoidCallback onTogglePaymentDetails;
const PaymentPageRecipientSection({
super.key,
required this.dimensions,
required this.recipient,
required this.recipientProvider,
required this.searchQuery,
required this.filteredRecipients,
required this.searchController,
required this.searchFocusNode,
required this.onSearchChanged,
required this.onRecipientSelected,
required this.onRecipientCleared,
required this.onAddRecipient,
required this.onAddPaymentMethod,
required this.paymentDetailsVisibility,
required this.onTogglePaymentDetails,
});
@override
Widget build(BuildContext context) {
return PaymentRecipientDetailsCard(
dimensions: dimensions,
recipient: recipient,
recipientProvider: recipientProvider,
searchQuery: searchQuery,
filteredRecipients: filteredRecipients,
searchController: searchController,
searchFocusNode: searchFocusNode,
onSearchChanged: onSearchChanged,
onRecipientSelected: onRecipientSelected,
onRecipientCleared: onRecipientCleared,
onAddRecipient: onAddRecipient,
onAddPaymentMethod: onAddPaymentMethod,
paymentDetailsVisibility: paymentDetailsVisibility,
onTogglePaymentDetails: onTogglePaymentDetails,
);
}
}

View File

@@ -0,0 +1,109 @@
import 'package:flutter/material.dart';
import 'package:pshared/models/payment/wallet.dart';
import 'package:pshared/models/recipient/recipient.dart';
import 'package:pshared/provider/recipient/provider.dart';
import 'package:pweb/pages/payout_page/send/content/back_section.dart';
import 'package:pweb/pages/payout_page/send/content/recipient_section.dart';
import 'package:pweb/pages/payout_page/send/content/send_section.dart';
import 'package:pweb/pages/payout_page/send/content/source_section.dart';
import 'package:pweb/utils/dimensions.dart';
import 'package:pweb/widgets/sidebar/destinations.dart';
import 'package:pweb/models/state/control_state.dart';
import 'package:pweb/models/state/visibility.dart';
class PaymentPageContentSections extends StatelessWidget {
final AppDimensions dimensions;
final String sourceOfFundsTitle;
final ValueChanged<Recipient?>? onBack;
final Recipient? recipient;
final RecipientsProvider recipientProvider;
final String searchQuery;
final List<Recipient> filteredRecipients;
final ValueChanged<Wallet> onWalletSelected;
final PayoutDestination fallbackDestination;
final ControlState sendState;
final int cooldownRemainingSeconds;
final TextEditingController searchController;
final FocusNode searchFocusNode;
final ValueChanged<String> onSearchChanged;
final ValueChanged<Recipient> onRecipientSelected;
final VoidCallback onRecipientCleared;
final VoidCallback onSend;
final VoidCallback onAddRecipient;
final VoidCallback onAddPaymentMethod;
final VisibilityState paymentDetailsVisibility;
final VoidCallback onTogglePaymentDetails;
const PaymentPageContentSections({
super.key,
required this.dimensions,
required this.sourceOfFundsTitle,
required this.onBack,
required this.recipient,
required this.recipientProvider,
required this.searchQuery,
required this.filteredRecipients,
required this.onWalletSelected,
required this.fallbackDestination,
required this.sendState,
required this.cooldownRemainingSeconds,
required this.searchController,
required this.searchFocusNode,
required this.onSearchChanged,
required this.onRecipientSelected,
required this.onRecipientCleared,
required this.onSend,
required this.onAddRecipient,
required this.onAddPaymentMethod,
required this.paymentDetailsVisibility,
required this.onTogglePaymentDetails,
});
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
PaymentPageBackSection(
onBack: onBack,
recipient: recipient,
fallbackDestination: fallbackDestination,
),
SizedBox(height: dimensions.paddingSmall),
PaymentPageSourceSection(
dimensions: dimensions,
title: sourceOfFundsTitle,
onWalletSelected: onWalletSelected,
),
SizedBox(height: dimensions.paddingXLarge),
PaymentPageRecipientSection(
dimensions: dimensions,
recipient: recipient,
recipientProvider: recipientProvider,
searchQuery: searchQuery,
filteredRecipients: filteredRecipients,
searchController: searchController,
searchFocusNode: searchFocusNode,
onSearchChanged: onSearchChanged,
onRecipientSelected: onRecipientSelected,
onRecipientCleared: onRecipientCleared,
onAddRecipient: onAddRecipient,
onAddPaymentMethod: onAddPaymentMethod,
paymentDetailsVisibility: paymentDetailsVisibility,
onTogglePaymentDetails: onTogglePaymentDetails,
),
SizedBox(height: dimensions.paddingXLarge),
PaymentPageSendSection(
dimensions: dimensions,
sendState: sendState,
cooldownRemainingSeconds: cooldownRemainingSeconds,
onSend: onSend,
),
],
);
}
}

View File

@@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
import 'package:pweb/pages/payout_page/send/widgets/send_card.dart';
import 'package:pweb/utils/dimensions.dart';
import 'package:pweb/models/state/control_state.dart';
class PaymentPageSendSection extends StatelessWidget {
final AppDimensions dimensions;
final ControlState sendState;
final int cooldownRemainingSeconds;
final VoidCallback onSend;
const PaymentPageSendSection({
super.key,
required this.dimensions,
required this.sendState,
required this.cooldownRemainingSeconds,
required this.onSend,
});
@override
Widget build(BuildContext context) {
return PaymentSendCard(
dimensions: dimensions,
sendState: sendState,
cooldownRemainingSeconds: cooldownRemainingSeconds,
onSend: onSend,
);
}
}

View File

@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
import 'package:pshared/models/payment/wallet.dart';
import 'package:pweb/pages/payout_page/send/widgets/source_of_funds_card.dart';
import 'package:pweb/utils/dimensions.dart';
class PaymentPageSourceSection extends StatelessWidget {
final AppDimensions dimensions;
final String title;
final ValueChanged<Wallet> onWalletSelected;
const PaymentPageSourceSection({
super.key,
required this.dimensions,
required this.title,
required this.onWalletSelected,
});
@override
Widget build(BuildContext context) {
return PaymentSourceOfFundsCard(
dimensions: dimensions,
title: title,
onWalletSelected: onWalletSelected,
);
}
}