diff --git a/liana-gui/src/installer/step/descriptor/editor/key.rs b/liana-gui/src/installer/step/descriptor/editor/key.rs index 599d8a77..0cb3efed 100644 --- a/liana-gui/src/installer/step/descriptor/editor/key.rs +++ b/liana-gui/src/installer/step/descriptor/editor/key.rs @@ -75,6 +75,8 @@ pub struct EditXpubModal { // store `form_token_warning` directly in `form_token`. form_token: form::Value, form_token_warning: Option, + /// The `KeySourceKind` corresponding to the required form for entering a new key. + form_key_source_kind: Option, other_path_keys: HashSet, duplicate_master_fg: bool, @@ -84,7 +86,6 @@ pub struct EditXpubModal { hot_signer: Arc>, hot_signer_fingerprint: Fingerprint, chosen_signer: Option, - chosen_key_source_kind: Option, } impl EditXpubModal { @@ -124,12 +125,12 @@ impl EditXpubModal { .unwrap_or_default(), }, form_token_warning: None, + form_key_source_kind: None, // no form will be shown until user clicks on required option keys, keys_coordinate, processing: false, error: None, network, - chosen_key_source_kind: key.as_ref().map(|k| k.source.kind()), chosen_signer: key, hot_signer_fingerprint, hot_signer, @@ -163,7 +164,7 @@ impl super::DescriptorEditModal for EditXpubModal { }) = hws.list.get(i) { self.processing = true; - self.chosen_key_source_kind = Some(KeySourceKind::Device); + self.form_key_source_kind = None; let device_version = version.clone(); let fingerprint = *fingerprint; let device_kind = *kind; @@ -211,7 +212,7 @@ impl super::DescriptorEditModal for EditXpubModal { return self.load(); } Message::UseHotSigner => { - self.chosen_key_source_kind = Some(KeySourceKind::HotSigner); + self.form_key_source_kind = None; let fingerprint = self.hot_signer.lock().unwrap().fingerprint(); let derivation_path = default_derivation_path(self.network); let key_str = format!( @@ -250,7 +251,7 @@ impl super::DescriptorEditModal for EditXpubModal { // If it is a provider key that has just been fetched, do some additional sanity checks. if let Some(key_kind) = key.source.provider_key_kind() { // We don't need to check key's status as redeemed keys are not returned. - self.form_token_warning = if self.chosen_key_source_kind + self.form_token_warning = if self.form_key_source_kind != Some(KeySourceKind::Token(key_kind)) { Some("Wrong kind of token".to_string()) @@ -295,12 +296,12 @@ impl super::DescriptorEditModal for EditXpubModal { } message::ImportKeyModal::ManuallyImportXpub => { self.chosen_signer = None; - self.chosen_key_source_kind = Some(KeySourceKind::Manual); + self.form_key_source_kind = Some(KeySourceKind::Manual); self.form_xpub = form::Value::default(); } message::ImportKeyModal::UseToken(kind) => { self.chosen_signer = None; - self.chosen_key_source_kind = Some(KeySourceKind::Token(kind)); + self.form_key_source_kind = Some(KeySourceKind::Token(kind)); self.form_token = form::Value::default(); } message::ImportKeyModal::NameEdited(name) => { @@ -323,8 +324,8 @@ impl super::DescriptorEditModal for EditXpubModal { self.form_token.value = s; } message::ImportKeyModal::XPubEdited(s) => { + self.chosen_signer = None; if let Ok(DescriptorPublicKey::XPub(key)) = DescriptorPublicKey::from_str(&s) { - self.chosen_signer = None; if !key.derivation_path.is_master() { self.form_xpub.valid = false; } else if let Some((fingerprint, _)) = key.origin { @@ -403,7 +404,7 @@ impl super::DescriptorEditModal for EditXpubModal { message::ImportKeyModal::SelectKey(i) => { if let Some(key) = self.keys.get(i) { self.chosen_signer = Some(key.clone()); - self.chosen_key_source_kind = Some(key.source.kind()); + self.form_key_source_kind = None; self.form_name.value.clone_from(&key.name); self.form_name.valid = true; } @@ -497,7 +498,6 @@ impl super::DescriptorEditModal for EditXpubModal { .collect(), self.error.as_ref(), self.chosen_signer.as_ref().map(|s| s.fingerprint), - self.chosen_key_source_kind.as_ref(), &self.hot_signer_fingerprint, self.keys.iter().find_map(|k| { if k.fingerprint == self.hot_signer_fingerprint { @@ -510,6 +510,7 @@ impl super::DescriptorEditModal for EditXpubModal { &self.form_xpub, &self.form_token, self.form_token_warning.as_ref(), + self.form_key_source_kind.as_ref(), self.duplicate_master_fg, ) } diff --git a/liana-gui/src/installer/view/editor/mod.rs b/liana-gui/src/installer/view/editor/mod.rs index 3464258d..6e432406 100644 --- a/liana-gui/src/installer/view/editor/mod.rs +++ b/liana-gui/src/installer/view/editor/mod.rs @@ -261,7 +261,7 @@ pub fn undefined_key<'a>( fn maybe_key_from_token<'a>( path_kind: PathKind, - chosen_key_source_kind: Option<&KeySourceKind>, + form_key_source_kind: Option<&KeySourceKind>, has_chosen_signer: bool, form_token: &form::Value, form_token_warning: Option<&'a String>, @@ -271,7 +271,7 @@ fn maybe_key_from_token<'a>( None } else { Some( - match (chosen_key_source_kind, has_chosen_signer) { + match (form_key_source_kind, has_chosen_signer) { (Some(KeySourceKind::Token(key_kind)), false) => card::simple( Column::new() .spacing(10) @@ -343,13 +343,13 @@ pub fn edit_key_modal<'a>( provider_keys: Vec>, error: Option<&Error>, chosen_signer: Option, - chosen_key_source_kind: Option<&KeySourceKind>, hot_signer_fingerprint: &Fingerprint, signer_alias: Option<&'a String>, form_name: &'a form::Value, form_xpub: &form::Value, form_token: &form::Value, form_token_warning: Option<&'a String>, + form_key_source_kind: Option<&KeySourceKind>, duplicate_master_fg: bool, ) -> Element<'a, Message> { let content = Column::new() @@ -386,7 +386,7 @@ pub fn edit_key_modal<'a>( ) .push_maybe(if !path_kind.can_choose_key_source_kind(&KeySourceKind::Manual) { None - } else if chosen_key_source_kind == Some(&KeySourceKind::Manual) && chosen_signer.is_none() { + } else if form_key_source_kind == Some(&KeySourceKind::Manual) { Some(card::simple(Column::new() .spacing(10) .push( @@ -433,8 +433,8 @@ pub fn edit_key_modal<'a>( )) } ) - .push_maybe(maybe_key_from_token(path_kind, chosen_key_source_kind, chosen_signer.is_some(), form_token, form_token_warning, services::api::KeyKind::SafetyNet)) - .push_maybe(maybe_key_from_token(path_kind, chosen_key_source_kind, chosen_signer.is_some(), form_token, form_token_warning, services::api::KeyKind::Cosigner)) + .push_maybe(maybe_key_from_token(path_kind, form_key_source_kind, chosen_signer.is_some(), form_token, form_token_warning, services::api::KeyKind::SafetyNet)) + .push_maybe(maybe_key_from_token(path_kind, form_key_source_kind, chosen_signer.is_some(), form_token, form_token_warning, services::api::KeyKind::Cosigner)) .width(Length::Fill), ) .push_maybe(