diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index eeaabd5c6cc981678ed3fc8d0bdde01d06d0e29d..577036f91683e94f14e642c7e566e5ba60c0d35d 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -180,17 +180,10 @@ pub fn view_profile(index: usize, profiles_state: State<'_, ProfilesState>) -> R }; } - // use `open` command - if let Ok(open) = which::which("open") { - return match Command::new(open).arg(path).spawn() { - Ok(_) => Ok(()), - Err(_) => Err("failed to open file by `open`".into()), - }; + match open_command().arg(path).spawn() { + Ok(_) => Ok(()), + Err(_) => Err("failed to open file by `open`".into()), } - - // recommand to use vscode - // todo: support other editors - return Err("please install VScode".into()); } /// restart the sidecar @@ -279,3 +272,35 @@ pub async fn patch_verge_config( let mut verge = verge_state.0.lock().unwrap(); verge.patch_config(payload) } + +/// open app config dir +#[tauri::command] +pub fn open_app_dir() -> Result<(), String> { + let app_dir = app_home_dir(); + + match open_command().arg(app_dir).spawn() { + Ok(_) => Ok(()), + Err(_) => Err("failed to open logs dir".into()), + } +} + +/// open logs dir +#[tauri::command] +pub fn open_logs_dir() -> Result<(), String> { + let log_dir = app_home_dir().join("logs"); + + match open_command().arg(log_dir).spawn() { + Ok(_) => Ok(()), + Err(_) => Err("failed to open logs dir".into()), + } +} + +/// get open/explorer command +fn open_command() -> Command { + let open = if cfg!(target_os = "windows") { + "explorer" + } else { + "open" + }; + Command::new(open) +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index c8a905cf9bfb72f4bb9afb0314791c24e1fcfe2b..31dcdc8aa8aa73cda3f071c328da783cd026d637 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -74,6 +74,8 @@ fn main() -> std::io::Result<()> { cmds::restart_sidecar, cmds::get_sys_proxy, cmds::get_cur_proxy, + cmds::open_app_dir, + cmds::open_logs_dir, // clash cmds::get_clash_info, cmds::patch_clash_config, diff --git a/src/components/setting/setting-verge.tsx b/src/components/setting/setting-verge.tsx index 14c0791a6a85f60f2f1b4e8ed28ef5e1fb56968a..fab9847f62b14ac06975b0074853238f9d9ebb82 100644 --- a/src/components/setting/setting-verge.tsx +++ b/src/components/setting/setting-verge.tsx @@ -1,11 +1,17 @@ import useSWR, { useSWRConfig } from "swr"; -import { ListItemText, Switch, Typography } from "@mui/material"; -import { getVergeConfig, patchVergeConfig } from "../../services/cmds"; +import { IconButton, ListItemText, Switch, Typography } from "@mui/material"; +import { + getVergeConfig, + openAppDir, + openLogsDir, + patchVergeConfig, +} from "../../services/cmds"; import { SettingList, SettingItem } from "./setting"; import { CmdType } from "../../services/types"; import { version } from "../../../package.json"; import GuardState from "./guard-state"; import PaletteSwitch from "./palette-switch"; +import { ArrowForward } from "@mui/icons-material"; interface Props { onError?: (err: Error) => void; @@ -55,6 +61,27 @@ const SettingVerge = ({ onError }: Props) => { </GuardState> </SettingItem> + <SettingItem> + <ListItemText primary="Open App Dir" /> + <IconButton + color="inherit" + size="small" + onClick={() => { + console.log("click"); + openAppDir().then(console.log).catch(console.log); + }} + > + <ArrowForward /> + </IconButton> + </SettingItem> + + <SettingItem> + <ListItemText primary="Open Logs Dir" /> + <IconButton color="inherit" size="small" onClick={openLogsDir}> + <ArrowForward /> + </IconButton> + </SettingItem> + <SettingItem> <ListItemText primary="Version" /> <Typography sx={{ py: "6px" }}>v{version}</Typography> diff --git a/src/services/cmds.ts b/src/services/cmds.ts index 5f9cf0858dfa5134d2d2e71d1b8b113877f5ea48..9ef9c131fef51eff7801349fcfb373c716ef5bd3 100644 --- a/src/services/cmds.ts +++ b/src/services/cmds.ts @@ -63,3 +63,11 @@ export async function patchVergeConfig(payload: CmdType.VergeConfig) { export async function getSystemProxy() { return invoke<any>("get_sys_proxy"); } + +export async function openAppDir() { + return invoke<void>("open_app_dir"); +} + +export async function openLogsDir() { + return invoke<void>("open_logs_dir"); +}