From 59cd3a4c9d7e51af782d7606e6350110b5d118d8 Mon Sep 17 00:00:00 2001 From: Pierre Date: Thu, 9 Jan 2025 11:47:17 +0100 Subject: [PATCH] feat(tauri): add dev menu (#1871) * add a dev menu * update workflows --- .github/workflows/build-nym-vpn-app-linux.yml | 2 +- .../build-nym-vpn-app-windows-ev-sign.yml | 2 +- .../workflows/build-nym-vpn-app-windows.yml | 2 +- .github/workflows/publish-nym-vpn-app.yml | 2 +- nym-vpn-app/src-tauri/src/cli.rs | 4 +- .../src-tauri/src/commands/connection.rs | 2 + nym-vpn-app/src-tauri/src/commands/daemon.rs | 6 +- nym-vpn-app/src-tauri/src/commands/dev.rs | 27 ++++++ nym-vpn-app/src-tauri/src/commands/env.rs | 6 +- nym-vpn-app/src-tauri/src/commands/mod.rs | 1 + nym-vpn-app/src-tauri/src/env.rs | 8 +- nym-vpn-app/src-tauri/src/grpc/client.rs | 9 +- nym-vpn-app/src-tauri/src/main.rs | 3 + nym-vpn-app/src-tauri/src/states/app.rs | 2 + nym-vpn-app/src-tauri/tauri.conf.json | 2 +- nym-vpn-app/src/dev/setup.ts | 2 +- nym-vpn-app/src/main.tsx | 6 +- nym-vpn-app/src/router.tsx | 7 ++ nym-vpn-app/src/screens/settings/dev/Dev.tsx | 43 +++++++++ .../screens/settings/dev/NetworkEnvSelect.tsx | 93 ++++++++++++++++++ nym-vpn-app/src/screens/settings/dev/index.ts | 1 + nym-vpn-app/src/screens/settings/index.ts | 1 + .../screens/settings/info-data/InfoData.tsx | 28 ++---- .../settings/info-data/NetworkEnvSelect.tsx | 96 ------------------- nym-vpn-app/src/static.ts | 2 +- nym-vpn-app/src/ui/TopBar.tsx | 7 ++ nym-vpn-app/vpnd_compat.toml | 2 +- 27 files changed, 223 insertions(+), 143 deletions(-) create mode 100644 nym-vpn-app/src-tauri/src/commands/dev.rs create mode 100644 nym-vpn-app/src/screens/settings/dev/Dev.tsx create mode 100644 nym-vpn-app/src/screens/settings/dev/NetworkEnvSelect.tsx create mode 100644 nym-vpn-app/src/screens/settings/dev/index.ts delete mode 100644 nym-vpn-app/src/screens/settings/info-data/NetworkEnvSelect.tsx diff --git a/.github/workflows/build-nym-vpn-app-linux.yml b/.github/workflows/build-nym-vpn-app-linux.yml index e417d38b08..7d836cf25a 100644 --- a/.github/workflows/build-nym-vpn-app-linux.yml +++ b/.github/workflows/build-nym-vpn-app-linux.yml @@ -109,7 +109,7 @@ jobs: TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} APP_SENTRY_DSN: ${{ secrets.DESKTOP_JS_SENTRY_DSN }} # RUSTFLAGS: "-L ${{ env.WG_GO_LIB_PATH }}" - NETWORK_ENV_SELECT: ${{ inputs.dev_mode == true }} + DEV_MODE: ${{ inputs.dev_mode == true }} run: | if [ "${{ env.CARGO_TARGET }}" = "release" ]; then npm run tauri build diff --git a/.github/workflows/build-nym-vpn-app-windows-ev-sign.yml b/.github/workflows/build-nym-vpn-app-windows-ev-sign.yml index 9601ce8bb0..08c5991107 100644 --- a/.github/workflows/build-nym-vpn-app-windows-ev-sign.yml +++ b/.github/workflows/build-nym-vpn-app-windows-ev-sign.yml @@ -239,7 +239,7 @@ jobs: RUSTFLAGS: "-L ${{ env.TAURI_SRC }}/x86_64-pc-windows-msvc -L ${{ env.TAURI_SRC }} -Clink-args=/LIBPATH:${{ env.TAURI_SRC }}/x64-${{ env.CPP_BUILD_MODES }}" WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_SIGNING_PFX_BASE64 }} WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_SIGNING_PFX_PASSWORD }} - NETWORK_ENV_SELECT: ${{ inputs.dev_mode == true }} + DEV_MODE: ${{ inputs.dev_mode == true }} run: | if [ "${{ env.CARGO_TARGET }}" = "release" ]; then npm run tauri build diff --git a/.github/workflows/build-nym-vpn-app-windows.yml b/.github/workflows/build-nym-vpn-app-windows.yml index d06b424070..ab6b7d51b8 100644 --- a/.github/workflows/build-nym-vpn-app-windows.yml +++ b/.github/workflows/build-nym-vpn-app-windows.yml @@ -239,7 +239,7 @@ jobs: RUSTFLAGS: "-L ${{ env.TAURI_SRC }}/x86_64-pc-windows-msvc -L ${{ env.TAURI_SRC }} -Clink-args=/LIBPATH:${{ env.TAURI_SRC }}/x64-${{ env.CPP_BUILD_MODES }}" WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_SIGNING_PFX_BASE64 }} WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_SIGNING_PFX_PASSWORD }} - NETWORK_ENV_SELECT: ${{ inputs.dev_mode == true }} + DEV_MODE: ${{ inputs.dev_mode == true }} run: | if [ "${{ env.CARGO_TARGET }}" = "release" ]; then npm run tauri build diff --git a/.github/workflows/publish-nym-vpn-app.yml b/.github/workflows/publish-nym-vpn-app.yml index f8d9fbc844..fd05eaa611 100644 --- a/.github/workflows/publish-nym-vpn-app.yml +++ b/.github/workflows/publish-nym-vpn-app.yml @@ -14,7 +14,7 @@ on: type: boolean default: false dev_mode: - description: "dev build (enable env selector)" + description: "Enable dev mode (in-app dev menu)" required: true type: boolean default: false diff --git a/nym-vpn-app/src-tauri/src/cli.rs b/nym-vpn-app/src-tauri/src/cli.rs index bc0fa66c62..2eb48eee82 100644 --- a/nym-vpn-app/src-tauri/src/cli.rs +++ b/nym-vpn-app/src-tauri/src/cli.rs @@ -73,9 +73,9 @@ pub struct Cli { #[arg(short = 's', long)] pub nosplash: bool, - /// Enable zknyms credentials mode + // Run in 'dev' mode #[arg(long, hide = true)] - pub credentials_mode: bool, + pub dev_mode: bool, #[command(subcommand)] pub command: Option, diff --git a/nym-vpn-app/src-tauri/src/commands/connection.rs b/nym-vpn-app/src-tauri/src/commands/connection.rs index 7216de81e7..5548b74c1b 100644 --- a/nym-vpn-app/src-tauri/src/commands/connection.rs +++ b/nym-vpn-app/src-tauri/src/commands/connection.rs @@ -76,6 +76,7 @@ pub async fn connect( .dns_server .clone() .map(|ip| nym_vpn_proto::Dns { ip }); + let credentials_mode = app_state.credentials_mode; // release the lock drop(app_state); @@ -146,6 +147,7 @@ pub async fn connect( entry_node, exit_node, two_hop_mod, + credentials_mode, use_netstack_wireguard, dns, ) diff --git a/nym-vpn-app/src-tauri/src/commands/daemon.rs b/nym-vpn-app/src-tauri/src/commands/daemon.rs index a1b7ca1360..ed03855877 100644 --- a/nym-vpn-app/src-tauri/src/commands/daemon.rs +++ b/nym-vpn-app/src-tauri/src/commands/daemon.rs @@ -1,4 +1,4 @@ -use crate::env::NETWORK_ENV_SELECT; +use crate::env::DEV_MODE; use crate::error::BackendError; use crate::grpc::client::{FeatureFlags, GrpcClient, SystemMessage, VpndStatus}; use crate::states::SharedAppState; @@ -41,8 +41,8 @@ pub async fn set_network( grpc_client: State<'_, GrpcClient>, network: NetworkEnv, ) -> Result<(), BackendError> { - if !*NETWORK_ENV_SELECT { - warn!("network env selector is disabled"); + if !*DEV_MODE { + warn!("not in dev mode"); return Err(BackendError::internal("nope", None)); } grpc_client diff --git a/nym-vpn-app/src-tauri/src/commands/dev.rs b/nym-vpn-app/src-tauri/src/commands/dev.rs new file mode 100644 index 0000000000..d66bcdbb96 --- /dev/null +++ b/nym-vpn-app/src-tauri/src/commands/dev.rs @@ -0,0 +1,27 @@ +use crate::env::DEV_MODE; +use crate::error::BackendError; +use crate::states::SharedAppState; +use tauri::State; +use tracing::{instrument, warn}; + +#[instrument(skip(state))] +#[tauri::command] +pub async fn get_credentials_mode(state: State<'_, SharedAppState>) -> Result { + let state = state.lock().await; + Ok(state.credentials_mode) +} + +#[instrument(skip(state))] +#[tauri::command] +pub async fn set_credentials_mode( + state: State<'_, SharedAppState>, + enabled: bool, +) -> Result<(), BackendError> { + if !*DEV_MODE { + warn!("not in dev mode"); + return Err(BackendError::internal("nope", None)); + } + let mut state = state.lock().await; + state.credentials_mode = enabled; + Ok(()) +} diff --git a/nym-vpn-app/src-tauri/src/commands/env.rs b/nym-vpn-app/src-tauri/src/commands/env.rs index 19a4e3858a..aa3defe53d 100644 --- a/nym-vpn-app/src-tauri/src/commands/env.rs +++ b/nym-vpn-app/src-tauri/src/commands/env.rs @@ -1,4 +1,4 @@ -use crate::env::NETWORK_ENV_SELECT; +use crate::env::DEV_MODE; use serde::Serialize; use tracing::instrument; use ts_rs::TS; @@ -7,13 +7,13 @@ use ts_rs::TS; #[serde(rename_all = "SCREAMING_SNAKE_CASE")] #[ts(export)] pub struct Env { - network_env_select: bool, + dev_mode: bool, } #[instrument(skip_all)] #[tauri::command] pub async fn env() -> Env { Env { - network_env_select: *NETWORK_ENV_SELECT, + dev_mode: *DEV_MODE, } } diff --git a/nym-vpn-app/src-tauri/src/commands/mod.rs b/nym-vpn-app/src-tauri/src/commands/mod.rs index 2985e4dc69..ceb1aca455 100644 --- a/nym-vpn-app/src-tauri/src/commands/mod.rs +++ b/nym-vpn-app/src-tauri/src/commands/mod.rs @@ -4,6 +4,7 @@ pub mod connection; pub mod country; pub mod daemon; pub mod db; +pub mod dev; pub mod env; pub mod fs; pub mod log; diff --git a/nym-vpn-app/src-tauri/src/env.rs b/nym-vpn-app/src-tauri/src/env.rs index 76575a1727..c9f9349cbc 100644 --- a/nym-vpn-app/src-tauri/src/env.rs +++ b/nym-vpn-app/src-tauri/src/env.rs @@ -2,12 +2,12 @@ use once_cell::sync::Lazy; use std::env; /// SemVer version requirement for daemon compatibility -// set at compile time +// comptime pub const VPND_COMPAT_REQ: Option<&str> = option_env!("VPND_COMPAT_REQ"); -// set at compile time -pub static NETWORK_ENV_SELECT: Lazy = Lazy::new(|| { - option_env!("NETWORK_ENV_SELECT") +// comptime +pub static DEV_MODE: Lazy = Lazy::new(|| { + option_env!("DEV_MODE") .map(|v| v == "1" || v.to_lowercase() == "true") .unwrap_or(false) }); diff --git a/nym-vpn-app/src-tauri/src/grpc/client.rs b/nym-vpn-app/src-tauri/src/grpc/client.rs index 8986726e57..0e9337eb20 100644 --- a/nym-vpn-app/src-tauri/src/grpc/client.rs +++ b/nym-vpn-app/src-tauri/src/grpc/client.rs @@ -36,7 +36,7 @@ use crate::env::VPND_COMPAT_REQ; use crate::error::BackendError; use crate::fs::config::AppConfig; use crate::states::app::ConnectionState; -use crate::{env, vpn_status}; +use crate::vpn_status; use crate::{events::AppHandleEventEmitter, states::SharedAppState}; const VPND_SERVICE: &str = "nym.vpn.NymVpnd"; @@ -59,7 +59,6 @@ pub struct GrpcClient { transport: Transport, pkg_info: PackageInfo, user_agent: UserAgent, - credentials_mode: bool, } impl GrpcClient { @@ -69,7 +68,6 @@ impl GrpcClient { transport: Transport::from((config, cli)), pkg_info: pkg.clone(), user_agent: GrpcClient::user_agent(pkg, None), - credentials_mode: cli.credentials_mode || env::is_truthy("ENABLE_CREDENTIALS_MODE"), }; match &client.transport { Transport::Http(endpoint) => { @@ -348,12 +346,13 @@ impl GrpcClient { entry_node: EntryNode, exit_node: ExitNode, two_hop_mod: bool, + credentials_mode: bool, netstack: bool, dns: Option, ) -> Result<(), VpndError> { let mut vpnd = self.vpnd().await?; - if self.credentials_mode { + if credentials_mode { info!("credentials mode enabled"); } let request = Request::new(ConnectRequest { @@ -364,7 +363,7 @@ impl GrpcClient { netstack, disable_poisson_rate: false, disable_background_cover_traffic: false, - enable_credentials_mode: self.credentials_mode, + enable_credentials_mode: credentials_mode, dns, user_agent: Some(self.user_agent.clone()), min_mixnode_performance: None, diff --git a/nym-vpn-app/src-tauri/src/main.rs b/nym-vpn-app/src-tauri/src/main.rs index ec116b3eb6..a58ffa7320 100644 --- a/nym-vpn-app/src-tauri/src/main.rs +++ b/nym-vpn-app/src-tauri/src/main.rs @@ -19,6 +19,7 @@ use clap::Parser; use commands::country as cmd_country; use commands::daemon as cmd_daemon; use commands::db as cmd_db; +use commands::dev as cmd_dev; use commands::env as cmd_env; use commands::fs as cmd_fs; use commands::log as cmd_log; @@ -222,6 +223,8 @@ async fn main() -> Result<()> { connection::connect, connection::disconnect, connection::get_connection_start_time, + cmd_dev::get_credentials_mode, + cmd_dev::set_credentials_mode, cmd_db::db_set, cmd_db::db_get, cmd_db::db_flush, diff --git a/nym-vpn-app/src-tauri/src/states/app.rs b/nym-vpn-app/src-tauri/src/states/app.rs index d716e81bf0..8cdf409468 100644 --- a/nym-vpn-app/src-tauri/src/states/app.rs +++ b/nym-vpn-app/src-tauri/src/states/app.rs @@ -45,6 +45,7 @@ pub struct AppState { pub vpn_mode: VpnMode, pub connection_start_time: Option, pub dns_server: Option, + pub credentials_mode: bool, } impl AppState { @@ -61,6 +62,7 @@ impl AppState { AppState { vpn_mode, dns_server, + credentials_mode: cli.dev_mode, ..Default::default() } } diff --git a/nym-vpn-app/src-tauri/tauri.conf.json b/nym-vpn-app/src-tauri/tauri.conf.json index 98cd9852cf..b51f70067c 100644 --- a/nym-vpn-app/src-tauri/tauri.conf.json +++ b/nym-vpn-app/src-tauri/tauri.conf.json @@ -35,7 +35,7 @@ }, "linux": { "deb": { - "depends": ["nym-vpnd (>= 1.1.0~beta.2)"], + "depends": ["nym-vpnd (>= 1.2.0~dev)"], "conflicts": ["nymvpn-x"], "desktopTemplate": "./bundle/deb/main.desktop" } diff --git a/nym-vpn-app/src/dev/setup.ts b/nym-vpn-app/src/dev/setup.ts index a73511ba9c..cc5da56d8b 100644 --- a/nym-vpn-app/src/dev/setup.ts +++ b/nym-vpn-app/src/dev/setup.ts @@ -161,7 +161,7 @@ export function mockTauriIPC() { if (cmd === 'env') { return new Promise((resolve) => resolve({ - NETWORK_ENV_SELECT: true, + DEV_MODE: true, }), ); } diff --git a/nym-vpn-app/src/main.tsx b/nym-vpn-app/src/main.tsx index b8f3d5ecde..7d2d200466 100644 --- a/nym-vpn-app/src/main.tsx +++ b/nym-vpn-app/src/main.tsx @@ -76,9 +76,9 @@ async function setSplashTheme(window: WebviewWindow) { } const env = await invoke>('env'); - if (env.NETWORK_ENV_SELECT === true) { - console.info('network env selector enabled'); - S_STATE.networkEnvSelect = true; + if (env.DEV_MODE === true) { + console.info('dev mode enabled'); + S_STATE.devMode = true; } // check for unrecoverable errors diff --git a/nym-vpn-app/src/router.tsx b/nym-vpn-app/src/router.tsx index bdd7410018..854988f162 100644 --- a/nym-vpn-app/src/router.tsx +++ b/nym-vpn-app/src/router.tsx @@ -4,6 +4,7 @@ import * as Sentry from '@sentry/react'; import { Appearance, AppearanceRouteIndex, + Dev, Display, Error, Lang, @@ -36,6 +37,7 @@ export const routes = { licensesRust: '/settings/legal/licenses-rust', licensesJs: '/settings/legal/licenses-js', licenseDetails: '/settings/legal/license-details', + dev: '/settings/dev', entryNodeLocation: '/entry-node-location', exitNodeLocation: '/exit-node-location', hideout: '/hideout', @@ -72,6 +74,11 @@ const router = createRouterFn([ errorElement: , index: true, }, + { + path: routes.dev, + element: , + errorElement: , + }, { path: routes.appearance, element: , diff --git a/nym-vpn-app/src/screens/settings/dev/Dev.tsx b/nym-vpn-app/src/screens/settings/dev/Dev.tsx new file mode 100644 index 0000000000..be9662f265 --- /dev/null +++ b/nym-vpn-app/src/screens/settings/dev/Dev.tsx @@ -0,0 +1,43 @@ +import { useEffect, useState } from 'react'; +import { invoke } from '@tauri-apps/api/core'; +import { PageAnim, SettingsMenuCard, Switch } from '../../../ui'; +import { useMainState } from '../../../contexts'; +import NetworkEnvSelect from './NetworkEnvSelect'; + +function Dev() { + const [credentialsMode, setCredentialsMode] = useState(false); + + const { daemonStatus, networkEnv } = useMainState(); + + useEffect(() => { + const getCredentialsMode = async () => { + const enabled = await invoke('get_credentials_mode'); + console.log('credentials mode:', enabled); + setCredentialsMode(enabled); + }; + getCredentialsMode(); + }, []); + + const credentialsModeChanged = (enabled: boolean) => { + invoke('set_credentials_mode', { enabled }).then(() => { + setCredentialsMode(enabled); + }); + }; + + return ( + + credentialsModeChanged(!credentialsMode)} + trailingComponent={ + + } + /> + {daemonStatus !== 'NotOk' && networkEnv && ( + + )} + + ); +} + +export default Dev; diff --git a/nym-vpn-app/src/screens/settings/dev/NetworkEnvSelect.tsx b/nym-vpn-app/src/screens/settings/dev/NetworkEnvSelect.tsx new file mode 100644 index 0000000000..76fd1ccf9b --- /dev/null +++ b/nym-vpn-app/src/screens/settings/dev/NetworkEnvSelect.tsx @@ -0,0 +1,93 @@ +import { useState } from 'react'; +import clsx from 'clsx'; +import { Select } from '@headlessui/react'; +import { motion } from 'framer-motion'; +import { invoke } from '@tauri-apps/api/core'; +import { BackendError, NetworkEnv } from '../../../types'; +import { MsIcon } from '../../../ui'; + +type NetworkOption = { value: NetworkEnv; label: string }; + +const options: NetworkOption[] = [ + { value: 'mainnet', label: 'Mainnet' }, + { value: 'canary', label: 'Canary' }, + { value: 'qa', label: 'QA' }, + { value: 'sandbox', label: 'Sandbox' }, +]; + +export type Props = { + current: NetworkEnv; +}; + +function NetworkEnvSelect({ current }: Props) { + const [error, setError] = useState(); + + const handleOnSelect = async (network: NetworkEnv) => { + setError(null); + try { + console.info('setting network to', network); + await invoke('set_network', { network }); + } catch (e: unknown) { + const error = e as BackendError; + console.warn('failed to set network', error); + setError(`Failed to set network: ${error.key} - ${error.message}`); + } + }; + + return ( +
+

+ Network env +

+
+ +

+ This require to restart the daemon to take effect +

+
+
+ + +
+ + {error && ( + + {error} + + )} +
+ ); +} + +export default NetworkEnvSelect; diff --git a/nym-vpn-app/src/screens/settings/dev/index.ts b/nym-vpn-app/src/screens/settings/dev/index.ts new file mode 100644 index 0000000000..abcf6ba776 --- /dev/null +++ b/nym-vpn-app/src/screens/settings/dev/index.ts @@ -0,0 +1 @@ +export { default as Dev } from './Dev'; diff --git a/nym-vpn-app/src/screens/settings/index.ts b/nym-vpn-app/src/screens/settings/index.ts index 8fe79018a1..4f5cf23c44 100644 --- a/nym-vpn-app/src/screens/settings/index.ts +++ b/nym-vpn-app/src/screens/settings/index.ts @@ -3,3 +3,4 @@ export { default as SettingsRouteIndex } from './SettingsRouteIndex'; export * from './appearance'; export * from './legal'; export * from './support'; +export * from './dev'; diff --git a/nym-vpn-app/src/screens/settings/info-data/InfoData.tsx b/nym-vpn-app/src/screens/settings/info-data/InfoData.tsx index 1457260b08..3a66eacbd8 100644 --- a/nym-vpn-app/src/screens/settings/info-data/InfoData.tsx +++ b/nym-vpn-app/src/screens/settings/info-data/InfoData.tsx @@ -1,17 +1,17 @@ -import { useState } from 'react'; import clsx from 'clsx'; +import { useNavigate } from 'react-router'; import { useTranslation } from 'react-i18next'; import { writeText } from '@tauri-apps/plugin-clipboard-manager'; import { useMainState } from '../../../contexts'; -import NetworkEnvSelect from './NetworkEnvSelect'; +import { routes } from '../../../router'; import { S_STATE } from '../../../static'; import { ButtonText } from '../../../ui'; import AccountData from './AccountData'; function InfoData() { - const [showEnvSelect, setShowEnvSelect] = useState(false); const { version, daemonStatus, daemonVersion, networkEnv, account } = useMainState(); + const navigate = useNavigate(); const { t } = useTranslation('settings'); @@ -36,11 +36,7 @@ function InfoData() { {networkEnv && networkEnv.length > 0 && (

{t('info.network-name')}

- copyToClipboard(networkEnv)} - onDoubleClick={() => setShowEnvSelect(!showEnvSelect)} - truncate - > + copyToClipboard(networkEnv)} truncate> {networkEnv}
@@ -60,22 +56,16 @@ function InfoData() { >

{t('info.client-version')}

- copyToClipboard(version || '')} truncate> + copyToClipboard(version || '')} + onDoubleClick={() => S_STATE.devMode && navigate(routes.dev)} + truncate + > {version}
{daemonStatus !== 'NotOk' && InfoView} - {S_STATE.networkEnvSelect && - daemonStatus !== 'NotOk' && - networkEnv && - showEnvSelect && ( - setShowEnvSelect(false)} - current={networkEnv} - /> - )} ); } diff --git a/nym-vpn-app/src/screens/settings/info-data/NetworkEnvSelect.tsx b/nym-vpn-app/src/screens/settings/info-data/NetworkEnvSelect.tsx deleted file mode 100644 index abf14fc213..0000000000 --- a/nym-vpn-app/src/screens/settings/info-data/NetworkEnvSelect.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { useState } from 'react'; -import clsx from 'clsx'; -import { Description, Field, Label, Select } from '@headlessui/react'; -import { motion } from 'framer-motion'; -import { invoke } from '@tauri-apps/api/core'; -import { BackendError, NetworkEnv } from '../../../types'; -import { Button, Dialog, MsIcon } from '../../../ui'; - -type NetworkOption = { value: NetworkEnv; label: string }; - -const options: NetworkOption[] = [ - { value: 'mainnet', label: 'Mainnet' }, - { value: 'canary', label: 'Canary' }, - { value: 'qa', label: 'QA' }, - { value: 'sandbox', label: 'Sandbox' }, -]; - -export type Props = { - open: boolean; - onClose: () => void; - current: NetworkEnv; -}; - -function NetworkEnvSelect({ open, onClose, current }: Props) { - const [error, setError] = useState(); - - const handleOnSelect = async (network: NetworkEnv) => { - setError(null); - try { - console.info('setting network to', network); - await invoke('set_network', { network }); - } catch (e: unknown) { - const error = e as BackendError; - console.warn('failed to set network', error); - setError(`Failed to set network: ${error.key} - ${error.message}`); - } - }; - - return ( - onClose()}> - - - - This require to restart the daemon to take effect - -
- - -
-
- {error && ( - - {error} - - )} - -
- ); -} - -export default NetworkEnvSelect; diff --git a/nym-vpn-app/src/static.ts b/nym-vpn-app/src/static.ts index 086861aeac..9ad1b6c7f3 100644 --- a/nym-vpn-app/src/static.ts +++ b/nym-vpn-app/src/static.ts @@ -4,5 +4,5 @@ export const S_STATE = { vpnModeInit: false, networkEnvInit: false, systemMessageInit: false, - networkEnvSelect: false, + devMode: false, }; diff --git a/nym-vpn-app/src/ui/TopBar.tsx b/nym-vpn-app/src/ui/TopBar.tsx index e538178ac2..9ec93e9b80 100644 --- a/nym-vpn-app/src/ui/TopBar.tsx +++ b/nym-vpn-app/src/ui/TopBar.tsx @@ -162,6 +162,13 @@ export default function TopBar() { navigate(-1); }, }, + '/settings/dev': { + title: 'dev', + leftIcon: 'arrow_back', + handleLeftNav: () => { + navigate(-1); + }, + }, '/entry-node-location': { title: t('first-hop-selection'), leftIcon: 'arrow_back', diff --git a/nym-vpn-app/vpnd_compat.toml b/nym-vpn-app/vpnd_compat.toml index f9b07639e3..4f36884b0e 100644 --- a/nym-vpn-app/vpnd_compat.toml +++ b/nym-vpn-app/vpnd_compat.toml @@ -1,2 +1,2 @@ # semver requirement of supported daemon version(s) -version = ">=1.1.0" +version = ">=1.2.0-dev"