chain network name display fixed

This commit is contained in:
Stephan D
2025-12-24 18:17:35 +01:00
parent 5836292adb
commit 9e6d530385
24 changed files with 143 additions and 78 deletions

View File

@@ -28,16 +28,16 @@ func (d *Driver) Name() string {
} }
func (d *Driver) FormatAddress(address string) (string, error) { func (d *Driver) FormatAddress(address string) (string, error) {
d.logger.Debug("format address", zap.String("address", address)) d.logger.Debug("Format address", zap.String("address", address))
normalized, err := normalizeAddress(address) normalized, err := normalizeAddress(address)
if err != nil { if err != nil {
d.logger.Warn("format address failed", zap.String("address", address), zap.Error(err)) d.logger.Warn("Format address failed", zap.String("address", address), zap.Error(err))
} }
return normalized, err return normalized, err
} }
func (d *Driver) NormalizeAddress(address string) (string, error) { func (d *Driver) NormalizeAddress(address string) (string, error) {
d.logger.Debug("normalize address", zap.String("address", address)) d.logger.Debug("Normalize address", zap.String("address", address))
normalized, err := normalizeAddress(address) normalized, err := normalizeAddress(address)
if err != nil { if err != nil {
d.logger.Warn("normalize address failed", zap.String("address", address), zap.Error(err)) d.logger.Warn("normalize address failed", zap.String("address", address), zap.Error(err))
@@ -49,16 +49,12 @@ func (d *Driver) Balance(ctx context.Context, deps driver.Deps, network shared.N
if wallet == nil { if wallet == nil {
return nil, merrors.InvalidArgument("wallet is required") return nil, merrors.InvalidArgument("wallet is required")
} }
d.logger.Debug("balance request", d.logger.Debug("Balance request", zap.String("wallet_ref", wallet.WalletRef), zap.String("network", network.Name))
zap.String("wallet_ref", wallet.WalletRef),
zap.String("network", network.Name),
)
rpcAddr, err := rpcAddress(wallet.DepositAddress) rpcAddr, err := rpcAddress(wallet.DepositAddress)
if err != nil { if err != nil {
d.logger.Warn("balance address conversion failed", d.logger.Warn("Balance address conversion failed", zap.Error(err),
zap.String("wallet_ref", wallet.WalletRef), zap.String("wallet_ref", wallet.WalletRef),
zap.String("address", wallet.DepositAddress), zap.String("address", wallet.DepositAddress),
zap.Error(err),
) )
return nil, err return nil, err
} }
@@ -66,10 +62,9 @@ func (d *Driver) Balance(ctx context.Context, deps driver.Deps, network shared.N
driverDeps.Logger = d.logger driverDeps.Logger = d.logger
result, err := evm.Balance(ctx, driverDeps, network, wallet, rpcAddr) result, err := evm.Balance(ctx, driverDeps, network, wallet, rpcAddr)
if err != nil { if err != nil {
d.logger.Warn("balance failed", d.logger.Warn("Balance failed", zap.Error(err),
zap.String("wallet_ref", wallet.WalletRef), zap.String("wallet_ref", wallet.WalletRef),
zap.String("network", network.Name), zap.String("network", network.Name),
zap.Error(err),
) )
} else if result != nil { } else if result != nil {
d.logger.Debug("balance result", d.logger.Debug("balance result",
@@ -86,26 +81,24 @@ func (d *Driver) EstimateFee(ctx context.Context, deps driver.Deps, network shar
if wallet == nil { if wallet == nil {
return nil, merrors.InvalidArgument("wallet is required") return nil, merrors.InvalidArgument("wallet is required")
} }
d.logger.Debug("estimate fee request", d.logger.Debug("Estimate fee request",
zap.String("wallet_ref", wallet.WalletRef), zap.String("wallet_ref", wallet.WalletRef),
zap.String("network", network.Name), zap.String("network", network.Name),
zap.String("destination", destination), zap.String("destination", destination),
) )
rpcFrom, err := rpcAddress(wallet.DepositAddress) rpcFrom, err := rpcAddress(wallet.DepositAddress)
if err != nil { if err != nil {
d.logger.Warn("estimate fee address conversion failed", d.logger.Warn("Estimate fee address conversion failed", zap.Error(err),
zap.String("wallet_ref", wallet.WalletRef), zap.String("wallet_ref", wallet.WalletRef),
zap.String("address", wallet.DepositAddress), zap.String("address", wallet.DepositAddress),
zap.Error(err),
) )
return nil, err return nil, err
} }
rpcTo, err := rpcAddress(destination) rpcTo, err := rpcAddress(destination)
if err != nil { if err != nil {
d.logger.Warn("estimate fee destination conversion failed", d.logger.Warn("Estimate fee destination conversion failed", zap.Error(err),
zap.String("wallet_ref", wallet.WalletRef), zap.String("wallet_ref", wallet.WalletRef),
zap.String("destination", destination), zap.String("destination", destination),
zap.Error(err),
) )
return nil, err return nil, err
} }
@@ -113,13 +106,12 @@ func (d *Driver) EstimateFee(ctx context.Context, deps driver.Deps, network shar
driverDeps.Logger = d.logger driverDeps.Logger = d.logger
result, err := evm.EstimateFee(ctx, driverDeps, network, wallet, rpcFrom, rpcTo, amount) result, err := evm.EstimateFee(ctx, driverDeps, network, wallet, rpcFrom, rpcTo, amount)
if err != nil { if err != nil {
d.logger.Warn("estimate fee failed", d.logger.Warn("Estimate fee failed", zap.Error(err),
zap.String("wallet_ref", wallet.WalletRef), zap.String("wallet_ref", wallet.WalletRef),
zap.String("network", network.Name), zap.String("network", network.Name),
zap.Error(err),
) )
} else if result != nil { } else if result != nil {
d.logger.Debug("estimate fee result", d.logger.Debug("Estimate fee result",
zap.String("wallet_ref", wallet.WalletRef), zap.String("wallet_ref", wallet.WalletRef),
zap.String("network", network.Name), zap.String("network", network.Name),
zap.String("amount", result.Amount), zap.String("amount", result.Amount),
@@ -133,26 +125,24 @@ func (d *Driver) SubmitTransfer(ctx context.Context, deps driver.Deps, network s
if source == nil { if source == nil {
return "", merrors.InvalidArgument("source wallet is required") return "", merrors.InvalidArgument("source wallet is required")
} }
d.logger.Debug("submit transfer request", d.logger.Debug("Submit transfer request",
zap.String("transfer_ref", transfer.TransferRef), zap.String("transfer_ref", transfer.TransferRef),
zap.String("network", network.Name), zap.String("network", network.Name),
zap.String("destination", destination), zap.String("destination", destination),
) )
rpcFrom, err := rpcAddress(source.DepositAddress) rpcFrom, err := rpcAddress(source.DepositAddress)
if err != nil { if err != nil {
d.logger.Warn("submit transfer address conversion failed", d.logger.Warn("Submit transfer address conversion failed", zap.Error(err),
zap.String("wallet_ref", source.WalletRef), zap.String("wallet_ref", source.WalletRef),
zap.String("address", source.DepositAddress), zap.String("address", source.DepositAddress),
zap.Error(err),
) )
return "", err return "", err
} }
rpcTo, err := rpcAddress(destination) rpcTo, err := rpcAddress(destination)
if err != nil { if err != nil {
d.logger.Warn("submit transfer destination conversion failed", d.logger.Warn("Submit transfer destination conversion failed", zap.Error(err),
zap.String("transfer_ref", transfer.TransferRef), zap.String("transfer_ref", transfer.TransferRef),
zap.String("destination", destination), zap.String("destination", destination),
zap.Error(err),
) )
return "", err return "", err
} }
@@ -160,13 +150,12 @@ func (d *Driver) SubmitTransfer(ctx context.Context, deps driver.Deps, network s
driverDeps.Logger = d.logger driverDeps.Logger = d.logger
txHash, err := evm.SubmitTransfer(ctx, driverDeps, network, transfer, source, rpcFrom, rpcTo) txHash, err := evm.SubmitTransfer(ctx, driverDeps, network, transfer, source, rpcFrom, rpcTo)
if err != nil { if err != nil {
d.logger.Warn("submit transfer failed", d.logger.Warn("submit transfer failed", zap.Error(err),
zap.String("transfer_ref", transfer.TransferRef), zap.String("transfer_ref", transfer.TransferRef),
zap.String("network", network.Name), zap.String("network", network.Name),
zap.Error(err),
) )
} else { } else {
d.logger.Debug("submit transfer result", d.logger.Debug("Submit transfer result",
zap.String("transfer_ref", transfer.TransferRef), zap.String("transfer_ref", transfer.TransferRef),
zap.String("network", network.Name), zap.String("network", network.Name),
zap.String("tx_hash", txHash), zap.String("tx_hash", txHash),
@@ -176,7 +165,7 @@ func (d *Driver) SubmitTransfer(ctx context.Context, deps driver.Deps, network s
} }
func (d *Driver) AwaitConfirmation(ctx context.Context, deps driver.Deps, network shared.Network, txHash string) (*types.Receipt, error) { func (d *Driver) AwaitConfirmation(ctx context.Context, deps driver.Deps, network shared.Network, txHash string) (*types.Receipt, error) {
d.logger.Debug("await confirmation", d.logger.Debug("Awaiting confirmation",
zap.String("tx_hash", txHash), zap.String("tx_hash", txHash),
zap.String("network", network.Name), zap.String("network", network.Name),
) )
@@ -184,13 +173,12 @@ func (d *Driver) AwaitConfirmation(ctx context.Context, deps driver.Deps, networ
driverDeps.Logger = d.logger driverDeps.Logger = d.logger
receipt, err := evm.AwaitConfirmation(ctx, driverDeps, network, txHash) receipt, err := evm.AwaitConfirmation(ctx, driverDeps, network, txHash)
if err != nil { if err != nil {
d.logger.Warn("await confirmation failed", d.logger.Warn("Awaiting of confirmation failed", zap.Error(err),
zap.String("tx_hash", txHash), zap.String("tx_hash", txHash),
zap.String("network", network.Name), zap.String("network", network.Name),
zap.Error(err),
) )
} else if receipt != nil { } else if receipt != nil {
d.logger.Debug("await confirmation result", d.logger.Debug("Await confirmation result",
zap.String("tx_hash", txHash), zap.String("tx_hash", txHash),
zap.String("network", network.Name), zap.String("network", network.Name),
zap.Uint64("block_number", receipt.BlockNumber.Uint64()), zap.Uint64("block_number", receipt.BlockNumber.Uint64()),

View File

@@ -180,9 +180,6 @@ func (l *loggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, erro
} }
if resp.StatusCode >= 400 { if resp.StatusCode >= 400 {
l.logger.Warn("RPC response error", respFields...) l.logger.Warn("RPC response error", respFields...)
} else {
// Log response content so downstream parse failures can be inspected without debug logs.
l.logger.Warn("RPC response", respFields...)
} }
return resp, nil return resp, nil

View File

@@ -79,7 +79,7 @@ func toWallet(w *chainv1.ManagedWallet) wallet {
token := "" token := ""
contract := "" contract := ""
if asset != nil { if asset != nil {
chain = asset.GetChain().String() chain = chainNetworkValue(asset.GetChain())
token = asset.GetTokenSymbol() token = asset.GetTokenSymbol()
contract = asset.GetContractAddress() contract = asset.GetContractAddress()
} }
@@ -141,3 +141,15 @@ func tsToString(ts *timestamppb.Timestamp) string {
} }
return ts.AsTime().UTC().Format(time.RFC3339) return ts.AsTime().UTC().Format(time.RFC3339)
} }
func chainNetworkValue(chain chainv1.ChainNetwork) string {
name := chain.String()
if !strings.HasPrefix(name, "CHAIN_NETWORK_") {
return "unspecified"
}
trimmed := strings.TrimPrefix(name, "CHAIN_NETWORK_")
if trimmed == "" {
return "unspecified"
}
return strings.ToLower(trimmed)
}

View File

@@ -83,7 +83,9 @@ String fxSideToValue(FxSide side) {
} }
ChainNetwork chainNetworkFromValue(String? value) { ChainNetwork chainNetworkFromValue(String? value) {
switch (value) { final raw = value ?? '';
final normalized = _normalizeChainNetwork(raw);
switch (normalized) {
case 'ethereum_mainnet': case 'ethereum_mainnet':
return ChainNetwork.ethereumMainnet; return ChainNetwork.ethereumMainnet;
case 'arbitrum_one': case 'arbitrum_one':
@@ -95,7 +97,7 @@ ChainNetwork chainNetworkFromValue(String? value) {
case 'unspecified': case 'unspecified':
return ChainNetwork.unspecified; return ChainNetwork.unspecified;
default: default:
throw ArgumentError('Unknown ChainNetwork value: $value'); throw ArgumentError('Unknown ChainNetwork value: $raw');
} }
} }
@@ -114,6 +116,19 @@ String chainNetworkToValue(ChainNetwork chain) {
} }
} }
String _normalizeChainNetwork(String value) {
final trimmed = value.trim();
if (trimmed.isEmpty) {
return 'unspecified';
}
final lower = trimmed.toLowerCase();
const prefix = 'chain_network_';
if (lower.startsWith(prefix)) {
return lower.substring(prefix.length);
}
return lower;
}
InsufficientNetPolicy insufficientNetPolicyFromValue(String? value) { InsufficientNetPolicy insufficientNetPolicyFromValue(String? value) {
switch (value) { switch (value) {
case 'block_posting': case 'block_posting':

View File

@@ -0,0 +1,20 @@
import 'package:pshared/data/dto/wallet/asset.dart';
import 'package:pshared/data/mapper/payment/enums.dart';
import 'package:pshared/models/wallet/wallet.dart';
extension WalletAssetDTOMapper on WalletAssetDTO {
WalletAsset toDomain() => WalletAsset(
chain: chainNetworkFromValue(chain),
tokenSymbol: tokenSymbol,
contractAddress: contractAddress,
);
}
extension WalletAssetMapper on WalletAsset {
WalletAssetDTO toDTO() => WalletAssetDTO(
chain: chainNetworkToValue(chain),
tokenSymbol: tokenSymbol,
contractAddress: contractAddress,
);
}

View File

@@ -1,21 +1,17 @@
import 'package:pshared/data/dto/wallet/balance.dart'; import 'package:pshared/data/dto/wallet/balance.dart';
import 'package:pshared/data/dto/wallet/wallet.dart'; import 'package:pshared/data/dto/wallet/wallet.dart';
import 'package:pshared/data/mapper/wallet/asset.dart';
import 'package:pshared/data/mapper/wallet/balance.dart'; import 'package:pshared/data/mapper/wallet/balance.dart';
import 'package:pshared/data/mapper/wallet/money.dart'; import 'package:pshared/data/mapper/wallet/money.dart';
import 'package:pshared/models/describable.dart'; import 'package:pshared/models/describable.dart';
import 'package:pshared/models/wallet/wallet.dart'; import 'package:pshared/models/wallet/wallet.dart';
extension WalletDTOMapper on WalletDTO { extension WalletDTOMapper on WalletDTO {
WalletModel toDomain({WalletBalanceDTO? balance}) => WalletModel( WalletModel toDomain({WalletBalanceDTO? balance}) => WalletModel(
walletRef: walletRef, walletRef: walletRef,
organizationRef: organizationRef, organizationRef: organizationRef,
ownerRef: ownerRef, ownerRef: ownerRef,
asset: WalletAsset( asset: asset.toDomain(),
chain: asset.chain,
tokenSymbol: asset.tokenSymbol,
contractAddress: asset.contractAddress,
),
depositAddress: depositAddress, depositAddress: depositAddress,
status: status, status: status,
metadata: metadata, metadata: metadata,
@@ -24,7 +20,7 @@ extension WalletDTOMapper on WalletDTO {
balance: balance?.toDomain(), balance: balance?.toDomain(),
availableMoney: balance?.available?.toDomain(), availableMoney: balance?.available?.toDomain(),
describable: newDescribable( describable: newDescribable(
name: name.isNotEmpty ? name : (metadata?['name'] ?? 'Crypto Wallet'), name: name.isNotEmpty ? name : (metadata?['name']?.toString() ?? ''),
description: (description != null && description!.isNotEmpty) description: (description != null && description!.isNotEmpty)
? description ? description
: metadata?['description'], : metadata?['description'],

View File

@@ -1,10 +1,11 @@
import 'package:pshared/models/describable.dart';
import 'package:pshared/models/payment/chain_network.dart';
import 'package:pshared/models/wallet/balance.dart'; import 'package:pshared/models/wallet/balance.dart';
import 'package:pshared/models/wallet/money.dart'; import 'package:pshared/models/wallet/money.dart';
import 'package:pshared/models/describable.dart';
class WalletAsset { class WalletAsset {
final String chain; final ChainNetwork chain;
final String tokenSymbol; final String tokenSymbol;
final String contractAddress; final String contractAddress;

View File

@@ -1,9 +1,8 @@
import 'package:pshared/models/currency.dart';
import 'package:pshared/models/wallet/wallet.dart' as domain; import 'package:pshared/models/wallet/wallet.dart' as domain;
import 'package:pshared/models/currency.dart';
import 'package:pweb/models/wallet.dart'; import 'package:pweb/models/wallet.dart';
extension WalletUiMapper on domain.WalletModel { extension WalletUiMapper on domain.WalletModel {
Wallet toUi() { Wallet toUi() {
final amountStr = availableMoney?.amount ?? balance?.available?.amount ?? '0'; final amountStr = availableMoney?.amount ?? balance?.available?.amount ?? '0';

View File

@@ -1,6 +1,6 @@
import 'package:pshared/models/currency.dart'; import 'package:pshared/models/currency.dart';
import 'package:pshared/models/describable.dart'; import 'package:pshared/models/describable.dart';
import 'package:pshared/models/payment/chain_network.dart';
class Wallet implements Describable { class Wallet implements Describable {
final String id; final String id;
@@ -10,7 +10,7 @@ class Wallet implements Describable {
final bool isHidden; final bool isHidden;
final DateTime calculatedAt; final DateTime calculatedAt;
final String? depositAddress; final String? depositAddress;
final String? network; final ChainNetwork? network;
final String? tokenSymbol; final String? tokenSymbol;
final String? contractAddress; final String? contractAddress;
final Describable describable; final Describable describable;
@@ -42,7 +42,7 @@ class Wallet implements Describable {
String? walletUserID, String? walletUserID,
bool? isHidden, bool? isHidden,
String? depositAddress, String? depositAddress,
String? network, ChainNetwork? network,
String? tokenSymbol, String? tokenSymbol,
String? contractAddress, String? contractAddress,
Describable? describable, Describable? describable,

View File

@@ -2,9 +2,10 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
import 'package:pweb/providers/two_factor.dart'; import 'package:pweb/providers/two_factor.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class ResendCodeButton extends StatelessWidget { class ResendCodeButton extends StatelessWidget {
const ResendCodeButton({super.key}); const ResendCodeButton({super.key});

View File

@@ -1,16 +1,16 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pshared/models/payment/methods/data.dart';
import 'package:pshared/models/payment/methods/data.dart';
import 'package:pshared/models/payment/type.dart'; import 'package:pshared/models/payment/type.dart';
import 'package:pshared/models/recipient/status.dart'; import 'package:pshared/models/recipient/status.dart';
import 'package:pshared/models/recipient/type.dart'; import 'package:pshared/models/recipient/type.dart';
import 'package:pweb/utils/payment/label.dart';
import 'package:pweb/pages/address_book/form/method_tile.dart'; import 'package:pweb/pages/address_book/form/method_tile.dart';
import 'package:pweb/pages/address_book/form/widgets/button.dart'; import 'package:pweb/pages/address_book/form/widgets/button.dart';
import 'package:pweb/pages/address_book/form/widgets/email_field.dart'; import 'package:pweb/pages/address_book/form/widgets/email_field.dart';
import 'package:pweb/pages/address_book/form/widgets/header.dart'; import 'package:pweb/pages/address_book/form/widgets/header.dart';
import 'package:pweb/pages/address_book/form/widgets/name_field.dart'; import 'package:pweb/pages/address_book/form/widgets/name_field.dart';
import 'package:pweb/utils/payment/label.dart';
import 'package:pweb/generated/i18n/app_localizations.dart'; import 'package:pweb/generated/i18n/app_localizations.dart';

View File

@@ -1,8 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pshared/models/payment/chain_network.dart';
import 'package:pshared/utils/l10n/chain.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class BalanceHeader extends StatelessWidget { class BalanceHeader extends StatelessWidget {
final String? walletNetwork; final ChainNetwork? walletNetwork;
final String? tokenSymbol; final String? tokenSymbol;
const BalanceHeader({ const BalanceHeader({
@@ -15,14 +19,33 @@ class BalanceHeader extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final textTheme = Theme.of(context).textTheme; final textTheme = Theme.of(context).textTheme;
final colorScheme = Theme.of(context).colorScheme; final colorScheme = Theme.of(context).colorScheme;
final loc = AppLocalizations.of(context)!;
final symbol = tokenSymbol?.trim(); final symbol = tokenSymbol?.trim();
final networkLabel = (walletNetwork == null || walletNetwork == ChainNetwork.unspecified)
? null
: walletNetwork!.localizedName(context);
return Row( return Row(
children: [ children: [
Text( Expanded(
'Crypto Wallet', child: Column(
style: textTheme.titleMedium?.copyWith( crossAxisAlignment: CrossAxisAlignment.start,
color: colorScheme.onSurface, children: [
Text(
loc.paymentTypeCryptoWallet,
style: textTheme.titleMedium?.copyWith(
color: colorScheme.onSurface,
),
),
if (networkLabel != null)
Text(
networkLabel,
style: textTheme.bodySmall?.copyWith(
color: colorScheme.onSurfaceVariant,
fontWeight: FontWeight.w500,
),
),
],
), ),
), ),
if (symbol != null && symbol.isNotEmpty) ...[ if (symbol != null && symbol.isNotEmpty) ...[

View File

@@ -2,9 +2,10 @@ import 'package:flutter/material.dart';
import 'package:pshared/models/payment/type.dart'; import 'package:pshared/models/payment/type.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
import 'package:pweb/utils/payment/label.dart'; import 'package:pweb/utils/payment/label.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class PaymentMethodTypeSelector extends StatelessWidget { class PaymentMethodTypeSelector extends StatelessWidget {
final PaymentType? value; final PaymentType? value;

View File

@@ -2,9 +2,10 @@ import 'package:flutter/material.dart';
import 'package:pshared/models/payment/methods/russian_bank.dart'; import 'package:pshared/models/payment/methods/russian_bank.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
import 'package:pweb/utils/text_field_styles.dart'; import 'package:pweb/utils/text_field_styles.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class RussianBankForm extends StatefulWidget { class RussianBankForm extends StatefulWidget {
final void Function(RussianBankAccountPaymentMethod) onChanged; final void Function(RussianBankAccountPaymentMethod) onChanged;

View File

@@ -2,9 +2,10 @@ import 'package:flutter/material.dart';
import 'package:pshared/models/payment/methods/wallet.dart'; import 'package:pshared/models/payment/methods/wallet.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
import 'package:pweb/utils/text_field_styles.dart'; import 'package:pweb/utils/text_field_styles.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class WalletForm extends StatefulWidget { class WalletForm extends StatefulWidget {
final void Function(WalletPaymentMethod) onChanged; final void Function(WalletPaymentMethod) onChanged;

View File

@@ -7,12 +7,10 @@ class SectionTitle extends StatelessWidget {
const SectionTitle(this.title, {super.key}); const SectionTitle(this.title, {super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) => Text(
return Text( title,
title, style: Theme.of(context).textTheme.titleMedium?.copyWith(
style: Theme.of(context).textTheme.titleMedium?.copyWith( fontWeight: FontWeight.w600,
fontWeight: FontWeight.w600, ),
), );
);
}
} }

View File

@@ -3,12 +3,13 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:pshared/utils/currency.dart'; import 'package:pshared/utils/currency.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
import 'package:pweb/models/wallet.dart'; import 'package:pweb/models/wallet.dart';
import 'package:pweb/pages/dashboard/buttons/balance/amount.dart'; import 'package:pweb/pages/dashboard/buttons/balance/amount.dart';
import 'package:pweb/providers/wallets.dart'; import 'package:pweb/providers/wallets.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class WalletCard extends StatelessWidget { class WalletCard extends StatelessWidget {
final Wallet wallet; final Wallet wallet;

View File

@@ -5,6 +5,7 @@ import 'package:provider/provider.dart';
import 'package:pweb/app/router/payout_routes.dart'; import 'package:pweb/app/router/payout_routes.dart';
import 'package:pweb/providers/wallets.dart'; import 'package:pweb/providers/wallets.dart';
import 'package:pweb/widgets/sidebar/destinations.dart'; import 'package:pweb/widgets/sidebar/destinations.dart';
import 'package:pweb/generated/i18n/app_localizations.dart'; import 'package:pweb/generated/i18n/app_localizations.dart';

View File

@@ -4,6 +4,8 @@ import 'package:provider/provider.dart';
import 'package:pweb/providers/wallets.dart'; import 'package:pweb/providers/wallets.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class WalletEditHeader extends StatelessWidget { class WalletEditHeader extends StatelessWidget {
const WalletEditHeader({super.key}); const WalletEditHeader({super.key});
@@ -12,6 +14,7 @@ class WalletEditHeader extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final provider = context.watch<WalletsProvider>(); final provider = context.watch<WalletsProvider>();
final wallet = provider.selectedWallet; final wallet = provider.selectedWallet;
final loc = AppLocalizations.of(context)!;
if (wallet == null) { if (wallet == null) {
return const SizedBox.shrink(); return const SizedBox.shrink();
@@ -29,7 +32,7 @@ class WalletEditHeader extends StatelessWidget {
spacing: 4, spacing: 4,
children: [ children: [
Text( Text(
'Crypto Wallet', loc.paymentTypeCryptoWallet,
style: theme.textTheme.headlineMedium!.copyWith( style: theme.textTheme.headlineMedium!.copyWith(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),

View File

@@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:pweb/models/wallet.dart';
import 'package:pweb/models/wallet.dart';
import 'package:pweb/pages/payout_page/wallet/card.dart'; import 'package:pweb/pages/payout_page/wallet/card.dart';
import 'package:pweb/providers/wallets.dart'; import 'package:pweb/providers/wallets.dart';

View File

@@ -1,8 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
import 'package:pweb/models/edit_state.dart'; import 'package:pweb/models/edit_state.dart';
import 'package:pweb/utils/error/snackbar.dart'; import 'package:pweb/utils/error/snackbar.dart';

View File

@@ -1,8 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
import 'package:pweb/pages/settings/widgets/base.dart'; import 'package:pweb/pages/settings/widgets/base.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
const _kSearchThreshold = 12; const _kSearchThreshold = 12;

View File

@@ -1,6 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pshared/models/payment/chain_network.dart';
import 'package:pshared/utils/currency.dart'; import 'package:pshared/utils/currency.dart';
import 'package:pshared/utils/l10n/chain.dart';
import 'package:pweb/models/wallet.dart'; import 'package:pweb/models/wallet.dart';
import 'package:pweb/pages/wallet_top_up/details.dart'; import 'package:pweb/pages/wallet_top_up/details.dart';
@@ -25,7 +27,10 @@ class WalletTopUpContent extends StatelessWidget {
final theme = Theme.of(context); final theme = Theme.of(context);
final address = _resolveAddress(wallet); final address = _resolveAddress(wallet);
final network = wallet.network?.trim(); final network = wallet.network;
final networkLabel = (network == null || network == ChainNetwork.unspecified)
? null
: network.localizedName(context);
final assetLabel = wallet.tokenSymbol ?? currencyCodeToSymbol(wallet.currency); final assetLabel = wallet.tokenSymbol ?? currencyCodeToSymbol(wallet.currency);
return Align( return Align(
@@ -51,7 +56,7 @@ class WalletTopUpContent extends StatelessWidget {
SizedBox(height: dimensions.paddingLarge), SizedBox(height: dimensions.paddingLarge),
WalletTopUpMeta( WalletTopUpMeta(
assetLabel: assetLabel, assetLabel: assetLabel,
network: network, network: networkLabel,
walletId: wallet.walletUserID, walletId: wallet.walletUserID,
), ),
SizedBox(height: dimensions.paddingXLarge), SizedBox(height: dimensions.paddingXLarge),

View File

@@ -20,7 +20,7 @@ class WalletTopUpHeader extends StatelessWidget {
final symbol = tokenSymbol?.trim(); final symbol = tokenSymbol?.trim();
final subtitle = [ final subtitle = [
'Crypto Wallet', loc.paymentTypeCryptoWallet,
if (symbol != null && symbol.isNotEmpty) symbol, if (symbol != null && symbol.isNotEmpty) symbol,
].join(' · '); ].join(' · ');