diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 8273d63a..a731546d 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -37,7 +37,7 @@ serde = { version = "1.0", features = ["derive"] } reqwest = { version = "0.12", features = ["json", "rustls-tls"] } sysproxy = { git="https://github.com/zzzgydi/sysproxy-rs", branch = "main" } auto-launch = { git="https://github.com/zzzgydi/auto-launch", branch = "main" } -tauri = { version = "1.6", features = [ "fs-exists", "path-all", "protocol-asset", "dialog-open", "notification-all", "icon-png", "icon-ico", "clipboard-all", "global-shortcut-all", "process-all", "shell-all", "system-tray", "updater", "window-all", "devtools"] } +tauri = { version = "1.6", features = [ "fs-read-file", "fs-exists", "path-all", "protocol-asset", "dialog-open", "notification-all", "icon-png", "icon-ico", "clipboard-all", "global-shortcut-all", "process-all", "shell-all", "system-tray", "updater", "window-all", "devtools"] } [target.'cfg(windows)'.dependencies] runas = "=1.2.0" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index ca097443..704a57a0 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -69,7 +69,8 @@ }, "fs": { "exists": true, - "scope": ["$APPDATA/**", "$RESOURCE/../**"] + "readFile": true, + "scope": ["$APPDATA/**", "$RESOURCE/../**", "**"] } }, "windows": [], diff --git a/src/pages/profiles.tsx b/src/pages/profiles.tsx index 91a8ae2b..fbdd551a 100644 --- a/src/pages/profiles.tsx +++ b/src/pages/profiles.tsx @@ -1,5 +1,5 @@ import useSWR, { mutate } from "swr"; -import { useMemo, useRef, useState } from "react"; +import { useEffect, useMemo, useRef, useState } from "react"; import { useLockFn } from "ahooks"; import { useSetRecoilState } from "recoil"; import { Box, Button, Grid, IconButton, Stack, Divider } from "@mui/material"; @@ -33,6 +33,7 @@ import { deleteProfile, updateProfile, reorderProfile, + createProfile, } from "@/services/cmds"; import { atomLoadingCache } from "@/services/states"; import { closeAllConnections } from "@/services/api"; @@ -49,6 +50,8 @@ import { throttle } from "lodash-es"; import { useRecoilState } from "recoil"; import { atomThemeMode } from "@/services/states"; import { BaseStyledTextField } from "@/components/base/base-styled-text-field"; +import { listen } from "@tauri-apps/api/event"; +import { readTextFile } from "@tauri-apps/api/fs"; const ProfilePage = () => { const { t } = useTranslation(); @@ -63,6 +66,35 @@ const ProfilePage = () => { coordinateGetter: sortableKeyboardCoordinates, }) ); + + useEffect(() => { + const unlisten = listen("tauri://file-drop", async (event) => { + const fileList = event.payload as string[]; + for (let file of fileList) { + if (!file.endsWith(".yaml") && !file.endsWith(".yml")) { + Notice.error("Only support YAML files."); + continue; + } + const item = { + type: "local", + name: file.split(/\/|\\/).pop() ?? "New Profile", + desc: "", + url: "", + option: { + with_proxy: false, + self_proxy: false, + }, + } as IProfileItem; + let data = await readTextFile(file); + await createProfile(item, data); + await mutateProfiles(); + } + }); + return () => { + unlisten.then((fn) => fn()); + }; + }, []); + const { profiles = {}, activateSelected,