diff --git a/liana-gui/src/app/state/export.rs b/liana-gui/src/app/state/export.rs index 046d8c2f..269044bf 100644 --- a/liana-gui/src/app/state/export.rs +++ b/liana-gui/src/app/state/export.rs @@ -8,7 +8,10 @@ use liana_ui::{component::modal::Modal, widget::Element}; use tokio::task::JoinHandle; use crate::{ - app::view::{export::export_modal, Close}, + app::{ + self, + view::{export::export_modal, Close}, + }, daemon::Daemon, export::{self, get_path, ImportExportMessage, ImportExportState, ImportExportType, Progress}, }; @@ -23,6 +26,34 @@ pub struct ExportModal { import_export_type: ImportExportType, } +impl app::state::psbt::Modal for ExportModal { + fn subscription(&self) -> Subscription { + self.subscription() + .map(|s| s.map(|m| app::Message::Export(ImportExportMessage::Progress(m)))) + .unwrap_or(Subscription::none()) + } + + fn update( + &mut self, + _daemon: Arc, + message: app::Message, + _tx: &mut crate::daemon::model::SpendTx, + ) -> Task { + if let app::Message::Export(m) = message { + self.update(m) + } else { + Task::none() + } + } + + fn view<'a>( + &'a self, + content: Element<'a, app::view::Message>, + ) -> Element<'a, app::view::Message> { + self.view(content) + } +} + impl ExportModal { #[allow(clippy::new_without_default)] pub fn new( diff --git a/liana-gui/src/app/state/psbt.rs b/liana-gui/src/app/state/psbt.rs index 7924b5be..48a6c637 100644 --- a/liana-gui/src/app/state/psbt.rs +++ b/liana-gui/src/app/state/psbt.rs @@ -19,6 +19,7 @@ use liana_ui::{ }; use crate::daemon::model::LabelsLoader; +use crate::export::{ImportExportMessage, ImportExportType}; use crate::{ app::{ cache::Cache, @@ -35,6 +36,8 @@ use crate::{ hw::{HardwareWallet, HardwareWallets}, }; +use super::export::ExportModal; + pub trait Modal { fn load(&self, _daemon: Arc) -> Task { Task::none() @@ -59,6 +62,7 @@ pub enum PsbtModal { Update(UpdateModal), Broadcast(BroadcastModal), Delete(DeleteModal), + Export(ExportModal), } impl<'a> AsRef for PsbtModal { @@ -69,6 +73,7 @@ impl<'a> AsRef for PsbtModal { Self::Update(a) => a, Self::Broadcast(a) => a, Self::Delete(a) => a, + Self::Export(a) => a, } } } @@ -81,6 +86,7 @@ impl<'a> AsMut for PsbtModal { Self::Update(a) => a, Self::Broadcast(a) => a, Self::Delete(a) => a, + Self::Export(a) => a, } } } @@ -135,6 +141,25 @@ impl PsbtState { message: Message, ) -> Task { match message { + Message::View(view::Message::ExportPsbt) => { + if self.modal.is_none() { + let psbt_str = self.tx.psbt.to_string(); + let modal = ExportModal::new(None, ImportExportType::ExportPsbt(psbt_str)); + let launch = modal.launch(true); + self.modal = Some(PsbtModal::Export(modal)); + return launch; + } + } + Message::View(view::Message::ImportExport(ImportExportMessage::Close)) => { + if matches!(self.modal, Some(PsbtModal::Export(_))) { + self.modal = None; + } + } + Message::View(view::Message::ImportExport(m)) => { + if let Some(PsbtModal::Export(modal)) = self.modal.as_mut() { + return modal.update(m); + } + } Message::View(view::Message::Spend(view::SpendTxMessage::Cancel)) => { if let Some(PsbtModal::Sign(SignModal { display_modal, .. })) = &mut self.modal { *display_modal = false; diff --git a/liana-gui/src/app/view/message.rs b/liana-gui/src/app/view/message.rs index d4a2833b..04a4780f 100644 --- a/liana-gui/src/app/view/message.rs +++ b/liana-gui/src/app/view/message.rs @@ -25,6 +25,7 @@ pub enum Message { ShowQrCode(usize), ImportExport(ImportExportMessage), HideRescanWarning, + ExportPsbt, } impl Close for Message { diff --git a/liana-gui/src/app/view/psbt.rs b/liana-gui/src/app/view/psbt.rs index 2114b625..4d22bf55 100644 --- a/liana-gui/src/app/view/psbt.rs +++ b/liana-gui/src/app/view/psbt.rs @@ -339,10 +339,10 @@ pub fn spend_overview_view<'a>( .spacing(5) .push( button::secondary( - Some(icon::clipboard_icon()), - "Copy", + Some(icon::backup_icon()), + "Export", ) - .on_press(Message::Clipboard(tx.psbt.to_string())), + .on_press(Message::ExportPsbt), ) .push( button::secondary(