ledger top up functionality and few small fixes for project architechture and design

This commit is contained in:
Arseni
2026-03-05 21:49:23 +03:00
parent 39c04beb21
commit 97b16542c2
41 changed files with 764 additions and 455 deletions

View File

@@ -0,0 +1,51 @@
import 'package:flutter/material.dart';
import 'package:pshared/models/payment/methods/data.dart';
import 'package:pshared/models/recipient/payment_method_draft.dart';
import 'package:pweb/pages/address_book/form/widgets/payment_methods/panel.dart';
import 'package:pweb/pages/payout_page/send/widgets/payment_info/header.dart';
import 'package:pweb/models/state/control_state.dart';
import 'package:pweb/models/state/visibility.dart';
import 'package:pweb/utils/dimensions.dart';
class PaymentInfoManualDetailsSection extends StatelessWidget {
final AppDimensions dimensions;
final String title;
final VisibilityState titleVisibility;
final PaymentMethodData data;
const PaymentInfoManualDetailsSection({
super.key,
required this.dimensions,
required this.title,
required this.titleVisibility,
required this.data,
});
@override
Widget build(BuildContext context) {
final entry = RecipientMethodDraft(type: data.type, data: data);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
PaymentInfoHeader(
dimensions: dimensions,
title: title,
visibility: titleVisibility,
),
PaymentMethodPanel(
selectedType: data.type,
selectedIndex: 0,
entries: [entry],
onRemove: (_) {},
onChanged: (_, ignored) {},
editState: ControlState.disabled,
deleteVisibility: VisibilityState.hidden,
),
],
);
}
}

View File

@@ -6,6 +6,7 @@ import 'package:pshared/provider/payment/flow.dart';
import 'package:pweb/pages/payout_page/send/widgets/payment_info/methods_section.dart';
import 'package:pweb/pages/payout_page/send/widgets/payment_info/methods_state.dart';
import 'package:pweb/pages/payout_page/send/widgets/payment_info/manual_details.dart';
import 'package:pweb/pages/payout_page/send/widgets/payment_info/no_methods.dart';
import 'package:pweb/pages/payout_page/send/widgets/payment_info/no_recipient.dart';
import 'package:pweb/models/state/visibility.dart';
@@ -35,8 +36,9 @@ class PaymentInfoSection extends StatelessWidget {
Widget build(BuildContext context) {
final loc = AppLocalizations.of(context)!;
final flowProvider = context.watch<PaymentFlowProvider>();
final manualData = flowProvider.manualPaymentData;
if (!flowProvider.hasRecipient) {
if (!flowProvider.hasRecipient && manualData == null) {
return PaymentInfoNoRecipientSection(
dimensions: dimensions,
title: loc.paymentInfo,
@@ -44,6 +46,15 @@ class PaymentInfoSection extends StatelessWidget {
);
}
if (!flowProvider.hasRecipient && manualData != null) {
return PaymentInfoManualDetailsSection(
dimensions: dimensions,
title: loc.paymentInfo,
titleVisibility: titleVisibility,
data: manualData,
);
}
final methods = flowProvider.methodsForRecipient;
final types = visiblePaymentTypes;

View File

@@ -81,7 +81,7 @@ class RecipientSection extends StatelessWidget {
ShortListAddressBookPayout(
recipients: recipientProvider.recipients,
onSelected: onRecipientSelected,
trailing: AddRecipientTile(
leading: AddRecipientTile(
label: loc.addRecipient,
onTap: onAddRecipient,
),

View File

@@ -1,6 +1,9 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:pshared/models/recipient/recipient.dart';
import 'package:pshared/provider/payment/flow.dart';
import 'package:pshared/provider/recipient/provider.dart';
import 'package:pweb/pages/payout_page/send/widgets/payment_info/section.dart';
@@ -46,24 +49,30 @@ class PaymentRecipientDetailsCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final flowProvider = context.watch<PaymentFlowProvider>();
final isRecipientSelectionLocked =
!flowProvider.hasRecipient && flowProvider.manualPaymentData != null;
return PaymentSectionCard(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
RecipientSection(
recipient: recipient,
dimensions: dimensions,
recipientProvider: recipientProvider,
searchQuery: searchQuery,
filteredRecipients: filteredRecipients,
searchController: searchController,
searchFocusNode: searchFocusNode,
onSearchChanged: onSearchChanged,
onRecipientSelected: onRecipientSelected,
onRecipientCleared: onRecipientCleared,
onAddRecipient: onAddRecipient,
),
SizedBox(height: dimensions.paddingMedium),
if (!isRecipientSelectionLocked) ...[
RecipientSection(
recipient: recipient,
dimensions: dimensions,
recipientProvider: recipientProvider,
searchQuery: searchQuery,
filteredRecipients: filteredRecipients,
searchController: searchController,
searchFocusNode: searchFocusNode,
onSearchChanged: onSearchChanged,
onRecipientSelected: onRecipientSelected,
onRecipientCleared: onRecipientCleared,
onAddRecipient: onAddRecipient,
),
SizedBox(height: dimensions.paddingMedium),
],
PaymentInfoSection(
dimensions: dimensions,
titleVisibility: VisibilityState.hidden,