Skip to content

Commit a0f5723

Browse files
committed
installer: add wallet export feature at descriptor registration step
1 parent 8767879 commit a0f5723

File tree

3 files changed

+77
-8
lines changed

3 files changed

+77
-8
lines changed

liana-gui/src/installer/message.rs

+10
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use std::path::PathBuf;
77
use super::{context, Error};
88
use crate::{
99
download::{DownloadError, Progress},
10+
export::ImportExportMessage,
1011
hw::HardwareWalletMessage,
1112
installer::step::descriptor::editor::key::Key,
1213
lianalite::client::{auth::AuthClient, backend::api},
@@ -44,6 +45,15 @@ pub enum Message {
4445
WalletRegistered(Result<(Fingerprint, Option<[u8; 32]>), Error>),
4546
MnemonicWord(usize, String),
4647
ImportMnemonic(bool),
48+
BackupWallet,
49+
ExportWallet(String),
50+
ImportExport(ImportExportMessage),
51+
}
52+
53+
impl From<ImportExportMessage> for Message {
54+
fn from(value: ImportExportMessage) -> Self {
55+
Message::ImportExport(value)
56+
}
4757
}
4858

4959
#[derive(Debug, Clone)]

liana-gui/src/installer/step/descriptor/mod.rs

+56-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ use liana_ui::{component::form, widget::Element};
1616
use async_hwi::DeviceKind;
1717

1818
use crate::{
19-
app::wallet::wallet_name,
19+
app::{state::export::ExportModal, wallet::wallet_name},
20+
backup::Backup,
21+
export::{ImportExportMessage, ImportExportType},
2022
hw::{HardwareWallet, HardwareWallets},
2123
installer::{
2224
message::{self, Message},
@@ -302,12 +304,62 @@ pub struct BackupDescriptor {
302304
done: bool,
303305
descriptor: Option<LianaDescriptor>,
304306
key_aliases: HashMap<Fingerprint, String>,
307+
modal: Option<ExportModal>,
305308
}
306309

307310
impl Step for BackupDescriptor {
308-
fn update(&mut self, _hws: &mut HardwareWallets, message: Message) -> Task<Message> {
309-
if let Message::UserActionDone(done) = message {
310-
self.done = done;
311+
fn subscription(&self, _hws: &HardwareWallets) -> iced::Subscription<Message> {
312+
if let Some(modal) = &self.modal {
313+
if let Some(sub) = modal.subscription() {
314+
return sub.map(|m| {
315+
Message::ImportExport(crate::export::ImportExportMessage::Progress(m))
316+
});
317+
}
318+
}
319+
iced::Subscription::none()
320+
}
321+
fn update(
322+
&mut self,
323+
_hws: &mut HardwareWallets,
324+
message: Message,
325+
ctx: &Context,
326+
) -> Task<Message> {
327+
match message {
328+
Message::ImportExport(ImportExportMessage::Close) => {
329+
self.modal = None;
330+
}
331+
Message::ImportExport(m) => {
332+
if let Some(modal) = self.modal.as_mut() {
333+
let task: Task<Message> = modal.update(m);
334+
return task;
335+
};
336+
}
337+
Message::BackupWallet => {
338+
if self.modal.is_none() {
339+
let ctx = ctx.clone();
340+
return Task::perform(
341+
async move {
342+
let backup = Backup::from_installer(ctx, true).await;
343+
let backup = backup.unwrap();
344+
serde_json::to_string_pretty(&backup).unwrap()
345+
// TODO: do not unwrap, return an error message instead
346+
},
347+
Message::ExportWallet,
348+
);
349+
}
350+
}
351+
Message::ExportWallet(str) => {
352+
if self.modal.is_none() {
353+
let modal = ExportModal::new(None, ImportExportType::ExportBackup(str));
354+
let launch = modal.launch();
355+
self.modal = Some(modal);
356+
return launch;
357+
}
358+
}
359+
Message::UserActionDone(done) => {
360+
self.done = done;
361+
}
362+
_ => {}
311363
}
312364
Task::none()
313365
}

liana-gui/src/installer/view/mod.rs

+11-4
Original file line numberDiff line numberDiff line change
@@ -739,10 +739,17 @@ pub fn backup_descriptor<'a>(
739739
),
740740
)
741741
.push(
742-
Row::new().push(Column::new().width(Length::Fill)).push(
743-
button::secondary(Some(icon::clipboard_icon()), "Copy")
744-
.on_press(Message::Clibpboard(descriptor.to_string())),
745-
),
742+
Row::new()
743+
.push(Space::with_width(Length::Fill))
744+
.push(
745+
button::secondary(Some(icon::wallet_icon()), "Backup")
746+
.on_press(Message::BackupWallet),
747+
)
748+
.push(Space::with_width(10))
749+
.push(
750+
button::secondary(Some(icon::clipboard_icon()), "Copy")
751+
.on_press(Message::Clibpboard(descriptor.to_string())),
752+
),
746753
)
747754
.spacing(10),
748755
)

0 commit comments

Comments
 (0)