From 26a8dec7079bc90652449ea658314ae0cbb26e88 Mon Sep 17 00:00:00 2001 From: Pierre Dommerc Date: Wed, 6 Dec 2023 15:39:53 +0100 Subject: [PATCH] refactor(vpnapp): node location logic (#4223) * refactor node location logic fontend: remove app local data from state remove node config from state use only country location state backend: add node location in state add set_node_location command * call backend to update node location * clean code --- nym-vpn/ui/index.html | 2 +- nym-vpn/ui/src-tauri/src/commands/app_data.rs | 6 +- .../ui/src-tauri/src/commands/connection.rs | 2 +- nym-vpn/ui/src-tauri/src/commands/mod.rs | 1 + .../src-tauri/src/commands/node_location.rs | 59 +++++++++++++++++++ nym-vpn/ui/src-tauri/src/fs/data.rs | 4 +- nym-vpn/ui/src-tauri/src/main.rs | 1 + nym-vpn/ui/src-tauri/src/states/app.rs | 4 +- nym-vpn/ui/src/dev/setup.ts | 6 +- nym-vpn/ui/src/pages/home/Home.tsx | 9 +-- nym-vpn/ui/src/pages/home/HopSelect.tsx | 13 ++-- nym-vpn/ui/src/pages/location/CountryList.tsx | 2 +- .../ui/src/pages/location/NodeLocation.tsx | 37 ++++++------ nym-vpn/ui/src/pages/location/SearchBox.tsx | 4 +- nym-vpn/ui/src/router.tsx | 4 +- nym-vpn/ui/src/state/main.ts | 54 +++++------------ nym-vpn/ui/src/state/provider.tsx | 20 +------ nym-vpn/ui/src/types/app-data.ts | 16 ++--- nym-vpn/ui/src/types/app-state.ts | 5 +- nym-vpn/ui/src/types/general.ts | 4 +- nym-vpn/ui/src/types/index.ts | 1 + 21 files changed, 136 insertions(+), 118 deletions(-) create mode 100644 nym-vpn/ui/src-tauri/src/commands/node_location.rs diff --git a/nym-vpn/ui/index.html b/nym-vpn/ui/index.html index eaeca159bd..a548f6417f 100644 --- a/nym-vpn/ui/index.html +++ b/nym-vpn/ui/index.html @@ -1,5 +1,5 @@ - + diff --git a/nym-vpn/ui/src-tauri/src/commands/app_data.rs b/nym-vpn/ui/src-tauri/src/commands/app_data.rs index d28e1d3d16..9fd33de518 100644 --- a/nym-vpn/ui/src-tauri/src/commands/app_data.rs +++ b/nym-vpn/ui/src-tauri/src/commands/app_data.rs @@ -37,7 +37,7 @@ pub fn get_node_countries() -> Result, CmdError> { Ok(countries) } -#[instrument] +#[instrument(skip(state))] #[tauri::command] pub async fn set_app_data( state: State<'_, SharedAppData>, @@ -56,7 +56,7 @@ pub async fn set_app_data( Ok(()) } -#[instrument] +#[instrument(skip_all)] #[tauri::command] pub async fn get_app_data( state: State<'_, SharedAppData>, @@ -75,7 +75,7 @@ pub async fn get_app_data( Ok(data) } -#[instrument(skip_all)] +#[instrument(skip(data_state))] #[tauri::command] pub async fn set_ui_theme( data_state: State<'_, SharedAppData>, diff --git a/nym-vpn/ui/src-tauri/src/commands/connection.rs b/nym-vpn/ui/src-tauri/src/commands/connection.rs index 944337eb53..b642a06352 100644 --- a/nym-vpn/ui/src-tauri/src/commands/connection.rs +++ b/nym-vpn/ui/src-tauri/src/commands/connection.rs @@ -182,7 +182,7 @@ pub async fn get_connection_start_time( Ok(app_state.connection_start_time.map(|t| t.unix_timestamp())) } -#[instrument(skip_all)] +#[instrument(skip(app_state, data_state))] #[tauri::command] pub async fn set_vpn_mode( app_state: State<'_, SharedAppState>, diff --git a/nym-vpn/ui/src-tauri/src/commands/mod.rs b/nym-vpn/ui/src-tauri/src/commands/mod.rs index 917050e116..53529ee0ce 100644 --- a/nym-vpn/ui/src-tauri/src/commands/mod.rs +++ b/nym-vpn/ui/src-tauri/src/commands/mod.rs @@ -1,2 +1,3 @@ pub mod app_data; pub mod connection; +pub mod node_location; diff --git a/nym-vpn/ui/src-tauri/src/commands/node_location.rs b/nym-vpn/ui/src-tauri/src/commands/node_location.rs new file mode 100644 index 0000000000..90d3f9a9f9 --- /dev/null +++ b/nym-vpn/ui/src-tauri/src/commands/node_location.rs @@ -0,0 +1,59 @@ +use serde::{Deserialize, Serialize}; +use tauri::State; +use tracing::{debug, instrument}; +use ts_rs::TS; + +use crate::{ + error::{CmdError, CmdErrorSource}, + states::{app::Country, SharedAppData, SharedAppState}, +}; + +#[derive(Debug, Serialize, Deserialize, TS, Clone)] +pub enum NodeType { + Entry, + Exit, +} + +#[instrument(skip(app_state, data_state))] +#[tauri::command] +pub async fn set_node_location( + app_state: State<'_, SharedAppState>, + data_state: State<'_, SharedAppData>, + node_type: NodeType, + country: Country, +) -> Result<(), CmdError> { + debug!("set_node_location"); + let mut state = app_state.lock().await; + match node_type { + NodeType::Entry => { + state.entry_node_location = Some(country.clone()); + } + NodeType::Exit => { + state.exit_node_location = Some(country.clone()); + } + } + // TODO pick a node according to the selected country + + // save the location on disk + let mut app_data_store = data_state.lock().await; + let mut app_data = app_data_store + .read() + .await + .map_err(|e| CmdError::new(CmdErrorSource::InternalError, e.to_string()))?; + + match node_type { + NodeType::Entry => { + app_data.entry_node_location = Some(country); + } + NodeType::Exit => { + app_data.exit_node_location = Some(country); + } + } + app_data_store.data = app_data; + app_data_store + .write() + .await + .map_err(|e| CmdError::new(CmdErrorSource::InternalError, e.to_string()))?; + + Ok(()) +} diff --git a/nym-vpn/ui/src-tauri/src/fs/data.rs b/nym-vpn/ui/src-tauri/src/fs/data.rs index 18df75cb14..0b8bc7a5da 100644 --- a/nym-vpn/ui/src-tauri/src/fs/data.rs +++ b/nym-vpn/ui/src-tauri/src/fs/data.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; use ts_rs::TS; -use crate::states::app::{NodeConfig, VpnMode}; +use crate::states::app::{Country, NodeConfig, VpnMode}; #[derive(Default, Serialize, Deserialize, Debug, Clone, TS)] #[ts(export)] @@ -21,4 +21,6 @@ pub struct AppData { pub vpn_mode: Option, pub entry_node: Option, pub exit_node: Option, + pub entry_node_location: Option, + pub exit_node_location: Option, } diff --git a/nym-vpn/ui/src-tauri/src/main.rs b/nym-vpn/ui/src-tauri/src/main.rs index f300903bfd..67dc63f384 100644 --- a/nym-vpn/ui/src-tauri/src/main.rs +++ b/nym-vpn/ui/src-tauri/src/main.rs @@ -60,6 +60,7 @@ fn main() -> Result<()> { app_data::set_app_data, app_data::set_ui_theme, app_data::get_node_countries, + node_location::set_node_location, ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); diff --git a/nym-vpn/ui/src-tauri/src/states/app.rs b/nym-vpn/ui/src-tauri/src/states/app.rs index 51123a966b..b0c09ba8c7 100644 --- a/nym-vpn/ui/src-tauri/src/states/app.rs +++ b/nym-vpn/ui/src-tauri/src/states/app.rs @@ -6,7 +6,7 @@ use ts_rs::TS; #[ts(export)] pub struct NodeConfig { pub id: String, - pub country: String, + pub country: Country, } #[derive(Default, Debug, Clone, Copy, Serialize, Deserialize, TS)] @@ -42,6 +42,8 @@ pub struct AppState { pub vpn_mode: VpnMode, pub entry_node: Option, pub exit_node: Option, + pub entry_node_location: Option, + pub exit_node_location: Option, pub tunnel: Option, pub connection_start_time: Option, } diff --git a/nym-vpn/ui/src/dev/setup.ts b/nym-vpn/ui/src/dev/setup.ts index 0822f49d0c..976d4239c3 100644 --- a/nym-vpn/ui/src/dev/setup.ts +++ b/nym-vpn/ui/src/dev/setup.ts @@ -65,13 +65,15 @@ export function mockTauriIPC() { ui_theme: 'Dark', vpn_mode: 'TwoHop', entry_node: { - country: QuickConnectCountry.name, + country: QuickConnectCountry, id: QuickConnectCountry.code, }, exit_node: { - country: QuickConnectCountry.name, + country: QuickConnectCountry, id: QuickConnectCountry.code, }, + entry_node_location: null, + exit_node_location: null, }), ); } diff --git a/nym-vpn/ui/src/pages/home/Home.tsx b/nym-vpn/ui/src/pages/home/Home.tsx index c144c07631..598d229479 100644 --- a/nym-vpn/ui/src/pages/home/Home.tsx +++ b/nym-vpn/ui/src/pages/home/Home.tsx @@ -61,14 +61,9 @@ function Home() {
navigate(routes.exitNodeLocation)} - nodeHop={{ type: 'exit' }} + nodeHop="exit" />