Make user finish sign process before opening new modal

This commit is contained in:
edouardparis 2025-05-23 16:56:20 +02:00
parent 1d1a281955
commit 874d2d4068
4 changed files with 84 additions and 13 deletions

View File

@ -165,10 +165,17 @@ impl PsbtState {
} }
} }
Message::View(view::Message::Spend(view::SpendTxMessage::Cancel)) => { Message::View(view::Message::Spend(view::SpendTxMessage::Cancel)) => {
if let Some(PsbtModal::Sign(SignModal { display_modal, .. })) = &mut self.modal { if let Some(PsbtModal::Sign(SignModal {
display_modal,
signing,
..
})) = &mut self.modal
{
if !signing.is_empty() {
*display_modal = false; *display_modal = false;
return Task::none(); return Task::none();
} }
}
self.modal = None; self.modal = None;
} }
@ -231,7 +238,15 @@ impl PsbtState {
Message::Updated(Ok(_)) => { Message::Updated(Ok(_)) => {
self.saved = true; self.saved = true;
if let Some(modal) = self.modal.as_mut() { if let Some(modal) = self.modal.as_mut() {
return modal.as_mut().update(daemon.clone(), message, &mut self.tx); let cmd = modal.as_mut().update(daemon.clone(), message, &mut self.tx);
// if modal is only the pending notif then we remove it once the psbt was
// updated.
if let PsbtModal::Sign(SignModal { display_modal, .. }) = modal {
if !*display_modal {
self.modal = None;
}
}
return cmd;
} }
} }
Message::BroadcastModal(res) => match res { Message::BroadcastModal(res) => match res {
@ -271,6 +286,11 @@ impl PsbtState {
&self.wallet.keys_aliases, &self.wallet.keys_aliases,
self.labels_edited.cache(), self.labels_edited.cache(),
cache.network, cache.network,
if let Some(PsbtModal::Sign(m)) = &self.modal {
m.is_signing()
} else {
false
},
self.warning.as_ref(), self.warning.as_ref(),
); );
if let Some(modal) = &self.modal { if let Some(modal) = &self.modal {
@ -462,6 +482,10 @@ impl SignModal {
recovery_timelock, recovery_timelock,
} }
} }
pub fn is_signing(&self) -> bool {
!self.signing.is_empty()
}
} }
impl Modal for SignModal { impl Modal for SignModal {
@ -503,6 +527,7 @@ impl Modal for SignModal {
self.signing.remove(&fingerprint); self.signing.remove(&fingerprint);
match res { match res {
Err(e) => { Err(e) => {
self.display_modal = true;
if !matches!(e, Error::HardwareWallet(async_hwi::Error::UserRefused)) { if !matches!(e, Error::HardwareWallet(async_hwi::Error::UserRefused)) {
self.error = Some(e) self.error = Some(e)
} }

View File

@ -1018,6 +1018,11 @@ impl Step for SaveSpend {
&psbt_state.wallet.keys_aliases, &psbt_state.wallet.keys_aliases,
psbt_state.labels_edited.cache(), psbt_state.labels_edited.cache(),
cache.network, cache.network,
if let Some(psbt::PsbtModal::Sign(m)) = &psbt_state.modal {
m.is_signing()
} else {
false
},
psbt_state.warning.as_ref(), psbt_state.warning.as_ref(),
); );
if let Some(modal) = &psbt_state.modal { if let Some(modal) = &psbt_state.modal {

View File

@ -46,6 +46,7 @@ pub fn psbt_view<'a>(
key_aliases: &'a HashMap<Fingerprint, String>, key_aliases: &'a HashMap<Fingerprint, String>,
labels_editing: &'a HashMap<String, form::Value<String>>, labels_editing: &'a HashMap<String, form::Value<String>>,
network: Network, network: Network,
currently_signing: bool,
warning: Option<&Error>, warning: Option<&Error>,
) -> Element<'a, Message> { ) -> Element<'a, Message> {
dashboard( dashboard(
@ -72,7 +73,12 @@ pub fn psbt_view<'a>(
}), }),
) )
.push(spend_header(tx, labels_editing)) .push(spend_header(tx, labels_editing))
.push(spend_overview_view(tx, desc_info, key_aliases)) .push(spend_overview_view(
tx,
desc_info,
key_aliases,
currently_signing,
))
.push( .push(
Column::new() Column::new()
.spacing(20) .spacing(20)
@ -96,7 +102,11 @@ pub fn psbt_view<'a>(
.push( .push(
button::secondary(None, "Delete") button::secondary(None, "Delete")
.width(Length::Fixed(200.0)) .width(Length::Fixed(200.0))
.on_press(Message::Spend(SpendTxMessage::Delete)), .on_press_maybe(if currently_signing {
None
} else {
Some(Message::Spend(SpendTxMessage::Delete))
}),
) )
.width(Length::Fill) .width(Length::Fill)
} else { } else {
@ -105,7 +115,11 @@ pub fn psbt_view<'a>(
.push( .push(
button::secondary(None, "Save") button::secondary(None, "Save")
.width(Length::Fixed(150.0)) .width(Length::Fixed(150.0))
.on_press(Message::Spend(SpendTxMessage::Save)), .on_press_maybe(if currently_signing {
None
} else {
Some(Message::Spend(SpendTxMessage::Save))
}),
) )
.width(Length::Fill) .width(Length::Fill)
}) })
@ -321,6 +335,7 @@ pub fn spend_overview_view<'a>(
tx: &'a SpendTx, tx: &'a SpendTx,
desc_info: &'a LianaPolicy, desc_info: &'a LianaPolicy,
key_aliases: &'a HashMap<Fingerprint, String>, key_aliases: &'a HashMap<Fingerprint, String>,
currently_signing: bool,
) -> Element<'a, Message> { ) -> Element<'a, Message> {
Column::new() Column::new()
.spacing(20) .spacing(20)
@ -343,14 +358,22 @@ pub fn spend_overview_view<'a>(
Some(icon::backup_icon()), Some(icon::backup_icon()),
"Export", "Export",
) )
.on_press(Message::ExportPsbt), .on_press_maybe(if currently_signing {
None
} else {
Some(Message::ExportPsbt)
}),
) )
.push( .push(
button::secondary( button::secondary(
Some(icon::restore_icon()), Some(icon::restore_icon()),
"Import", "Import",
) )
.on_press(Message::ImportPsbt), .on_press_maybe(if currently_signing {
None
} else {
Some(Message::ImportPsbt)
}),
), ),
) )
.align_y(Alignment::Center), .align_y(Alignment::Center),

