diff --git a/gui/Cargo.lock b/gui/Cargo.lock index 118698a5..e9d6e8c7 100644 --- a/gui/Cargo.lock +++ b/gui/Cargo.lock @@ -2113,7 +2113,7 @@ dependencies = [ [[package]] name = "liana" version = "2.0.0" -source = "git+https://github.com/wizardsardine/liana?branch=master#4f2ff1abc0e2700d563f3077eb71c22ef9573e5c" +source = "git+https://github.com/wizardsardine/liana?branch=master#6869d8554a6214d8e73614adf3c9334c1c6188d4" dependencies = [ "backtrace", "bip39", diff --git a/gui/src/app/message.rs b/gui/src/app/message.rs index 44bbd27e..ad35271f 100644 --- a/gui/src/app/message.rs +++ b/gui/src/app/message.rs @@ -35,5 +35,5 @@ pub enum Message { ConnectedHardwareWallets(Vec), HistoryTransactions(Result, Error>), PendingTransactions(Result, Error>), - LabelsUpdated(Result, Error>), + LabelsUpdated(Result>, Error>), } diff --git a/gui/src/app/state/label.rs b/gui/src/app/state/label.rs index b593b32a..faf4da46 100644 --- a/gui/src/app/state/label.rs +++ b/gui/src/app/state/label.rs @@ -50,12 +50,18 @@ impl LabelsEdited { } } view::LabelMessage::Confirm => { - let mut updated_labels = HashMap::::new(); - let mut updated_labels_str = HashMap::::new(); + let mut updated_labels = HashMap::>::new(); + let mut updated_labels_str = HashMap::>::new(); for item in items { if let Some(label) = self.0.get(&item).cloned() { - updated_labels.insert(label_item_from_str(&item), label.value.clone()); - updated_labels_str.insert(item, label.value); + let item_str = label_item_from_str(&item); + if label.value.is_empty() { + updated_labels.insert(item_str, None); + updated_labels_str.insert(item, None); + } else { + updated_labels.insert(item_str, Some(label.value.clone())); + updated_labels_str.insert(item, Some(label.value)); + } } } return Ok(Command::perform( diff --git a/gui/src/app/state/psbt.rs b/gui/src/app/state/psbt.rs index 6a3f2b51..841ff011 100644 --- a/gui/src/app/state/psbt.rs +++ b/gui/src/app/state/psbt.rs @@ -182,9 +182,11 @@ impl Action for SaveAction { Message::View(view::Message::Spend(view::SpendTxMessage::Confirm)) => { let daemon = daemon.clone(); let psbt = tx.psbt.clone(); - let mut labels = HashMap::::new(); + let mut labels = HashMap::>::new(); for (item, label) in tx.labels() { - labels.insert(label_item_from_str(item), label.clone()); + if !label.is_empty() { + labels.insert(label_item_from_str(item), Some(label.clone())); + } } return Command::perform( async move { diff --git a/gui/src/daemon/client/mod.rs b/gui/src/daemon/client/mod.rs index 185dfb2a..32268a7e 100644 --- a/gui/src/daemon/client/mod.rs +++ b/gui/src/daemon/client/mod.rs @@ -157,8 +157,8 @@ impl Daemon for Lianad { Ok(res.labels) } - fn update_labels(&self, items: &HashMap) -> Result<(), DaemonError> { - let labels: HashMap = + fn update_labels(&self, items: &HashMap>) -> Result<(), DaemonError> { + let labels: HashMap> = HashMap::from_iter(items.iter().map(|(a, l)| (a.to_string(), l.clone()))); let _res: serde_json::value::Value = self.call("updatelabels", Some(vec![labels]))?; Ok(()) diff --git a/gui/src/daemon/embedded.rs b/gui/src/daemon/embedded.rs index 5103932c..f7c64e6b 100644 --- a/gui/src/daemon/embedded.rs +++ b/gui/src/daemon/embedded.rs @@ -135,7 +135,7 @@ impl Daemon for EmbeddedDaemon { Ok(self.handle.control.get_labels(items).labels) } - fn update_labels(&self, items: &HashMap) -> Result<(), DaemonError> { + fn update_labels(&self, items: &HashMap>) -> Result<(), DaemonError> { self.handle.control.update_labels(items); Ok(()) } diff --git a/gui/src/daemon/mod.rs b/gui/src/daemon/mod.rs index 6d5b1743..1b680e30 100644 --- a/gui/src/daemon/mod.rs +++ b/gui/src/daemon/mod.rs @@ -5,6 +5,7 @@ pub mod model; use std::collections::{HashMap, HashSet}; use std::fmt::Debug; use std::io::ErrorKind; +use std::iter::FromIterator; use liana::{ commands::LabelItem, @@ -80,7 +81,8 @@ pub trait Daemon: Debug { &self, labels: &HashSet, ) -> Result, DaemonError>; - fn update_labels(&self, labels: &HashMap) -> Result<(), DaemonError>; + fn update_labels(&self, labels: &HashMap>) + -> Result<(), DaemonError>; fn list_spend_transactions(&self) -> Result, DaemonError> { let info = self.get_info()?; @@ -228,7 +230,12 @@ fn load_labels( items.insert(item); } } - let labels = daemon.get_labels(&items)?; + let labels = HashMap::from_iter( + daemon + .get_labels(&items)? + .into_iter() + .map(|(k, v)| (k, Some(v))), + ); for target in targets { target.load_labels(&labels); } diff --git a/gui/src/daemon/model.rs b/gui/src/daemon/model.rs index b37485a4..0afbffc4 100644 --- a/gui/src/daemon/model.rs +++ b/gui/src/daemon/model.rs @@ -346,13 +346,17 @@ impl Labelled for HistoryTransaction { pub trait Labelled { fn labelled(&self) -> Vec; fn labels(&mut self) -> &mut HashMap; - fn load_labels(&mut self, new_labels: &HashMap) { + fn load_labels(&mut self, new_labels: &HashMap>) { let items = self.labelled(); let labels = self.labels(); for item in items { let item_str = item.to_string(); - if let Some(l) = new_labels.get(&item_str) { - labels.insert(item_str, l.to_string()); + if let Some(label) = new_labels.get(&item_str) { + if let Some(l) = label { + labels.insert(item_str, l.to_string()); + } else { + labels.remove(&item_str); + } } } }