This commit is contained in:
Arseni
2026-03-11 18:26:21 +03:00
parent fdd8dd8845
commit 0172176978
46 changed files with 678 additions and 643 deletions

View File

@@ -3,9 +3,12 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:pshared/controllers/balance_mask/wallets.dart';
import 'package:pshared/models/money.dart';
import 'package:pshared/models/payment/wallet.dart';
import 'package:pshared/utils/currency.dart';
import 'package:pweb/utils/money_display.dart';
class BalanceAmount extends StatelessWidget {
final Wallet wallet;
@@ -25,6 +28,13 @@ class BalanceAmount extends StatelessWidget {
final textTheme = Theme.of(context).textTheme;
final colorScheme = Theme.of(context).colorScheme;
final currencyBalance = currencyCodeToSymbol(wallet.currency);
final formattedBalance = formatMoneyUi(
context,
Money(
amount: amountToString(wallet.balance),
currency: currencyCodeToString(wallet.currency),
),
);
final wallets = context.watch<WalletsController>();
final isMasked = wallets.isBalanceMasked(wallet.id);
@@ -32,9 +42,7 @@ class BalanceAmount extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: [
Text(
isMasked
? '•••• $currencyBalance'
: '${amountToString(wallet.balance)} $currencyBalance',
isMasked ? '•••• $currencyBalance' : formattedBalance,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: textTheme.headlineMedium?.copyWith(

View File

@@ -6,8 +6,8 @@ import 'package:pshared/models/payment/wallet.dart';
import 'package:pweb/models/dashboard/balance_item.dart';
import 'package:pweb/pages/dashboard/buttons/balance/add/card.dart';
import 'package:pweb/pages/dashboard/buttons/balance/config.dart';
import 'package:pweb/pages/dashboard/buttons/balance/source/card.dart';
import 'package:pweb/pages/dashboard/buttons/balance/source/cards/ledger.dart';
import 'package:pweb/pages/dashboard/buttons/balance/source/cards/wallet.dart';
class BalanceCarouselCardItem extends StatelessWidget {
@@ -29,9 +29,9 @@ class BalanceCarouselCardItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
final card = switch (item) {
WalletBalanceItem(:final wallet) => WalletCard(
WalletBalanceItem(:final wallet) => BalanceSourceCard.wallet(
wallet: wallet,
onTopUp: () => onTopUp(wallet),
onAddFunds: () => onTopUp(wallet),
onTap: () => onWalletTap(wallet),
),
LedgerBalanceItem(:final account) => LedgerAccountCard(

View File

@@ -23,7 +23,7 @@ class LedgerBalanceAmount extends StatelessWidget {
final isMasked = controller.isBalanceMasked(account.ledgerAccountRef);
final balance = isMasked
? LedgerBalanceFormatter.formatMasked(account)
: LedgerBalanceFormatter.format(account);
: LedgerBalanceFormatter.format(context, account);
return Row(
mainAxisSize: MainAxisSize.min,

View File

@@ -61,7 +61,7 @@ class BalanceSourceCard extends StatelessWidget {
? null
: wallet.network!.localizedName(context);
final symbol = wallet.tokenSymbol?.trim();
final copyState = _copyController.wallet(wallet.depositAddress);
final copyState = _copyController.wallet(context, wallet.depositAddress);
return BalanceSourceCardLayout(
title: wallet.name,
@@ -105,7 +105,7 @@ class BalanceSourceCard extends StatelessWidget {
final badge = account.currency.trim().isEmpty
? null
: account.currency.toUpperCase();
final copyState = _copyController.ledger(accountCode);
final copyState = _copyController.ledger(context, accountCode);
return BalanceSourceCardLayout(
title: title,

View File

@@ -1,28 +0,0 @@
import 'package:flutter/material.dart';
import 'package:pshared/models/payment/wallet.dart';
import 'package:pweb/pages/dashboard/buttons/balance/source/card.dart';
class WalletCard extends StatelessWidget {
final Wallet wallet;
final VoidCallback onTopUp;
final VoidCallback onTap;
const WalletCard({
super.key,
required this.wallet,
required this.onTopUp,
required this.onTap,
});
@override
Widget build(BuildContext context) {
return BalanceSourceCard.wallet(
wallet: wallet,
onTap: onTap,
onAddFunds: onTopUp,
);
}
}

View File

@@ -36,7 +36,9 @@ class PaymentAmountField extends StatelessWidget {
decoration: InputDecoration(
labelText: loc.amount,
border: const OutlineInputBorder(),
prefixText: symbol == null ? null : '$symbol\u00A0',
prefixText: symbol == null
? null
: withTrailingNonBreakingSpace(symbol),
),
onChanged: ui.handleChanged,
),

View File

@@ -1,37 +0,0 @@
import 'package:pshared/models/asset.dart';
import 'package:pshared/models/money.dart';
import 'package:pshared/utils/currency.dart';
import 'package:pshared/utils/money.dart';
import 'package:pweb/controllers/payouts/multiple_payouts.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
String moneyLabel(Money? money) {
if (money == null) return 'N/A';
final amount = parseMoneyAmount(money.amount, fallback: double.nan);
if (amount.isNaN) return '${money.amount} ${money.currency}';
try {
return assetToString(
Asset(currency: currencyStringToCode(money.currency), amount: amount),
);
} catch (_) {
return '${money.amount} ${money.currency}';
}
}
String sentAmountLabel(MultiplePayoutsController controller) {
final requested = controller.requestedSentAmount;
final sourceDebit = controller.aggregateDebitAmount;
if (requested == null && sourceDebit == null) return 'N/A';
if (sourceDebit != null) return moneyLabel(sourceDebit);
return moneyLabel(requested);
}
String feeLabel(MultiplePayoutsController controller, AppLocalizations l10n) {
final fee = controller.aggregateFeeAmount;
if (fee == null) return l10n.noFee;
return moneyLabel(fee);
}

View File

@@ -1,11 +1,15 @@
import 'package:flutter/material.dart';
import 'package:pshared/utils/currency.dart';
import 'package:pweb/controllers/payouts/multiple_payouts.dart';
import 'package:pweb/models/dashboard/summary_values.dart';
import 'package:pweb/pages/dashboard/payouts/multiple/panels/source_quote/helpers.dart';
import 'package:pweb/pages/dashboard/payouts/summary/widget.dart';
import 'package:pweb/utils/money_display.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class SourceQuoteSummary extends StatelessWidget {
const SourceQuoteSummary({
super.key,
@@ -18,12 +22,27 @@ class SourceQuoteSummary extends StatelessWidget {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
return PaymentSummary(
spacing: spacing,
values: PaymentSummaryValues(
fee: feeLabel(controller, AppLocalizations.of(context)!),
recipientReceives: moneyLabel(controller.aggregateSettlementAmount),
total: moneyLabel(controller.aggregateDebitAmount),
fee: controller.aggregateFeeAmount == null
? l10n.noFee
: formatMoneyUiWithL10n(
l10n,
controller.aggregateFeeAmount,
separator: nonBreakingSpace,
),
recipientReceives: formatMoneyUiWithL10n(
l10n,
controller.aggregateSettlementAmount,
separator: nonBreakingSpace,
),
total: formatMoneyUiWithL10n(
l10n,
controller.aggregateDebitAmount,
separator: nonBreakingSpace,
),
),
);
}

View File

@@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import 'package:pshared/models/asset.dart';
import 'package:pshared/utils/currency.dart';
import 'package:pweb/utils/money_display.dart';
class PaymentSummaryRow extends StatelessWidget {
@@ -11,8 +12,8 @@ class PaymentSummaryRow extends StatelessWidget {
final TextStyle? style;
const PaymentSummaryRow({
super.key,
required this.labelFactory,
super.key,
required this.labelFactory,
required this.asset,
this.value,
this.style,
@@ -20,8 +21,7 @@ class PaymentSummaryRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final formatted = value ??
(asset == null ? 'N/A' : assetToString(asset!));
final formatted = value ?? formatAssetUi(context, asset);
return Text(labelFactory(formatted), style: style);
}
}