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,9 +165,16 @@ impl PsbtState {
}
}
Message::View(view::Message::Spend(view::SpendTxMessage::Cancel)) => {
if let Some(PsbtModal::Sign(SignModal { display_modal, .. })) = &mut self.modal {
*display_modal = false;
return Task::none();
if let Some(PsbtModal::Sign(SignModal {
display_modal,
signing,
..
})) = &mut self.modal
{
if !signing.is_empty() {
*display_modal = false;
return Task::none();
}
}
self.modal = None;
@ -231,7 +238,15 @@ impl PsbtState {
Message::Updated(Ok(_)) => {
self.saved = true;
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 {
@ -271,6 +286,11 @@ impl PsbtState {
&self.wallet.keys_aliases,
self.labels_edited.cache(),
cache.network,
if let Some(PsbtModal::Sign(m)) = &self.modal {
m.is_signing()
} else {
false
},
self.warning.as_ref(),
);
if let Some(modal) = &self.modal {
@ -462,6 +482,10 @@ impl SignModal {
recovery_timelock,
}
}
pub fn is_signing(&self) -> bool {
!self.signing.is_empty()
}
}
impl Modal for SignModal {
@ -503,6 +527,7 @@ impl Modal for SignModal {
self.signing.remove(&fingerprint);
match res {
Err(e) => {
self.display_modal = true;
if !matches!(e, Error::HardwareWallet(async_hwi::Error::UserRefused)) {
self.error = Some(e)
}

View File

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

View File

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

View File

@ -37,6 +37,7 @@ pub fn spend_view<'a>(
key_aliases: &'a HashMap<Fingerprint, String>,
labels_editing: &'a HashMap<String, form::Value<String>>,
network: Network,
currently_signing: bool,
warning: Option<&Error>,
) -> Element<'a, Message> {
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(
Column::new()
.spacing(20)
@ -99,7 +105,11 @@ pub fn spend_view<'a>(
.push(
button::secondary(None, "Delete")
.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)
} else {
@ -107,13 +117,21 @@ pub fn spend_view<'a>(
.push(
button::secondary(None, "< Previous")
.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(
button::secondary(None, "Save")
.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)
}),