gui: integrate PSBT export instead copy to clipboard

This commit is contained in:
pythcoiner 2025-04-08 11:16:21 +02:00
parent 64fcf34154
commit 0796efae19
No known key found for this signature in database
GPG Key ID: C1048AEEDF303B88
4 changed files with 61 additions and 4 deletions

View File

@ -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<app::Message> {
self.subscription()
.map(|s| s.map(|m| app::Message::Export(ImportExportMessage::Progress(m))))
.unwrap_or(Subscription::none())
}
fn update(
&mut self,
_daemon: Arc<dyn Daemon + Sync + Send>,
message: app::Message,
_tx: &mut crate::daemon::model::SpendTx,
) -> Task<app::Message> {
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(

View File

@ -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<dyn Daemon + Sync + Send>) -> Task<Message> {
Task::none()
@ -59,6 +62,7 @@ pub enum PsbtModal {
Update(UpdateModal),
Broadcast(BroadcastModal),
Delete(DeleteModal),
Export(ExportModal),
}
impl<'a> AsRef<dyn Modal + 'a> for PsbtModal {
@ -69,6 +73,7 @@ impl<'a> AsRef<dyn Modal + 'a> 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<dyn Modal + 'a> 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<Message> {
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;

View File

@ -25,6 +25,7 @@ pub enum Message {
ShowQrCode(usize),
ImportExport(ImportExportMessage),
HideRescanWarning,
ExportPsbt,
}
impl Close for Message {

View File

@ -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(