Add unregistered policy warning on hw list

close #369
This commit is contained in:
edouard 2023-04-03 20:01:12 +02:00
parent cbc03202ca
commit 3287488737
4 changed files with 149 additions and 50 deletions

View File

@ -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<Message> {
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<Message> {
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),
)

View File

@ -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),
))
},
))

View File

@ -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),
))
},
))

View File

@ -20,6 +20,7 @@ pub enum HardwareWallet {
kind: DeviceKind,
fingerprint: Fingerprint,
version: Option<Version>,
registered: Option<bool>,
},
}
@ -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::<ledger::TransportHID>::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 {