diff --git a/liana-gui/src/app/state/export.rs b/liana-gui/src/app/state/export.rs index 4dc54fec..5e8a01c3 100644 --- a/liana-gui/src/app/state/export.rs +++ b/liana-gui/src/app/state/export.rs @@ -8,7 +8,7 @@ use liana_ui::{component::modal::Modal, widget::Element}; use tokio::task::JoinHandle; use crate::{ - app::view::{self, export::export_modal}, + app::view::{export::export_modal, Close}, daemon::Daemon, export::{self, get_path, ImportExportMessage, ImportExportState, ImportExportType, Progress}, }; @@ -129,7 +129,11 @@ impl ExportModal { } Task::none() } - pub fn view<'a>(&'a self, content: Element<'a, view::Message>) -> Element { + + pub fn view<'a, M>(&'a self, content: Element<'a, M>) -> Element + where + M: 'a + Close + Clone + From, + { let modal = Modal::new( content, export_modal(&self.state, self.error.as_ref(), self.modal_title()), @@ -138,7 +142,7 @@ impl ExportModal { ImportExportState::TimedOut | ImportExportState::Aborted | ImportExportState::Ended - | ImportExportState::Closed => modal.on_blur(Some(view::Message::Close)), + | ImportExportState::Closed => modal.on_blur(Some(M::close())), _ => modal, } .into() diff --git a/liana-gui/src/app/view/export.rs b/liana-gui/src/app/view/export.rs index 5a5673fe..62c63d6f 100644 --- a/liana-gui/src/app/view/export.rs +++ b/liana-gui/src/app/view/export.rs @@ -11,11 +11,10 @@ use liana_ui::{ widget::Element, }; -use crate::export::{Error, ImportExportMessage}; -use crate::{app::view::message::Message, export::ImportExportState}; +use crate::export::{Error, ImportExportMessage, ImportExportState}; /// Return the modal view for an export task -pub fn export_modal<'a>( +pub fn export_modal<'a, Message: From + Clone + 'a>( state: &ImportExportState, error: Option<&'a Error>, export_type: &str, diff --git a/liana-gui/src/app/view/message.rs b/liana-gui/src/app/view/message.rs index d7a46010..6ff27a6c 100644 --- a/liana-gui/src/app/view/message.rs +++ b/liana-gui/src/app/view/message.rs @@ -1,6 +1,10 @@ use crate::{app::menu::Menu, export::ImportExportMessage, node::bitcoind::RpcAuthType}; use liana::miniscript::bitcoin::{bip32::Fingerprint, OutPoint}; +pub trait Close { + fn close() -> Self; +} + #[derive(Debug, Clone)] pub enum Message { Reload, @@ -22,6 +26,12 @@ pub enum Message { ImportExport(ImportExportMessage), } +impl Close for Message { + fn close() -> Self { + Self::Close + } +} + #[derive(Debug, Clone)] pub enum LabelMessage { Edited(String), diff --git a/liana-gui/src/installer/message.rs b/liana-gui/src/installer/message.rs index 56828ee6..414532ac 100644 --- a/liana-gui/src/installer/message.rs +++ b/liana-gui/src/installer/message.rs @@ -7,7 +7,9 @@ use std::path::PathBuf; use super::{context, Error}; use crate::{ app::settings::ProviderKey, + app::view::Close, download::{DownloadError, Progress}, + export::ImportExportMessage, hw::HardwareWalletMessage, installer::descriptor::{Key, PathKind}, lianalite::client::{auth::AuthClient, backend::api}, @@ -49,6 +51,19 @@ pub enum Message { RedeemNextKey, KeyRedeemed(ProviderKey, Result<(), services::Error>), AllKeysRedeemed, + ImportExport(ImportExportMessage), +} + +impl Close for Message { + fn close() -> Self { + Self::Close + } +} + +impl From for Message { + fn from(value: ImportExportMessage) -> Self { + Self::ImportExport(value) + } } #[derive(Debug, Clone)]