mirror of
https://github.com/clash-verge-rev/clash-verge-rev
synced 2025-05-05 04:43:44 +08:00
fix: serde::json passing IVerge to the front end without deserialization
This commit is contained in:
parent
4d0dbdaced
commit
a89a828b35
@ -169,8 +169,10 @@ pub async fn patch_clash_config(payload: Mapping) -> CmdResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub fn get_verge_config() -> CmdResult<IVerge> {
|
pub fn get_verge_config() -> CmdResult<IVergeResponse> {
|
||||||
Ok(Config::verge().data().clone())
|
let verge = Config::verge();
|
||||||
|
let verge_data = verge.data().clone();
|
||||||
|
Ok(IVergeResponse::from(verge_data))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
|
@ -116,7 +116,7 @@ pub struct IVerge {
|
|||||||
/// proxy 页面布局 列数
|
/// proxy 页面布局 列数
|
||||||
pub proxy_layout_column: Option<i32>,
|
pub proxy_layout_column: Option<i32>,
|
||||||
|
|
||||||
/// 测试网站列表
|
/// 测试站列表
|
||||||
pub test_list: Option<Vec<IVergeTestItem>>,
|
pub test_list: Option<Vec<IVergeTestItem>>,
|
||||||
|
|
||||||
/// 日志清理
|
/// 日志清理
|
||||||
@ -153,7 +153,8 @@ pub struct IVerge {
|
|||||||
#[serde(
|
#[serde(
|
||||||
serialize_with = "serialize_encrypted",
|
serialize_with = "serialize_encrypted",
|
||||||
deserialize_with = "deserialize_encrypted",
|
deserialize_with = "deserialize_encrypted",
|
||||||
skip_serializing_if = "Option::is_none"
|
skip_serializing_if = "Option::is_none",
|
||||||
|
default
|
||||||
)]
|
)]
|
||||||
pub webdav_url: Option<String>,
|
pub webdav_url: Option<String>,
|
||||||
|
|
||||||
@ -161,7 +162,8 @@ pub struct IVerge {
|
|||||||
#[serde(
|
#[serde(
|
||||||
serialize_with = "serialize_encrypted",
|
serialize_with = "serialize_encrypted",
|
||||||
deserialize_with = "deserialize_encrypted",
|
deserialize_with = "deserialize_encrypted",
|
||||||
skip_serializing_if = "Option::is_none"
|
skip_serializing_if = "Option::is_none",
|
||||||
|
default
|
||||||
)]
|
)]
|
||||||
pub webdav_username: Option<String>,
|
pub webdav_username: Option<String>,
|
||||||
|
|
||||||
@ -169,7 +171,8 @@ pub struct IVerge {
|
|||||||
#[serde(
|
#[serde(
|
||||||
serialize_with = "serialize_encrypted",
|
serialize_with = "serialize_encrypted",
|
||||||
deserialize_with = "deserialize_encrypted",
|
deserialize_with = "deserialize_encrypted",
|
||||||
skip_serializing_if = "Option::is_none"
|
skip_serializing_if = "Option::is_none",
|
||||||
|
default
|
||||||
)]
|
)]
|
||||||
pub webdav_password: Option<String>,
|
pub webdav_password: Option<String>,
|
||||||
}
|
}
|
||||||
@ -254,6 +257,9 @@ impl IVerge {
|
|||||||
auto_check_update: Some(true),
|
auto_check_update: Some(true),
|
||||||
enable_builtin_enhanced: Some(true),
|
enable_builtin_enhanced: Some(true),
|
||||||
auto_log_clean: Some(3),
|
auto_log_clean: Some(3),
|
||||||
|
webdav_url: None,
|
||||||
|
webdav_username: None,
|
||||||
|
webdav_password: None,
|
||||||
..Self::default()
|
..Self::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -361,3 +367,124 @@ impl IVerge {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize)]
|
||||||
|
pub struct IVergeResponse {
|
||||||
|
pub app_log_level: Option<String>,
|
||||||
|
pub language: Option<String>,
|
||||||
|
pub theme_mode: Option<String>,
|
||||||
|
pub tray_event: Option<String>,
|
||||||
|
pub env_type: Option<String>,
|
||||||
|
pub start_page: Option<String>,
|
||||||
|
pub startup_script: Option<String>,
|
||||||
|
pub traffic_graph: Option<bool>,
|
||||||
|
pub enable_memory_usage: Option<bool>,
|
||||||
|
pub enable_group_icon: Option<bool>,
|
||||||
|
pub common_tray_icon: Option<bool>,
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
pub tray_icon: Option<String>,
|
||||||
|
pub menu_icon: Option<String>,
|
||||||
|
pub sysproxy_tray_icon: Option<bool>,
|
||||||
|
pub tun_tray_icon: Option<bool>,
|
||||||
|
pub enable_tun_mode: Option<bool>,
|
||||||
|
pub enable_auto_launch: Option<bool>,
|
||||||
|
pub enable_silent_start: Option<bool>,
|
||||||
|
pub enable_system_proxy: Option<bool>,
|
||||||
|
pub enable_proxy_guard: Option<bool>,
|
||||||
|
pub use_default_bypass: Option<bool>,
|
||||||
|
pub system_proxy_bypass: Option<String>,
|
||||||
|
pub proxy_guard_duration: Option<u64>,
|
||||||
|
pub proxy_auto_config: Option<bool>,
|
||||||
|
pub pac_file_content: Option<String>,
|
||||||
|
pub theme_setting: Option<IVergeTheme>,
|
||||||
|
pub web_ui_list: Option<Vec<String>>,
|
||||||
|
pub clash_core: Option<String>,
|
||||||
|
pub hotkeys: Option<Vec<String>>,
|
||||||
|
pub auto_close_connection: Option<bool>,
|
||||||
|
pub auto_check_update: Option<bool>,
|
||||||
|
pub default_latency_test: Option<String>,
|
||||||
|
pub default_latency_timeout: Option<i32>,
|
||||||
|
pub enable_builtin_enhanced: Option<bool>,
|
||||||
|
pub proxy_layout_column: Option<i32>,
|
||||||
|
pub test_list: Option<Vec<IVergeTestItem>>,
|
||||||
|
pub auto_log_clean: Option<i32>,
|
||||||
|
pub enable_random_port: Option<bool>,
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
pub verge_redir_port: Option<u16>,
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
pub verge_redir_enabled: Option<bool>,
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
pub verge_tproxy_port: Option<u16>,
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
pub verge_tproxy_enabled: Option<bool>,
|
||||||
|
pub verge_mixed_port: Option<u16>,
|
||||||
|
pub verge_socks_port: Option<u16>,
|
||||||
|
pub verge_socks_enabled: Option<bool>,
|
||||||
|
pub verge_port: Option<u16>,
|
||||||
|
pub verge_http_enabled: Option<bool>,
|
||||||
|
pub webdav_url: Option<String>,
|
||||||
|
pub webdav_username: Option<String>,
|
||||||
|
pub webdav_password: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<IVerge> for IVergeResponse {
|
||||||
|
fn from(verge: IVerge) -> Self {
|
||||||
|
Self {
|
||||||
|
app_log_level: verge.app_log_level,
|
||||||
|
language: verge.language,
|
||||||
|
theme_mode: verge.theme_mode,
|
||||||
|
tray_event: verge.tray_event,
|
||||||
|
env_type: verge.env_type,
|
||||||
|
start_page: verge.start_page,
|
||||||
|
startup_script: verge.startup_script,
|
||||||
|
traffic_graph: verge.traffic_graph,
|
||||||
|
enable_memory_usage: verge.enable_memory_usage,
|
||||||
|
enable_group_icon: verge.enable_group_icon,
|
||||||
|
common_tray_icon: verge.common_tray_icon,
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
tray_icon: verge.tray_icon,
|
||||||
|
menu_icon: verge.menu_icon,
|
||||||
|
sysproxy_tray_icon: verge.sysproxy_tray_icon,
|
||||||
|
tun_tray_icon: verge.tun_tray_icon,
|
||||||
|
enable_tun_mode: verge.enable_tun_mode,
|
||||||
|
enable_auto_launch: verge.enable_auto_launch,
|
||||||
|
enable_silent_start: verge.enable_silent_start,
|
||||||
|
enable_system_proxy: verge.enable_system_proxy,
|
||||||
|
enable_proxy_guard: verge.enable_proxy_guard,
|
||||||
|
use_default_bypass: verge.use_default_bypass,
|
||||||
|
system_proxy_bypass: verge.system_proxy_bypass,
|
||||||
|
proxy_guard_duration: verge.proxy_guard_duration,
|
||||||
|
proxy_auto_config: verge.proxy_auto_config,
|
||||||
|
pac_file_content: verge.pac_file_content,
|
||||||
|
theme_setting: verge.theme_setting,
|
||||||
|
web_ui_list: verge.web_ui_list,
|
||||||
|
clash_core: verge.clash_core,
|
||||||
|
hotkeys: verge.hotkeys,
|
||||||
|
auto_close_connection: verge.auto_close_connection,
|
||||||
|
auto_check_update: verge.auto_check_update,
|
||||||
|
default_latency_test: verge.default_latency_test,
|
||||||
|
default_latency_timeout: verge.default_latency_timeout,
|
||||||
|
enable_builtin_enhanced: verge.enable_builtin_enhanced,
|
||||||
|
proxy_layout_column: verge.proxy_layout_column,
|
||||||
|
test_list: verge.test_list,
|
||||||
|
auto_log_clean: verge.auto_log_clean,
|
||||||
|
enable_random_port: verge.enable_random_port,
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
verge_redir_port: verge.verge_redir_port,
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
verge_redir_enabled: verge.verge_redir_enabled,
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
verge_tproxy_port: verge.verge_tproxy_port,
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
verge_tproxy_enabled: verge.verge_tproxy_enabled,
|
||||||
|
verge_mixed_port: verge.verge_mixed_port,
|
||||||
|
verge_socks_port: verge.verge_socks_port,
|
||||||
|
verge_socks_enabled: verge.verge_socks_enabled,
|
||||||
|
verge_port: verge.verge_port,
|
||||||
|
verge_http_enabled: verge.verge_http_enabled,
|
||||||
|
webdav_url: verge.webdav_url,
|
||||||
|
webdav_username: verge.webdav_username,
|
||||||
|
webdav_password: verge.webdav_password,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -58,6 +58,14 @@ export const BackupConfigViewer = memo(
|
|||||||
webdav_username !== username ||
|
webdav_username !== username ||
|
||||||
webdav_password !== password;
|
webdav_password !== password;
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
"webdavChanged",
|
||||||
|
webdavChanged,
|
||||||
|
webdav_url,
|
||||||
|
webdav_username,
|
||||||
|
webdav_password,
|
||||||
|
);
|
||||||
|
|
||||||
const handleClickShowPassword = () => {
|
const handleClickShowPassword = () => {
|
||||||
setShowPassword((prev) => !prev);
|
setShowPassword((prev) => !prev);
|
||||||
};
|
};
|
||||||
@ -98,12 +106,14 @@ export const BackupConfigViewer = memo(
|
|||||||
checkForm();
|
checkForm();
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
await saveWebdavConfig(data.url, data.username, data.password).then(
|
await saveWebdavConfig(
|
||||||
() => {
|
data.url.trim(),
|
||||||
Notice.success(t("WebDAV Config Saved"));
|
data.username.trim(),
|
||||||
onSaveSuccess();
|
data.password.trim(),
|
||||||
}
|
).then(() => {
|
||||||
);
|
Notice.success(t("WebDAV Config Saved"));
|
||||||
|
onSaveSuccess();
|
||||||
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
Notice.error(t("WebDAV Config Save Failed", { error }), 3000);
|
Notice.error(t("WebDAV Config Save Failed", { error }), 3000);
|
||||||
} finally {
|
} finally {
|
||||||
@ -193,9 +203,9 @@ export const BackupConfigViewer = memo(
|
|||||||
sx={{ height: "100%" }}
|
sx={{ height: "100%" }}
|
||||||
>
|
>
|
||||||
{webdavChanged ||
|
{webdavChanged ||
|
||||||
webdav_url === null ||
|
webdav_url === undefined ||
|
||||||
webdav_username === null ||
|
webdav_username === undefined ||
|
||||||
webdav_password === null ? (
|
webdav_password === undefined ? (
|
||||||
<Button
|
<Button
|
||||||
variant="contained"
|
variant="contained"
|
||||||
color={"primary"}
|
color={"primary"}
|
||||||
@ -231,5 +241,5 @@ export const BackupConfigViewer = memo(
|
|||||||
</Grid2>
|
</Grid2>
|
||||||
</form>
|
</form>
|
||||||
);
|
);
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
@ -4,7 +4,11 @@ import { getVergeConfig, patchVergeConfig } from "@/services/cmds";
|
|||||||
export const useVerge = () => {
|
export const useVerge = () => {
|
||||||
const { data: verge, mutate: mutateVerge } = useSWR(
|
const { data: verge, mutate: mutateVerge } = useSWR(
|
||||||
"getVergeConfig",
|
"getVergeConfig",
|
||||||
getVergeConfig
|
async () => {
|
||||||
|
const config = await getVergeConfig();
|
||||||
|
console.log("Received verge config:", config);
|
||||||
|
return config;
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
const patchVerge = async (value: Partial<IVergeConfig>) => {
|
const patchVerge = async (value: Partial<IVergeConfig>) => {
|
||||||
|
@ -20,7 +20,7 @@ export async function patchProfilesConfig(profiles: IProfilesConfig) {
|
|||||||
|
|
||||||
export async function createProfile(
|
export async function createProfile(
|
||||||
item: Partial<IProfileItem>,
|
item: Partial<IProfileItem>,
|
||||||
fileData?: string | null
|
fileData?: string | null,
|
||||||
) {
|
) {
|
||||||
return invoke<void>("create_profile", { item, fileData });
|
return invoke<void>("create_profile", { item, fileData });
|
||||||
}
|
}
|
||||||
@ -61,7 +61,7 @@ export async function deleteProfile(index: string) {
|
|||||||
|
|
||||||
export async function patchProfile(
|
export async function patchProfile(
|
||||||
index: string,
|
index: string,
|
||||||
profile: Partial<IProfileItem>
|
profile: Partial<IProfileItem>,
|
||||||
) {
|
) {
|
||||||
return invoke<void>("patch_profile", { index, profile });
|
return invoke<void>("patch_profile", { index, profile });
|
||||||
}
|
}
|
||||||
@ -132,19 +132,19 @@ export async function getAppDir() {
|
|||||||
|
|
||||||
export async function openAppDir() {
|
export async function openAppDir() {
|
||||||
return invoke<void>("open_app_dir").catch((err) =>
|
return invoke<void>("open_app_dir").catch((err) =>
|
||||||
Notice.error(err?.message || err.toString(), 1500)
|
Notice.error(err?.message || err.toString(), 1500),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function openCoreDir() {
|
export async function openCoreDir() {
|
||||||
return invoke<void>("open_core_dir").catch((err) =>
|
return invoke<void>("open_core_dir").catch((err) =>
|
||||||
Notice.error(err?.message || err.toString(), 1500)
|
Notice.error(err?.message || err.toString(), 1500),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function openLogsDir() {
|
export async function openLogsDir() {
|
||||||
return invoke<void>("open_logs_dir").catch((err) =>
|
return invoke<void>("open_logs_dir").catch((err) =>
|
||||||
Notice.error(err?.message || err.toString(), 1500)
|
Notice.error(err?.message || err.toString(), 1500),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,7 +155,7 @@ export async function openWebUrl(url: string) {
|
|||||||
export async function cmdGetProxyDelay(
|
export async function cmdGetProxyDelay(
|
||||||
name: string,
|
name: string,
|
||||||
timeout: number,
|
timeout: number,
|
||||||
url?: string
|
url?: string,
|
||||||
) {
|
) {
|
||||||
name = encodeURIComponent(name);
|
name = encodeURIComponent(name);
|
||||||
return invoke<{ delay: number }>("clash_api_get_proxy_delay", {
|
return invoke<{ delay: number }>("clash_api_get_proxy_delay", {
|
||||||
@ -183,7 +183,7 @@ export async function checkService() {
|
|||||||
}
|
}
|
||||||
export async function invoke_uwp_tool() {
|
export async function invoke_uwp_tool() {
|
||||||
return invoke<void>("invoke_uwp_tool").catch((err) =>
|
return invoke<void>("invoke_uwp_tool").catch((err) =>
|
||||||
Notice.error(err?.message || err.toString(), 1500)
|
Notice.error(err?.message || err.toString(), 1500),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,7 +201,7 @@ export async function exitApp() {
|
|||||||
|
|
||||||
export async function copyIconFile(
|
export async function copyIconFile(
|
||||||
path: string,
|
path: string,
|
||||||
name: "common" | "sysproxy" | "tun"
|
name: "common" | "sysproxy" | "tun",
|
||||||
) {
|
) {
|
||||||
return invoke<void>("copy_icon_file", { path, name });
|
return invoke<void>("copy_icon_file", { path, name });
|
||||||
}
|
}
|
||||||
@ -233,7 +233,7 @@ export async function restoreWebDavBackup(filename: string) {
|
|||||||
export async function saveWebdavConfig(
|
export async function saveWebdavConfig(
|
||||||
url: string,
|
url: string,
|
||||||
username: string,
|
username: string,
|
||||||
password: String
|
password: String,
|
||||||
) {
|
) {
|
||||||
return invoke<void>("save_webdav_config", {
|
return invoke<void>("save_webdav_config", {
|
||||||
url,
|
url,
|
||||||
|
1
src/services/types.d.ts
vendored
1
src/services/types.d.ts
vendored
@ -708,7 +708,6 @@ interface IVergeConfig {
|
|||||||
tun_tray_icon?: boolean;
|
tun_tray_icon?: boolean;
|
||||||
enable_tun_mode?: boolean;
|
enable_tun_mode?: boolean;
|
||||||
enable_auto_launch?: boolean;
|
enable_auto_launch?: boolean;
|
||||||
enable_service_mode?: boolean;
|
|
||||||
enable_silent_start?: boolean;
|
enable_silent_start?: boolean;
|
||||||
enable_system_proxy?: boolean;
|
enable_system_proxy?: boolean;
|
||||||
proxy_auto_config?: boolean;
|
proxy_auto_config?: boolean;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user