ソースを参照

feat: Optimize copy environment variable logic (#106)

Pylogmon 1 年間 前
コミット
15ab43963d

+ 8 - 0
src-tauri/src/config/verge.rs

@@ -26,6 +26,9 @@ pub struct IVerge {
     /// tray click event
     pub tray_event: Option<String>,
 
+    /// copy env type
+    pub env_type: Option<String>,
+
     /// enable traffic graph default is true
     pub traffic_graph: Option<bool>,
 
@@ -133,6 +136,10 @@ impl IVerge {
             clash_core: Some("clash-meta".into()),
             language: Some("zh".into()),
             theme_mode: Some("system".into()),
+            #[cfg(not(target_os = "windows"))]
+            env_type: Some("bash".into()),
+            #[cfg(target_os = "windows")]
+            env_type: Some("powershell".into()),
             theme_blur: Some(false),
             traffic_graph: Some(true),
             enable_memory_usage: Some(true),
@@ -172,6 +179,7 @@ impl IVerge {
         patch!(theme_mode);
         patch!(theme_blur);
         patch!(tray_event);
+        patch!(env_type);
         patch!(traffic_graph);
         patch!(enable_memory_usage);
 

+ 3 - 15
src-tauri/src/core/tray.rs

@@ -52,16 +52,8 @@ impl Tray {
             ))
             .add_item(CustomMenuItem::new("tun_mode", t!("TUN Mode", "Tun 模式")))
             .add_item(CustomMenuItem::new(
-                "copy_env_sh",
-                t!("Copy Env (sh)", "复制环境变量(sh)"),
-            ))
-            .add_item(CustomMenuItem::new(
-                "copy_env_cmd",
-                t!("Copy Env (CMD)", "复制环境变量(CMD)"),
-            ))
-            .add_item(CustomMenuItem::new(
-                "copy_env_ps",
-                t!("Copy Env (PS)", "复制环境变量(PS)"),
+                "copy_env",
+                t!("Copy Env", "复制环境变量"),
             ))
             .add_submenu(SystemTraySubmenu::new(
                 t!("Open Dir", "打开目录"),
@@ -204,11 +196,7 @@ impl Tray {
                 "open_window" => resolve::create_window(app_handle),
                 "system_proxy" => feat::toggle_system_proxy(),
                 "tun_mode" => feat::toggle_tun_mode(),
-                "copy_env_sh" => feat::copy_clash_env(app_handle, "sh"),
-                #[cfg(target_os = "windows")]
-                "copy_env_cmd" => feat::copy_clash_env(app_handle, "cmd"),
-                #[cfg(target_os = "windows")]
-                "copy_env_ps" => feat::copy_clash_env(app_handle, "ps"),
+                "copy_env" => feat::copy_clash_env(app_handle),
                 "open_app_dir" => crate::log_err!(cmds::open_app_dir()),
                 "open_core_dir" => crate::log_err!(cmds::open_core_dir()),
                 "open_logs_dir" => crate::log_err!(cmds::open_logs_dir()),

+ 18 - 5
src-tauri/src/feat.rs

@@ -337,7 +337,7 @@ async fn update_core_config() -> Result<()> {
 }
 
 /// copy env variable
-pub fn copy_clash_env(app_handle: &AppHandle, option: &str) {
+pub fn copy_clash_env(app_handle: &AppHandle) {
     let port = { Config::verge().latest().verge_mixed_port.unwrap_or(7897) };
     let http_proxy = format!("http://127.0.0.1:{}", port);
     let socks5_proxy = format!("socks5://127.0.0.1:{}", port);
@@ -346,12 +346,25 @@ pub fn copy_clash_env(app_handle: &AppHandle, option: &str) {
         format!("export https_proxy={http_proxy} http_proxy={http_proxy} all_proxy={socks5_proxy}");
     let cmd: String = format!("set http_proxy={http_proxy} \n set https_proxy={http_proxy}");
     let ps: String = format!("$env:HTTP_PROXY=\"{http_proxy}\"; $env:HTTPS_PROXY=\"{http_proxy}\"");
+
     let mut cliboard = app_handle.clipboard_manager();
 
-    match option {
-        "sh" => cliboard.write_text(sh).unwrap_or_default(),
+    let env_type = { Config::verge().latest().env_type.clone() };
+    let env_type = match env_type {
+        Some(env_type) => env_type,
+        None => {
+            #[cfg(not(target_os = "windows"))]
+            let default = "bash";
+            #[cfg(target_os = "windows")]
+            let default = "powershell";
+
+            default.to_string()
+        }
+    };
+    match env_type.as_str() {
+        "bash" => cliboard.write_text(sh).unwrap_or_default(),
         "cmd" => cliboard.write_text(cmd).unwrap_or_default(),
-        "ps" => cliboard.write_text(ps).unwrap_or_default(),
-        _ => log::error!(target: "app", "copy_clash_env: Invalid option! {option}"),
+        "powershell" => cliboard.write_text(ps).unwrap_or_default(),
+        _ => log::error!(target: "app", "copy_clash_env: Invalid env type! {env_type}"),
     };
 }

+ 17 - 1
src/components/setting/setting-verge.tsx

@@ -29,7 +29,7 @@ const SettingVerge = ({ onError }: Props) => {
   const { t } = useTranslation();
 
   const { verge, patchVerge, mutateVerge } = useVerge();
-  const { theme_mode, language, tray_event } = verge ?? {};
+  const { theme_mode, language, tray_event, env_type } = verge ?? {};
   const configRef = useRef<DialogRef>(null);
   const hotkeyRef = useRef<DialogRef>(null);
   const miscRef = useRef<DialogRef>(null);
@@ -109,6 +109,22 @@ const SettingVerge = ({ onError }: Props) => {
         </SettingItem>
       )}
 
+      <SettingItem label={t("Copy Env Type")}>
+        <GuardState
+          value={env_type ?? OS === "windows" ? "powershell" : "bash"}
+          onCatch={onError}
+          onFormat={(e: any) => e.target.value}
+          onChange={(e) => onChangeData({ env_type: e })}
+          onGuard={(e) => patchVerge({ env_type: e })}
+        >
+          <Select size="small" sx={{ width: 140, "> div": { py: "7.5px" } }}>
+            <MenuItem value="bash">Bash</MenuItem>
+            <MenuItem value="cmd">CMD</MenuItem>
+            <MenuItem value="powershell">PowerShell</MenuItem>
+          </Select>
+        </GuardState>
+      </SettingItem>
+
       <SettingItem label={t("Theme Setting")}>
         <IconButton
           color="inherit"

+ 1 - 0
src/locales/en.json

@@ -90,6 +90,7 @@
   "Theme Mode": "Theme Mode",
   "Theme Blur": "Theme Blur",
   "Tray Click Event": "Tray Click Event",
+  "Copy Env Type": "Copy Env Type",
   "Show Main Window": "Show Main Window",
   "Theme Setting": "Theme Setting",
   "Layout Setting": "Layout Setting",

+ 1 - 0
src/locales/ru.json

@@ -81,6 +81,7 @@
   "Theme Mode": "Режим темы",
   "Theme Blur": "Размытие темы",
   "Tray Click Event": "Событие щелчка в лотке",
+  "Copy Env Type": "Скопировать тип Env",
   "Show Main Window": "Показать главное окно",
   "Theme Setting": "Настройка темы",
   "Hotkey Setting": "Настройка клавиатурных сокращений",

+ 1 - 0
src/locales/zh.json

@@ -90,6 +90,7 @@
   "Theme Mode": "主题模式",
   "Theme Blur": "背景模糊",
   "Tray Click Event": "托盘点击事件",
+  "Copy Env Type": "复制环境变量类型",
   "Show Main Window": "显示主窗口",
   "Theme Setting": "主题设置",
   "Layout Setting": "界面设置",

+ 1 - 0
src/services/types.d.ts

@@ -156,6 +156,7 @@ interface IVergeConfig {
   app_log_level?: "trace" | "debug" | "info" | "warn" | "error" | string;
   language?: string;
   tray_event?: "main_window" | "system_proxy" | "tun_mode" | string;
+  env_type?: "bash" | "cmd" | "powershell" | string;
   clash_core?: string;
   theme_mode?: "light" | "dark" | "system";
   theme_blur?: boolean;