From 157d9b39333e9eae1b1fc231bc6abd2f6661bca6 Mon Sep 17 00:00:00 2001 From: edouard Date: Tue, 6 Sep 2022 16:19:02 +0200 Subject: [PATCH] Add coins to cache --- gui/src/app/cache.rs | 12 ++++++++++++ gui/src/app/message.rs | 6 +++++- gui/src/app/mod.rs | 22 ++++++++++++++-------- gui/src/daemon/model.rs | 4 +++- gui/src/loader.rs | 15 +++++++++++---- gui/src/main.rs | 3 ++- 6 files changed, 47 insertions(+), 15 deletions(-) diff --git a/gui/src/app/cache.rs b/gui/src/app/cache.rs index 01636ca5..c403e043 100644 --- a/gui/src/app/cache.rs +++ b/gui/src/app/cache.rs @@ -1,3 +1,15 @@ +use crate::daemon::model::Coin; + pub struct Cache { pub blockheight: i32, + pub coins: Vec, +} + +impl Default for Cache { + fn default() -> Self { + Self { + blockheight: 0, + coins: Vec::new(), + } + } } diff --git a/gui/src/app/message.rs b/gui/src/app/message.rs index c4e2cabc..0c66e434 100644 --- a/gui/src/app/message.rs +++ b/gui/src/app/message.rs @@ -1,6 +1,9 @@ use minisafe::config::Config as DaemonConfig; -use crate::app::{error::Error, view}; +use crate::{ + app::{error::Error, view}, + daemon::model::*, +}; #[derive(Debug)] pub enum Message { @@ -11,4 +14,5 @@ pub enum Message { DaemonConfigLoaded(Result<(), Error>), BlockHeight(Result), ReceiveAddress(Result), + Coins(Result, Error>), } diff --git a/gui/src/app/mod.rs b/gui/src/app/mod.rs index c55a87f2..79c29fbb 100644 --- a/gui/src/app/mod.rs +++ b/gui/src/app/mod.rs @@ -42,7 +42,7 @@ impl App { config: Config, daemon: Arc, ) -> (App, Command) { - let state: Box = Home {}.into(); + let state: Box = Home::new(&cache.coins).into(); let cmd = state.load(daemon.clone()); ( Self { @@ -62,7 +62,7 @@ impl App { state::SettingsState::new(self.daemon.config().clone(), self.daemon.is_external()) .into() } - menu::Menu::Home => Home {}.into(), + menu::Menu::Home => Home::new(&self.cache.coins).into(), menu::Menu::Receive => ReceivePanel::default().into(), }; self.state.load(self.daemon.clone()) @@ -95,6 +95,18 @@ impl App { } pub fn update(&mut self, message: Message) -> Command { + // Update cache when values are passing by. + // State will handle the error case. + match &message { + Message::Coins(Ok(coins)) => { + self.cache.coins = coins.clone(); + } + Message::BlockHeight(Ok(blockheight)) => { + self.cache.blockheight = blockheight.clone(); + } + _ => {} + }; + match message { Message::Tick => { let daemon = self.daemon.clone(); @@ -108,12 +120,6 @@ impl App { Message::BlockHeight, ) } - Message::BlockHeight(res) => { - if let Ok(blockheight) = res { - self.cache.blockheight = blockheight; - } - Command::none() - } Message::LoadDaemonConfig(cfg) => { let res = self.load_daemon_config(*cfg); self.update(Message::DaemonConfigLoaded(res)) diff --git a/gui/src/daemon/model.rs b/gui/src/daemon/model.rs index ce1401d7..33178c77 100644 --- a/gui/src/daemon/model.rs +++ b/gui/src/daemon/model.rs @@ -1 +1,3 @@ -pub use minisafe::commands::{GetAddressResult, GetInfoResult, ListCoinsResult}; +pub use minisafe::commands::{GetAddressResult, GetInfoResult, ListCoinsEntry, ListCoinsResult}; + +pub type Coin = ListCoinsEntry; diff --git a/gui/src/loader.rs b/gui/src/loader.rs index 5cf275dc..1812a116 100644 --- a/gui/src/loader.rs +++ b/gui/src/loader.rs @@ -39,7 +39,7 @@ enum Step { pub enum Message { Event(iced_native::Event), Syncing(Result), - Synced(GetInfoResult, Arc), + Synced(GetInfoResult, Vec, Arc), Started(Result, Error>), Loaded(Result, Error>), Failure(DaemonError), @@ -118,9 +118,16 @@ impl Loader { Ok(info) => { if (info.sync - 1.0_f64).abs() < f64::EPSILON { let daemon = daemon.clone(); - return Command::perform(async move { (info, daemon) }, |res| { - Message::Synced(res.0, res.1) - }); + return Command::perform( + async move { + let coins = daemon + .list_coins() + .map(|res| res.coins) + .unwrap_or_else(|_| Vec::new()); + (info, coins, daemon) + }, + |res| Message::Synced(res.0, res.1, res.2), + ); } else { *progress = info.sync } diff --git a/gui/src/main.rs b/gui/src/main.rs index e6a7b1ef..349c92b5 100644 --- a/gui/src/main.rs +++ b/gui/src/main.rs @@ -161,9 +161,10 @@ impl Application for GUI { } } (State::Loader(loader), Message::Load(msg)) => { - if let loader::Message::Synced(info, minisafed) = *msg { + if let loader::Message::Synced(info, coins, minisafed) = *msg { let cache = Cache { blockheight: info.blockheight, + coins, }; let (app, command) = App::new(cache, loader.gui_config.clone(), minisafed);