From 328748873768dc44a092cb61297471bcf6236447 Mon Sep 17 00:00:00 2001 From: edouard Date: Mon, 3 Apr 2023 20:01:12 +0200 Subject: [PATCH] Add unregistered policy warning on hw list close #369 --- gui/src/app/view/hw.rs | 129 ++++++++++++++++++++++++++++--- gui/src/app/view/settings.rs | 12 +-- gui/src/app/view/spend/detail.rs | 10 +-- gui/src/hw.rs | 48 ++++++------ 4 files changed, 149 insertions(+), 50 deletions(-) diff --git a/gui/src/app/view/hw.rs b/gui/src/app/view/hw.rs index 8ee703b9..c22f74fa 100644 --- a/gui/src/app/view/hw.rs +++ b/gui/src/app/view/hw.rs @@ -10,13 +10,116 @@ use liana_ui::{ use crate::{app::view::message::*, hw::HardwareWallet}; -pub fn hw_list_view<'a>( +pub fn hw_list_view( i: usize, - hw: &'a HardwareWallet, + hw: &HardwareWallet, chosen: bool, processing: bool, - status: Option<&'a str>, -) -> Element<'a, Message> { + signed: bool, +) -> Element { + let mut bttn = Button::new( + Row::new() + .push( + Column::new() + .push(text(format!("{}", hw.kind())).bold()) + .push(match hw { + HardwareWallet::Supported { + fingerprint, + version, + registered, + .. + } => Row::new() + .align_items(Alignment::Center) + .spacing(5) + .push(text(format!("fingerprint: {}", fingerprint)).small()) + .push_maybe( + version + .as_ref() + .map(|v| text(format!("version: {}", v)).small()), + ) + .push_maybe(registered.and_then(|registered| + if !registered { + Some(Row::new() + .spacing(5) + .align_items(Alignment::Center) + .push(text("unregistered").small()) + .push( + tooltip::Tooltip::new( + icon::warning_icon(), + "Policy is not registered on the device.\n You can register it in the settings.", + tooltip::Position::Bottom, + ).style(theme::Container::Card(theme::Card::Simple)))) + } else { + None + }) + ), + HardwareWallet::Unsupported { + version, message, .. + } => Row::new() + .spacing(5) + .push_maybe( + version + .as_ref() + .map(|v| text(format!("version: {}", v)).small()), + ) + .push( + tooltip::Tooltip::new( + icon::warning_icon(), + message, + tooltip::Position::Bottom, + ) + .style(theme::Container::Card(theme::Card::Simple)), + ), + }) + .spacing(5) + .width(Length::Fill), + ) + .push_maybe(if chosen && processing { + Some( + Column::new() + .push(text("Processing...")) + .push(text("Please check your device").small()), + ) + } else { + None + }) + .push_maybe(if signed { + Some( + Row::new() + .align_items(Alignment::Center) + .spacing(5) + .push(icon::circle_check_icon().style(color::legacy::SUCCESS)) + .push(text("Signed").style(color::legacy::SUCCESS)), + ) + } else { + None + }) + .align_items(Alignment::Center) + .width(Length::Fill), + ) + .padding(10) + .style(theme::Button::Secondary) + .width(Length::Fill); + if !processing { + if let HardwareWallet::Supported { registered, .. } = hw { + if *registered != Some(false) { + bttn = bttn.on_press(Message::SelectHardwareWallet(i)); + } + } + } + Container::new(bttn) + .width(Length::Fill) + .style(theme::Container::Card(theme::Card::Simple)) + .into() +} + +pub fn hw_list_view_for_registration( + i: usize, + hw: &HardwareWallet, + chosen: bool, + processing: bool, + registered: bool, +) -> Element { let mut bttn = Button::new( Row::new() .push( @@ -65,13 +168,17 @@ pub fn hw_list_view<'a>( } else { None }) - .push_maybe(status.map(|v| { - Row::new() - .align_items(Alignment::Center) - .spacing(5) - .push(icon::circle_check_icon().style(color::legacy::SUCCESS)) - .push(text(v).style(color::legacy::SUCCESS)) - })) + .push_maybe(if registered { + Some( + Row::new() + .align_items(Alignment::Center) + .spacing(5) + .push(icon::circle_check_icon().style(color::legacy::SUCCESS)) + .push(text("Registered").style(color::legacy::SUCCESS)), + ) + } else { + None + }) .align_items(Alignment::Center) .width(Length::Fill), ) diff --git a/gui/src/app/view/settings.rs b/gui/src/app/view/settings.rs index c1e014fd..6a97c720 100644 --- a/gui/src/app/view/settings.rs +++ b/gui/src/app/view/settings.rs @@ -644,18 +644,14 @@ pub fn register_wallet_modal<'a>( .push(hws.iter().enumerate().fold( Column::new().spacing(10), |col, (i, hw)| { - col.push(hw::hw_list_view( + col.push(hw::hw_list_view_for_registration( i, hw, Some(i) == chosen_hw, processing, - hw.fingerprint().and_then(|f| { - if registered.contains(&f) { - Some("Registered") - } else { - None - } - }), + hw.fingerprint() + .map(|f| registered.contains(&f)) + .unwrap_or(false), )) }, )) diff --git a/gui/src/app/view/spend/detail.rs b/gui/src/app/view/spend/detail.rs index a02b66e2..1e3b51b8 100644 --- a/gui/src/app/view/spend/detail.rs +++ b/gui/src/app/view/spend/detail.rs @@ -739,13 +739,9 @@ pub fn sign_action<'a>( hw, Some(i) == chosen_hw, processing, - hw.fingerprint().and_then(|f| { - if signed.contains(&f) { - Some("Signed") - } else { - None - } - }), + hw.fingerprint() + .map(|f| signed.contains(&f)) + .unwrap_or(false), )) }, )) diff --git a/gui/src/hw.rs b/gui/src/hw.rs index 383fe502..c7a68da2 100644 --- a/gui/src/hw.rs +++ b/gui/src/hw.rs @@ -20,6 +20,7 @@ pub enum HardwareWallet { kind: DeviceKind, fingerprint: Fingerprint, version: Option, + registered: Option, }, } @@ -33,6 +34,7 @@ impl HardwareWallet { kind, fingerprint, version, + registered: None, }) } @@ -110,25 +112,23 @@ pub async fn list_hardware_wallets( match ledger::LedgerSimulator::try_connect().await { Ok(mut device) => match device.get_master_fingerprint().await { Ok(fingerprint) => { - if let Some((name, descriptor)) = wallet { - device - .load_wallet( - name, - descriptor, - cfg.iter() - .find(|cfg| cfg.fingerprint == fingerprint) - .map(|cfg| cfg.token()), - ) - .expect("Configuration must be correct"); - } - let version = device.get_version().await.ok(); if ledger_version_supported(version.as_ref()) { + let mut registered = false; + if let Some((name, descriptor)) = wallet { + if let Some(cfg) = cfg.iter().find(|cfg| cfg.fingerprint == fingerprint) { + device + .load_wallet(name, descriptor, Some(cfg.token())) + .expect("Configuration must be correct"); + registered = true; + } + } hws.push(HardwareWallet::Supported { kind: device.device_kind(), fingerprint, device: Arc::new(device), version, + registered: Some(registered), }); } else { hws.push(HardwareWallet::Unsupported { @@ -160,25 +160,25 @@ pub async fn list_hardware_wallets( match ledger::Ledger::::connect(&api, detected) { Ok(mut device) => match device.get_master_fingerprint().await { Ok(fingerprint) => { - if let Some((name, descriptor)) = wallet { - device - .load_wallet( - name, - descriptor, - cfg.iter() - .find(|cfg| cfg.fingerprint == fingerprint) - .map(|cfg| cfg.token()), - ) - .expect("Configuration must be correct"); - } - let version = device.get_version().await.ok(); if ledger_version_supported(version.as_ref()) { + let mut registered = false; + if let Some((name, descriptor)) = wallet { + if let Some(cfg) = + cfg.iter().find(|cfg| cfg.fingerprint == fingerprint) + { + device + .load_wallet(name, descriptor, Some(cfg.token())) + .expect("Configuration must be correct"); + registered = true; + } + } hws.push(HardwareWallet::Supported { kind: device.device_kind(), fingerprint, device: Arc::new(device), version, + registered: Some(registered), }); } else { hws.push(HardwareWallet::Unsupported {