feat(ui): Wallet menu overlay — info, xpub, and password-protected seed reveal
Add a Wallet menu item (between File and Settings) that opens an in-app overlay showing wallet metadata: file name, network, type (HD seed / xprv / WIF / watch-only), script kind, derivation path, master fingerprint, and account xpub. Includes a seed section: if the wallet has no seed, a note is shown; if it has one and is unencrypted the seed is revealed directly; if encrypted the user must enter the wallet file password before the mnemonic is displayed. The revealed seed is shown in a danger-coloured bordered box with a warning. Closing the overlay (backdrop, Close button, or Esc) always clears the password input and hides the seed. Also adds the private-key password-prompt overlay and its localization keys (shared UI scaffolding used by the following commit).
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
using System.IO;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using PalladiumWallet.App.Localization;
|
||||
|
||||
namespace PalladiumWallet.App.ViewModels;
|
||||
|
||||
public partial class MainWindowViewModel
|
||||
{
|
||||
[ObservableProperty]
|
||||
private bool isWalletInfoOpen;
|
||||
|
||||
[ObservableProperty]
|
||||
private string walletInfoSeedPasswordInput = "";
|
||||
|
||||
[ObservableProperty]
|
||||
private bool isWalletInfoSeedRevealed;
|
||||
|
||||
[ObservableProperty]
|
||||
private string walletInfoSeedError = "";
|
||||
|
||||
// ---- computed wallet info (populated when overlay opens) ----
|
||||
|
||||
public string WalletInfoFileName =>
|
||||
_walletPath is null ? "" :
|
||||
Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(_walletPath));
|
||||
|
||||
public string WalletInfoNetwork => _doc?.Network ?? "";
|
||||
|
||||
public string WalletInfoType
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_doc is null) return "";
|
||||
if (_doc.Mnemonic is not null) return Loc.Tr("walletinfo.type.seed");
|
||||
if (_doc.AccountXprv is not null) return Loc.Tr("walletinfo.type.xprv");
|
||||
if (_doc.WifKeys is { Count: > 0 }) return Loc.Tr("walletinfo.type.wif");
|
||||
return Loc.Tr("walletinfo.type.watchonly");
|
||||
}
|
||||
}
|
||||
|
||||
public string WalletInfoScriptKind => _doc?.ScriptKind ?? "";
|
||||
|
||||
public string WalletInfoDerivPath => _doc?.AccountPath ?? "";
|
||||
|
||||
public string WalletInfoXpub => _doc?.AccountXpub ?? "";
|
||||
|
||||
public string WalletInfoFingerprint => _doc?.MasterFingerprint ?? "";
|
||||
|
||||
public bool WalletInfoHasSeed => _doc?.Mnemonic is not null;
|
||||
|
||||
public bool WalletInfoSeedNeedsPassword => !string.IsNullOrEmpty(_password);
|
||||
|
||||
public string WalletInfoSeedText => IsWalletInfoSeedRevealed ? (_doc?.Mnemonic ?? "") : "";
|
||||
|
||||
public bool WalletInfoHasPassphrase => !string.IsNullOrEmpty(_doc?.Passphrase);
|
||||
|
||||
[RelayCommand]
|
||||
private void OpenWalletInfo()
|
||||
{
|
||||
WalletInfoSeedPasswordInput = "";
|
||||
IsWalletInfoSeedRevealed = false;
|
||||
WalletInfoSeedError = "";
|
||||
OnPropertyChanged(nameof(WalletInfoFileName));
|
||||
OnPropertyChanged(nameof(WalletInfoNetwork));
|
||||
OnPropertyChanged(nameof(WalletInfoType));
|
||||
OnPropertyChanged(nameof(WalletInfoScriptKind));
|
||||
OnPropertyChanged(nameof(WalletInfoDerivPath));
|
||||
OnPropertyChanged(nameof(WalletInfoXpub));
|
||||
OnPropertyChanged(nameof(WalletInfoFingerprint));
|
||||
OnPropertyChanged(nameof(WalletInfoHasSeed));
|
||||
OnPropertyChanged(nameof(WalletInfoSeedNeedsPassword));
|
||||
OnPropertyChanged(nameof(WalletInfoHasPassphrase));
|
||||
IsWalletInfoOpen = true;
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private void CloseWalletInfo()
|
||||
{
|
||||
IsWalletInfoOpen = false;
|
||||
WalletInfoSeedPasswordInput = "";
|
||||
IsWalletInfoSeedRevealed = false;
|
||||
WalletInfoSeedError = "";
|
||||
OnPropertyChanged(nameof(WalletInfoSeedText));
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private void RevealSeed()
|
||||
{
|
||||
if (_doc?.Mnemonic is null) return;
|
||||
|
||||
if (WalletInfoSeedNeedsPassword)
|
||||
{
|
||||
if (WalletInfoSeedPasswordInput != _password)
|
||||
{
|
||||
WalletInfoSeedError = Loc.Tr("msg.wrongpassword");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
WalletInfoSeedError = "";
|
||||
IsWalletInfoSeedRevealed = true;
|
||||
OnPropertyChanged(nameof(WalletInfoSeedText));
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private void HideSeed()
|
||||
{
|
||||
IsWalletInfoSeedRevealed = false;
|
||||
WalletInfoSeedPasswordInput = "";
|
||||
WalletInfoSeedError = "";
|
||||
OnPropertyChanged(nameof(WalletInfoSeedText));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user