diff --git a/gui/src/installer/step/mod.rs b/gui/src/installer/step/mod.rs index 8fbaadaa..cfa579a5 100644 --- a/gui/src/installer/step/mod.rs +++ b/gui/src/installer/step/mod.rs @@ -20,7 +20,10 @@ use liana::miniscript::bitcoin::bip32::Fingerprint; use liana_ui::widget::*; -use crate::installer::{context::Context, message::Message, view}; +use crate::{ + bitcoind::Bitcoind, + installer::{context::Context, message::Message, view}, +}; pub trait Step { fn update(&mut self, _message: Message) -> Command { @@ -60,7 +63,7 @@ impl From for Box { pub struct Final { generating: bool, - context: Option, + internal_bitcoind: Option, warning: Option, config_path: Option, hot_signer_fingerprint: Fingerprint, @@ -70,7 +73,7 @@ pub struct Final { impl Final { pub fn new(hot_signer_fingerprint: Fingerprint) -> Self { Self { - context: None, + internal_bitcoind: None, generating: false, warning: None, config_path: None, @@ -82,7 +85,7 @@ impl Final { impl Step for Final { fn load_context(&mut self, ctx: &Context) { - self.context = Some(ctx.clone()); + self.internal_bitcoind = ctx.internal_bitcoind.clone(); if let Some(signer) = &ctx.recovered_signer { self.hot_signer_fingerprint = signer.fingerprint(); self.hot_signer_is_not_used = false; @@ -98,6 +101,13 @@ impl Step for Final { self.hot_signer_is_not_used = true; } } + fn load(&self) -> Command { + if !self.generating && self.config_path.is_none() { + Command::perform(async {}, |_| Message::Install) + } else { + Command::none() + } + } fn update(&mut self, message: Message) -> Command { match message { Message::Installed(res) => { @@ -107,7 +117,13 @@ impl Step for Final { self.config_path = None; self.warning = Some(e.to_string()); } - Ok(path) => self.config_path = Some(path), + Ok(path) => { + self.config_path = Some(path.clone()); + let internal_bitcoind = self.internal_bitcoind.clone(); + return Command::perform(async {}, move |_| { + Message::Exit(path.clone(), internal_bitcoind) + }); + } } } Message::Install => { @@ -121,20 +137,11 @@ impl Step for Final { } fn view(&self, progress: (usize, usize)) -> Element { - let ctx = self.context.as_ref().unwrap(); - let desc = ctx.descriptor.as_ref().unwrap().to_string(); view::install( progress, - ctx, - desc, self.generating, self.config_path.as_ref(), self.warning.as_ref(), - if self.hot_signer_is_not_used { - None - } else { - Some(self.hot_signer_fingerprint) - }, ) } } diff --git a/gui/src/installer/view.rs b/gui/src/installer/view.rs index eada4c36..3ee62d28 100644 --- a/gui/src/installer/view.rs +++ b/gui/src/installer/view.rs @@ -24,7 +24,6 @@ use crate::{ bitcoind::StartInternalBitcoindError, hw::HardwareWallet, installer::{ - context::Context, message::{self, Message}, prompt, step::{DownloadState, InstallState}, @@ -1090,158 +1089,27 @@ pub fn start_internal_bitcoind<'a>( pub fn install<'a>( progress: (usize, usize), - context: &Context, - descriptor: String, generating: bool, config_path: Option<&std::path::PathBuf>, warning: Option<&'a String>, - signer: Option, ) -> Element<'a, Message> { layout( progress, - "Final step", + "Finalize installation", Column::new() - .push(text( - "Check your information before finalizing the install process:", - )) - .push( - Container::new( - Column::new() - .spacing(10) - .push( - card::simple( - Column::new() - .spacing(5) - .push(text("Descriptor:").small().bold()) - .push(text(descriptor).small()), - ) - .width(Length::Fill), - ) - .push_maybe(if context.hws.is_empty() && signer.is_none() { - None - } else { - Some( - card::simple( - Column::new() - .spacing(5) - .push(text("Registered signing devices:").small().bold()) - .push_maybe(if context.hws.is_empty() { - None - } else { - Some(context.hws.iter().fold( - Column::new(), - |acc, hw| { - acc.push( - Row::new() - .spacing(5) - .push_maybe( - context.keys.iter().find_map(|k| { - if k.master_fingerprint == hw.1 - { - Some( - text(k.name.clone()) - .small() - .bold(), - ) - } else { - None - } - }), - ) - .push( - text(format!("#{}", hw.1)).small(), - ) - .push(text(hw.0.to_string()).small()), - ) - }, - )) - }) - .push_maybe(signer.as_ref().map(|fingerprint| { - Row::new() - .spacing(5) - .push_maybe(context.keys.iter().find_map(|k| { - if k.master_fingerprint == *fingerprint { - Some(text(k.name.clone()).small().bold()) - } else { - None - } - })) - .push(text(format!("#{}", fingerprint)).small()) - .push(text("This computer").small()) - })), - ) - .width(Length::Fill), - ) - }) - .push( - card::simple( - Column::new() - .push(text("Bitcoind:").small().bold()) - .push( - Row::new() - .spacing(5) - .align_items(Alignment::Center) - .push(text("Cookie path:").small()) - .push( - text(format!( - "{}", - context - .bitcoind_config - .as_ref() - .unwrap() - .cookie_path - .to_string_lossy() - )) - .small(), - ), - ) - .push( - Row::new() - .spacing(5) - .align_items(Alignment::Center) - .push(text("Address:").small()) - .push( - text(format!( - "{}", - context.bitcoind_config.as_ref().unwrap().addr - )) - .small(), - ), - ), - ) - .width(Length::Fill), - ), - ) - .max_width(1000), - ) - .push(Space::with_height(Length::Fixed(50.0))) .push_maybe(warning.map(|e| card::invalid(text(e)))) .push(if generating { - Container::new(button::primary(None, "Installing ...").width(Length::Fixed(200.0))) - } else if let Some(path) = config_path { + Container::new(text("Installing...")) + } else if config_path.is_some() { Container::new( - Column::new() - .push(Container::new(text("Installed !"))) - .push(Container::new( - button::primary(None, "Start") - .on_press(Message::Exit( - path.clone(), - context.internal_bitcoind.clone(), - )) - .width(Length::Fixed(200.0)), - )) + Row::new() + .spacing(10) .align_items(Alignment::Center) - .spacing(20), + .push(icon::circle_check_icon().style(color::GREEN)) + .push(text("Installed").style(color::GREEN)), ) - .padding(50) - .width(Length::Fill) - .center_x() } else { - Container::new( - button::primary(None, "Finalize installation") - .on_press(Message::Install) - .width(Length::Fixed(200.0)), - ) + Container::new(Space::with_height(Length::Fixed(25.0))) }) .spacing(10) .width(Length::Fill),