From c3864cb229effce410b2aa1317db81caa4164223 Mon Sep 17 00:00:00 2001 From: ardocrat Date: Tue, 30 Apr 2024 23:28:49 +0300 Subject: [PATCH] tor: settings modal, save slatepack message after finalization --- locales/en.yml | 1 + locales/ru.yml | 1 + src/gui/views/wallets/wallet/transport.rs | 62 +++++++++++++++++++---- src/wallet/wallet.rs | 11 ++-- 4 files changed, 61 insertions(+), 14 deletions(-) diff --git a/locales/en.yml b/locales/en.yml index 5192cf6..20d7fbc 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -125,6 +125,7 @@ transport: tor_send_error: An error occurred during sending over Tor, make sure receiver is online, transaction was canceled. tor_autorun_desc: Whether to launch Tor service on wallet opening to receive transactions synchronously. tor_sending: Sending over Tor + tor_settings: Tor Settings network: self: Network type: 'Network type:' diff --git a/locales/ru.yml b/locales/ru.yml index b8adce0..df821e9 100644 --- a/locales/ru.yml +++ b/locales/ru.yml @@ -125,6 +125,7 @@ transport: tor_send_error: Во время отправки через Tor произошла ошибка, убедитесь, что получатель находится онлайн, транзакция была отменена. tor_autorun_desc: Запускать ли Tor сервис при открытии кошелька для синхронного получения транзакций. tor_sending: Отправка через Tor + tor_settings: Настройки Tor network: self: Сеть type: 'Тип сети:' diff --git a/src/gui/views/wallets/wallet/transport.rs b/src/gui/views/wallets/wallet/transport.rs index d105bcb..3a643d5 100644 --- a/src/gui/views/wallets/wallet/transport.rs +++ b/src/gui/views/wallets/wallet/transport.rs @@ -20,7 +20,7 @@ use grin_core::core::{amount_from_hr_string, amount_to_hr_string}; use grin_wallet_libwallet::SlatepackAddress; use crate::gui::Colors; -use crate::gui::icons::{CHECK_CIRCLE, COMPUTER_TOWER, COPY, DOTS_THREE_CIRCLE, EXPORT, GEAR_SIX, GLOBE_SIMPLE, POWER, QR_CODE, UPLOAD, WARNING_CIRCLE, X_CIRCLE}; +use crate::gui::icons::{CHECK_CIRCLE, COMPUTER_TOWER, COPY, DOTS_THREE_CIRCLE, EXPORT, GEAR_SIX, POWER, QR_CODE, WARNING_CIRCLE, X_CIRCLE}; use crate::gui::platform::PlatformCallbacks; use crate::gui::views::{Modal, Root, View}; use crate::gui::views::types::{ModalPosition, TextEditOptions}; @@ -110,6 +110,9 @@ impl WalletTab for WalletTransport { /// Identifier for [`Modal`] to send amount over Tor. const SEND_TOR_MODAL: &'static str = "send_tor_modal"; +/// Identifier for [`Modal`] to setup Tor service. +const TOR_SETTINGS_MODAL: &'static str = "tor_settings_modal"; + impl WalletTransport { /// Draw wallet transport content. pub fn ui(&mut self, ui: &mut egui::Ui, wallet: &mut Wallet, cb: &dyn PlatformCallbacks) { @@ -137,6 +140,11 @@ impl WalletTransport { self.send_tor_modal_ui(ui, wallet, modal, cb); }); } + TOR_SETTINGS_MODAL => { + Modal::ui(ui.ctx(), |ui, modal| { + self.tor_settings_modal_ui(ui, wallet, modal); + }); + } _ => {} } } @@ -146,7 +154,7 @@ impl WalletTransport { /// Draw Tor transport content. fn tor_ui(&mut self, ui: &mut egui::Ui, wallet: &mut Wallet, cb: &dyn PlatformCallbacks) { // Draw header content. - self.tor_header_ui(ui, wallet, cb); + self.tor_header_ui(ui, wallet); // Draw receive info content. if wallet.slatepack_address().is_some() { @@ -154,11 +162,11 @@ impl WalletTransport { } // Draw send content. - self.tor_send_ui(ui, wallet, cb); + self.tor_send_ui(ui, cb); } /// Draw Tor transport header content. - fn tor_header_ui(&self, ui: &mut egui::Ui, wallet: &mut Wallet, cb: &dyn PlatformCallbacks) { + fn tor_header_ui(&self, ui: &mut egui::Ui, wallet: &mut Wallet) { // Setup layout size. let mut rect = ui.available_rect_before_wrap(); rect.set_height(78.0); @@ -173,7 +181,11 @@ impl WalletTransport { // Draw button to setup Tor transport. let button_rounding = View::item_rounding(0, 2, true); View::item_button(ui, button_rounding, GEAR_SIX, None, || { - //TODO: tor settings + // Show modal. + Modal::new(TOR_SETTINGS_MODAL) + .position(ModalPosition::CenterTop) + .title(t!("transport.tor_settings")) + .show(); }); // Draw button to enable/disable Tor listener for current wallet. @@ -202,7 +214,9 @@ impl WalletTransport { // Setup wallet API address text. let port = wallet.foreign_api_port().unwrap(); - let address_text = format!("{} http://127.0.0.1:{}", GLOBE_SIMPLE, port); + let address_text = format!("{} http://127.0.0.1:{}", + COMPUTER_TOWER, + port); ui.label(RichText::new(address_text).size(15.0).color(Colors::TEXT)); ui.add_space(1.0); @@ -227,6 +241,29 @@ impl WalletTransport { }); } + /// Draw tor transport settings [`Modal`] content. + fn tor_settings_modal_ui(&self, ui: &mut egui::Ui, wallet: &mut Wallet, modal: &Modal) { + ui.add_space(6.0); + ui.vertical_centered(|ui| { + ui.label(RichText::new(t!("transport.tor_autorun_desc")) + .size(17.0) + .color(Colors::INACTIVE_TEXT)); + + // Show Tor service autorun checkbox. + let autorun = wallet.auto_start_tor_listener(); + View::checkbox(ui, autorun, t!("network.autorun"), || { + wallet.update_auto_start_tor_listener(!autorun); + }); + }); + ui.add_space(6.0); + ui.vertical_centered_justified(|ui| { + View::button(ui, t!("close"), Colors::WHITE, || { + modal.close(); + }); + ui.add_space(6.0); + }); + } + /// Draw Tor send content. fn tor_receive_ui(&self, ui: &mut egui::Ui, wallet: &mut Wallet, cb: &dyn PlatformCallbacks) { let slatepack_addr = wallet.slatepack_address().unwrap(); @@ -281,7 +318,7 @@ impl WalletTransport { } /// Draw Tor receive content. - fn tor_send_ui(&mut self, ui: &mut egui::Ui, wallet: &mut Wallet, cb: &dyn PlatformCallbacks) { + fn tor_send_ui(&mut self, ui: &mut egui::Ui, cb: &dyn PlatformCallbacks) { // Setup layout size. let mut rect = ui.available_rect_before_wrap(); rect.set_height(55.0); @@ -494,9 +531,11 @@ impl WalletTransport { ui.add_space(6.0); } else if has_send_err { ui.add_space(6.0); - ui.label(RichText::new(t!("transport.tor_send_error")) - .size(17.0) - .color(Colors::RED)); + ui.vertical_centered(|ui| { + ui.label(RichText::new(t!("transport.tor_send_error")) + .size(17.0) + .color(Colors::RED)); + }); ui.add_space(12.0); // Setup spacing between buttons. @@ -549,6 +588,7 @@ impl WalletTransport { }); }); }); + ui.add_space(6.0); } else { ui.add_space(16.0); ui.vertical_centered(|ui| { @@ -556,7 +596,7 @@ impl WalletTransport { ui.add_space(12.0); ui.label(RichText::new(t!("transport.tor_sending")) .size(17.0) - .color(Colors::TEXT)); + .color(Colors::GRAY)); }); ui.add_space(10.0); diff --git a/src/wallet/wallet.rs b/src/wallet/wallet.rs index f3b6ccd..4f3dc48 100644 --- a/src/wallet/wallet.rs +++ b/src/wallet/wallet.rs @@ -728,17 +728,21 @@ impl Wallet { return None; } + // Slatepack message json value. let slate_value = res["result"]["Ok"].clone(); - println!("slate_value: {}", slate_value); let mut ret_slate = None; match Slate::deserialize_upgrade(&serde_json::to_string(&slate_value).unwrap()) { Ok(s) => { let mut api = Owner::new(self.instance.clone().unwrap(), None); controller::owner_single_use(None, None, Some(&mut api), |api, m| { + // Finalize transaction. return if let Ok(slate) = api.finalize_tx(m, &s) { ret_slate = Some(slate.clone()); - let result = api.post_tx(m, &slate, self.can_use_dandelion()); + // Save Slatepack message to file. + let _ = self.create_slatepack_message(&slate).unwrap_or("".to_string()); + // Post transaction to blockchain. + let result = self.post(&slate, self.can_use_dandelion()); match result { Ok(_) => { println!("Tx sent successfully", ); @@ -828,8 +832,9 @@ impl Wallet { let mut slate = self.parse_slatepack(message)?; let api = Owner::new(self.instance.clone().unwrap(), None); slate = api.finalize_tx(None, &slate)?; - // Post transaction to blockchain. + // Save Slatepack message to file. let _ = self.create_slatepack_message(&slate)?; + // Post transaction to blockchain. let _ = self.post(&slate, dandelion); // Sync wallet info. self.sync();