Merge #1023: gui: record updates to aliases

67ebde1432c5cea5afe34f4fa79e2e9a119875a6 gui: add wallet to reload (jp1ac4)

Pull request description:

  This is to fix https://github.com/wizardsardine/liana/issues/1017.

  It adds the `wallet` to the `reload` trait method so that changes are recorded.

  As part of this change, the `TransactionsPanel` now has a `wallet` field to be used when calling its own `reload` method.

ACKs for top commit:
  edouardparis:
    ACK 67ebde1432c5cea5afe34f4fa79e2e9a119875a6

Tree-SHA512: 273684dd7bfbf19b40d9e19e33561cd0428e2d7d93a2faa4409f7dab836bd52e907d7e95a1f95a05476363b8766d630c73be7a64775a2c52ca9f0d5c2509f812
This commit is contained in:
edouardparis 2024-03-20 17:54:22 +01:00
commit 6f6c35d0c6
No known key found for this signature in database
GPG Key ID: E65F7A089C20DC8F
11 changed files with 94 additions and 31 deletions

View File

@ -60,7 +60,7 @@ impl Panels {
current: Menu::Home,
home: Home::new(wallet.clone(), &cache.coins),
coins: CoinsPanel::new(&cache.coins, wallet.main_descriptor.first_timelock_value()),
transactions: TransactionsPanel::new(),
transactions: TransactionsPanel::new(wallet.clone()),
psbts: PsbtsPanel::new(wallet.clone()),
recovery: RecoveryPanel::new(wallet.clone(), &cache.coins, cache.blockheight),
receive: ReceivePanel::new(data_dir.clone(), wallet.clone()),
@ -137,7 +137,7 @@ impl App {
data_dir.clone(),
internal_bitcoind.as_ref(),
);
let cmd = panels.home.reload(daemon.clone());
let cmd = panels.home.reload(daemon.clone(), wallet.clone());
(
Self {
panels,
@ -202,7 +202,9 @@ impl App {
_ => {}
};
self.panels.current = menu;
self.panels.current_mut().reload(self.daemon.clone())
self.panels
.current_mut()
.reload(self.daemon.clone(), self.wallet.clone())
}
pub fn subscription(&self) -> Subscription<Message> {

View File

@ -14,6 +14,7 @@ use crate::{
message::Message,
state::{label::LabelsEdited, State},
view,
wallet::Wallet,
},
daemon::{
model::{Coin, LabelItem, Labelled},
@ -150,7 +151,11 @@ impl State for CoinsPanel {
Command::none()
}
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> {
fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
_wallet: Arc<Wallet>,
) -> Command<Message> {
let daemon1 = daemon.clone();
let daemon2 = daemon.clone();
Command::batch(vec![

View File

@ -44,7 +44,11 @@ pub trait State {
fn subscription(&self) -> Subscription<Message> {
Subscription::none()
}
fn reload(&mut self, _daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> {
fn reload(
&mut self,
_daemon: Arc<dyn Daemon + Sync + Send>,
_wallet: Arc<Wallet>,
) -> Command<Message> {
Command::none()
}
}
@ -208,7 +212,7 @@ impl State for Home {
};
}
Message::View(view::Message::Reload) => {
return self.reload(daemon);
return self.reload(daemon, self.wallet.clone());
}
Message::View(view::Message::Close) => {
self.selected_event = None;
@ -259,8 +263,13 @@ impl State for Home {
Command::none()
}
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> {
fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
wallet: Arc<Wallet>,
) -> Command<Message> {
self.selected_event = None;
self.wallet = wallet;
let daemon1 = daemon.clone();
let daemon2 = daemon.clone();
let daemon3 = daemon.clone();

View File

@ -75,7 +75,7 @@ impl State for PsbtsPanel {
) -> Command<Message> {
match message {
Message::View(view::Message::Reload) | Message::View(view::Message::Close) => {
return self.reload(daemon);
return self.reload(daemon, self.wallet.clone());
}
Message::SpendTxs(res) => match res {
Err(e) => self.warning = Some(e),
@ -118,7 +118,12 @@ impl State for PsbtsPanel {
}
}
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> {
fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
wallet: Arc<Wallet>,
) -> Command<Message> {
self.wallet = wallet;
self.selected_tx = None;
self.import_tx = None;
let daemon = daemon.clone();

View File

@ -191,7 +191,12 @@ impl State for ReceivePanel {
}
}
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> {
fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
wallet: Arc<Wallet>,
) -> Command<Message> {
self.wallet = wallet;
// Fill at least with one address, user will then use the generate button.
if self.addresses.is_empty() {
let daemon = daemon.clone();
@ -364,13 +369,11 @@ mod tests {
ChildNumber::from_normal_idx(0).unwrap()
))),
)]);
let sandbox: Sandbox<ReceivePanel> = Sandbox::new(ReceivePanel::new(
PathBuf::new(),
Arc::new(Wallet::new(LianaDescriptor::from_str(DESC).unwrap())),
));
let wallet = Arc::new(Wallet::new(LianaDescriptor::from_str(DESC).unwrap()));
let sandbox: Sandbox<ReceivePanel> =
Sandbox::new(ReceivePanel::new(PathBuf::new(), wallet.clone()));
let client = Arc::new(Lianad::new(daemon.run()));
let sandbox = sandbox.load(client, &Cache::default()).await;
let sandbox = sandbox.load(client, &Cache::default(), wallet).await;
let panel = sandbox.state();
assert_eq!(panel.addresses.list, vec![addr]);

View File

@ -192,8 +192,13 @@ impl State for RecoveryPanel {
Command::none()
}
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> {
fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
wallet: Arc<Wallet>,
) -> Command<Message> {
let daemon = daemon.clone();
self.wallet = wallet;
self.selected_path = None;
self.warning = None;
self.feerate = form::Value::default();

View File

@ -53,25 +53,28 @@ impl State for SettingsState {
)
.into(),
);
let wallet = self.wallet.clone();
self.setting
.as_mut()
.map(|s| s.reload(daemon))
.map(|s| s.reload(daemon, wallet))
.unwrap_or_else(Command::none)
}
Message::View(view::Message::Settings(view::SettingsMessage::AboutSection)) => {
self.setting = Some(AboutSettingsState::default().into());
let wallet = self.wallet.clone();
self.setting
.as_mut()
.map(|s| s.reload(daemon))
.map(|s| s.reload(daemon, wallet))
.unwrap_or_else(Command::none)
}
Message::View(view::Message::Settings(view::SettingsMessage::EditWalletSettings)) => {
self.setting = Some(
WalletSettingsState::new(self.data_dir.clone(), self.wallet.clone()).into(),
);
let wallet = self.wallet.clone();
self.setting
.as_mut()
.map(|s| s.reload(daemon))
.map(|s| s.reload(daemon, wallet))
.unwrap_or_else(Command::none)
}
_ => self
@ -98,8 +101,13 @@ impl State for SettingsState {
}
}
fn reload(&mut self, _daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> {
fn reload(
&mut self,
_daemon: Arc<dyn Daemon + Sync + Send>,
wallet: Arc<Wallet>,
) -> Command<Message> {
self.setting = None;
self.wallet = wallet;
Command::none()
}
}
@ -150,7 +158,11 @@ impl State for AboutSettingsState {
Command::none()
}
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> {
fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
_wallet: Arc<Wallet>,
) -> Command<Message> {
Command::perform(
async move { daemon.get_info().map_err(|e| e.into()) },
Message::Info,

View File

@ -180,7 +180,14 @@ impl State for WalletSettingsState {
}
}
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> {
fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
wallet: Arc<Wallet>,
) -> Command<Message> {
self.descriptor = wallet.main_descriptor.to_string();
self.keys_aliases = Self::keys_aliases(&wallet);
self.wallet = wallet;
Command::perform(
async move { daemon.get_info().map_err(|e| e.into()) },
Message::Info,

View File

@ -112,7 +112,11 @@ impl State for CreateSpendPanel {
Command::none()
}
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> {
fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
_wallet: Arc<Wallet>,
) -> Command<Message> {
let daemon1 = daemon.clone();
let daemon2 = daemon.clone();
Command::batch(vec![

View File

@ -22,6 +22,7 @@ use crate::{
message::Message,
state::{label::LabelsEdited, State},
view,
wallet::Wallet,
},
daemon::model,
};
@ -31,8 +32,8 @@ use crate::daemon::{
Daemon,
};
#[derive(Default)]
pub struct TransactionsPanel {
wallet: Arc<Wallet>,
pending_txs: Vec<HistoryTransaction>,
txs: Vec<HistoryTransaction>,
labels_edited: LabelsEdited,
@ -42,8 +43,9 @@ pub struct TransactionsPanel {
}
impl TransactionsPanel {
pub fn new() -> Self {
pub fn new(wallet: Arc<Wallet>) -> Self {
Self {
wallet,
selected_tx: None,
txs: Vec::new(),
pending_txs: Vec::new(),
@ -120,7 +122,7 @@ impl State for TransactionsPanel {
}
},
Message::View(view::Message::Reload) | Message::View(view::Message::Close) => {
return self.reload(daemon);
return self.reload(daemon, self.wallet.clone());
}
Message::View(view::Message::Select(i)) => {
self.selected_tx = if i < self.pending_txs.len() {
@ -225,7 +227,11 @@ impl State for TransactionsPanel {
Command::none()
}
fn reload(&mut self, daemon: Arc<dyn Daemon + Sync + Send>) -> Command<Message> {
fn reload(
&mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
_wallet: Arc<Wallet>,
) -> Command<Message> {
self.selected_tx = None;
let daemon1 = daemon.clone();
let daemon2 = daemon.clone();

View File

@ -3,7 +3,7 @@ use std::sync::Arc;
use iced_native::command::Action;
use crate::{
app::{cache::Cache, message::Message, state::State},
app::{cache::Cache, message::Message, state::State, wallet::Wallet},
daemon::Daemon,
};
@ -37,8 +37,13 @@ impl<S: State + Send + 'static> Sandbox<S> {
self
}
pub async fn load(mut self, daemon: Arc<dyn Daemon + Sync + Send>, cache: &Cache) -> Self {
let cmd = self.state.reload(daemon.clone());
pub async fn load(
mut self,
daemon: Arc<dyn Daemon + Sync + Send>,
cache: &Cache,
wallet: Arc<Wallet>,
) -> Self {
let cmd = self.state.reload(daemon.clone(), wallet);
for action in cmd.actions() {
if let Action::Future(f) = action {
let msg = f.await;