View File

@ -37,6 +37,7 @@ pub fn spend_view<'a>(
key_aliases: &'a HashMap<Fingerprint, String>, key_aliases: &'a HashMap<Fingerprint, String>,
labels_editing: &'a HashMap<String, form::Value<String>>, labels_editing: &'a HashMap<String, form::Value<String>>,
network: Network, network: Network,
currently_signing: bool,
warning: Option<&Error>, warning: Option<&Error>,
) -> Element<'a, Message> { ) -> Element<'a, Message> {
let is_recovery = tx let is_recovery = tx
@ -75,7 +76,12 @@ pub fn spend_view<'a>(
}, },
)) ))
}) })
.push(psbt::spend_overview_view(tx, desc_info, key_aliases)) .push(psbt::spend_overview_view(
tx,
desc_info,
key_aliases,
currently_signing,
))
.push( .push(
Column::new() Column::new()
.spacing(20) .spacing(20)
@ -99,7 +105,11 @@ pub fn spend_view<'a>(
.push( .push(
button::secondary(None, "Delete") button::secondary(None, "Delete")
.width(Length::Fixed(200.0)) .width(Length::Fixed(200.0))
.on_press(Message::Spend(SpendTxMessage::Delete)), .on_press_maybe(if currently_signing {
None
} else {
Some(Message::Spend(SpendTxMessage::Delete))
}),
) )
.width(Length::Fill) .width(Length::Fill)
} else { } else {
@ -107,13 +117,21 @@ pub fn spend_view<'a>(
.push( .push(
button::secondary(None, "< Previous") button::secondary(None, "< Previous")
.width(Length::Fixed(150.0)) .width(Length::Fixed(150.0))
.on_press(Message::Previous), .on_press_maybe(if currently_signing {
None
} else {
Some(Message::Previous)
}),
) )
.push(Space::with_width(Length::Fill)) .push(Space::with_width(Length::Fill))
.push( .push(
button::secondary(None, "Save") button::secondary(None, "Save")
.width(Length::Fixed(150.0)) .width(Length::Fixed(150.0))
.on_press(Message::Spend(SpendTxMessage::Save)), .on_press_maybe(if currently_signing {
None
} else {
Some(Message::Spend(SpendTxMessage::Save))
}),
) )
.width(Length::Fill) .width(Length::Fill)
}), }),