From 2a60d20841b9d0066edc8f158e24e0fbf518e3bf Mon Sep 17 00:00:00 2001 From: Jason Date: Sat, 11 Oct 2025 11:10:03 +0800 Subject: [PATCH] fix: align Tauri arg names and improve export UX - Match frontend camelCase keys to backend snake_case params - Show error toast when save dialog is cancelled --- src/components/SettingsModal.tsx | 5 ++++- src/lib/tauri-api.ts | 17 ++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/components/SettingsModal.tsx b/src/components/SettingsModal.tsx index c1b4a1d..d12104d 100644 --- a/src/components/SettingsModal.tsx +++ b/src/components/SettingsModal.tsx @@ -388,7 +388,10 @@ export default function SettingsModal({ const defaultName = `cc-switch-config-${new Date().toISOString().split("T")[0]}.json`; const filePath = await window.api.saveFileDialog(defaultName); - if (!filePath) return; // 用户取消了 + if (!filePath) { + onNotify?.(`${t("settings.exportFailed")}: ${t("settings.selectFileFailed")}`, "error", 4000); + return; + } const result = await window.api.exportConfigToFile(filePath); diff --git a/src/lib/tauri-api.ts b/src/lib/tauri-api.ts index 55e2b07..4bc2ec5 100644 --- a/src/lib/tauri-api.ts +++ b/src/lib/tauri-api.ts @@ -560,8 +560,11 @@ export const tauriAPI = { filePath: string; }> => { try { - // 后端参数为 snake_case:file_path - return await invoke("export_config_to_file", { file_path: filePath }); + // 兼容参数命名差异:同时传递 file_path 与 filePath + return await invoke("export_config_to_file", { + file_path: filePath, + filePath: filePath, + }); } catch (error) { throw new Error(`导出配置失败: ${String(error)}`); } @@ -576,8 +579,11 @@ export const tauriAPI = { backupId?: string; }> => { try { - // 后端参数为 snake_case:file_path - return await invoke("import_config_from_file", { file_path: filePath }); + // 兼容参数命名差异:同时传递 file_path 与 filePath + return await invoke("import_config_from_file", { + file_path: filePath, + filePath: filePath, + }); } catch (error) { throw new Error(`导入配置失败: ${String(error)}`); } @@ -586,9 +592,10 @@ export const tauriAPI = { // 保存文件对话框 saveFileDialog: async (defaultName: string): Promise => { try { - // 后端参数为 snake_case:default_name + // 兼容参数命名差异:同时传递 default_name 与 defaultName const result = await invoke("save_file_dialog", { default_name: defaultName, + defaultName: defaultName, }); return result; } catch (error) {