2025-08-27 11:00:53 +08:00
|
|
|
|
import { invoke } from "@tauri-apps/api/core";
|
2025-09-06 16:21:21 +08:00
|
|
|
|
import { listen, UnlistenFn } from "@tauri-apps/api/event";
|
2025-08-27 11:00:53 +08:00
|
|
|
|
import { Provider } from "../types";
|
2025-08-23 20:38:57 +08:00
|
|
|
|
|
2025-08-30 21:54:11 +08:00
|
|
|
|
// 应用类型
|
|
|
|
|
|
export type AppType = "claude" | "codex";
|
|
|
|
|
|
|
2025-08-23 20:38:57 +08:00
|
|
|
|
// 定义配置状态类型
|
|
|
|
|
|
interface ConfigStatus {
|
|
|
|
|
|
exists: boolean;
|
|
|
|
|
|
path: string;
|
|
|
|
|
|
error?: string;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 定义导入结果类型
|
|
|
|
|
|
interface ImportResult {
|
|
|
|
|
|
success: boolean;
|
|
|
|
|
|
message?: string;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-25 10:30:45 +08:00
|
|
|
|
// Tauri API 封装,提供统一的全局 API 接口
|
2025-08-23 20:38:57 +08:00
|
|
|
|
export const tauriAPI = {
|
|
|
|
|
|
// 获取所有供应商
|
2025-08-30 21:54:11 +08:00
|
|
|
|
getProviders: async (app?: AppType): Promise<Record<string, Provider>> => {
|
2025-08-23 20:38:57 +08:00
|
|
|
|
try {
|
2025-08-31 16:43:33 +08:00
|
|
|
|
return await invoke("get_providers", { app_type: app, app });
|
2025-08-23 20:38:57 +08:00
|
|
|
|
} catch (error) {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
console.error("获取供应商列表失败:", error);
|
2025-08-23 20:38:57 +08:00
|
|
|
|
return {};
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 获取当前供应商ID
|
2025-08-30 21:54:11 +08:00
|
|
|
|
getCurrentProvider: async (app?: AppType): Promise<string> => {
|
2025-08-23 20:38:57 +08:00
|
|
|
|
try {
|
2025-08-31 16:43:33 +08:00
|
|
|
|
return await invoke("get_current_provider", { app_type: app, app });
|
2025-08-23 20:38:57 +08:00
|
|
|
|
} catch (error) {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
console.error("获取当前供应商失败:", error);
|
|
|
|
|
|
return "";
|
2025-08-23 20:38:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 添加供应商
|
2025-08-30 21:54:11 +08:00
|
|
|
|
addProvider: async (provider: Provider, app?: AppType): Promise<boolean> => {
|
2025-08-23 20:38:57 +08:00
|
|
|
|
try {
|
2025-08-31 16:43:33 +08:00
|
|
|
|
return await invoke("add_provider", { provider, app_type: app, app });
|
2025-08-23 20:38:57 +08:00
|
|
|
|
} catch (error) {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
console.error("添加供应商失败:", error);
|
2025-08-23 20:38:57 +08:00
|
|
|
|
throw error;
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 更新供应商
|
2025-08-30 21:54:11 +08:00
|
|
|
|
updateProvider: async (
|
|
|
|
|
|
provider: Provider,
|
2025-09-06 16:21:21 +08:00
|
|
|
|
app?: AppType
|
2025-08-30 21:54:11 +08:00
|
|
|
|
): Promise<boolean> => {
|
2025-08-23 20:38:57 +08:00
|
|
|
|
try {
|
2025-08-31 16:43:33 +08:00
|
|
|
|
return await invoke("update_provider", { provider, app_type: app, app });
|
2025-08-23 20:38:57 +08:00
|
|
|
|
} catch (error) {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
console.error("更新供应商失败:", error);
|
2025-08-23 20:38:57 +08:00
|
|
|
|
throw error;
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 删除供应商
|
2025-08-30 21:54:11 +08:00
|
|
|
|
deleteProvider: async (id: string, app?: AppType): Promise<boolean> => {
|
2025-08-23 20:38:57 +08:00
|
|
|
|
try {
|
2025-08-31 16:43:33 +08:00
|
|
|
|
return await invoke("delete_provider", { id, app_type: app, app });
|
2025-08-23 20:38:57 +08:00
|
|
|
|
} catch (error) {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
console.error("删除供应商失败:", error);
|
2025-08-23 20:38:57 +08:00
|
|
|
|
throw error;
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 切换供应商
|
2025-08-30 21:54:11 +08:00
|
|
|
|
switchProvider: async (
|
|
|
|
|
|
providerId: string,
|
2025-09-06 16:21:21 +08:00
|
|
|
|
app?: AppType
|
2025-08-30 21:54:11 +08:00
|
|
|
|
): Promise<boolean> => {
|
2025-08-23 20:38:57 +08:00
|
|
|
|
try {
|
2025-08-31 18:14:31 +08:00
|
|
|
|
return await invoke("switch_provider", {
|
|
|
|
|
|
id: providerId,
|
|
|
|
|
|
app_type: app,
|
|
|
|
|
|
app,
|
|
|
|
|
|
});
|
2025-08-23 20:38:57 +08:00
|
|
|
|
} catch (error) {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
console.error("切换供应商失败:", error);
|
2025-08-23 20:38:57 +08:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 导入当前配置为默认供应商
|
2025-08-30 21:54:11 +08:00
|
|
|
|
importCurrentConfigAsDefault: async (
|
2025-09-06 16:21:21 +08:00
|
|
|
|
app?: AppType
|
2025-08-30 21:54:11 +08:00
|
|
|
|
): Promise<ImportResult> => {
|
2025-08-23 20:38:57 +08:00
|
|
|
|
try {
|
2025-08-31 18:14:31 +08:00
|
|
|
|
const success = await invoke<boolean>("import_default_config", {
|
|
|
|
|
|
app_type: app,
|
|
|
|
|
|
app,
|
|
|
|
|
|
});
|
2025-08-23 20:38:57 +08:00
|
|
|
|
return {
|
|
|
|
|
|
success,
|
2025-08-27 11:00:53 +08:00
|
|
|
|
message: success ? "成功导入默认配置" : "导入失败",
|
2025-08-23 20:38:57 +08:00
|
|
|
|
};
|
|
|
|
|
|
} catch (error) {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
console.error("导入默认配置失败:", error);
|
2025-08-23 20:38:57 +08:00
|
|
|
|
return {
|
|
|
|
|
|
success: false,
|
2025-08-27 11:00:53 +08:00
|
|
|
|
message: String(error),
|
2025-08-23 20:38:57 +08:00
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 获取 Claude Code 配置文件路径
|
|
|
|
|
|
getClaudeCodeConfigPath: async (): Promise<string> => {
|
|
|
|
|
|
try {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
return await invoke("get_claude_code_config_path");
|
2025-08-23 20:38:57 +08:00
|
|
|
|
} catch (error) {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
console.error("获取配置路径失败:", error);
|
|
|
|
|
|
return "";
|
2025-08-23 20:38:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 获取 Claude Code 配置状态
|
|
|
|
|
|
getClaudeConfigStatus: async (): Promise<ConfigStatus> => {
|
|
|
|
|
|
try {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
return await invoke("get_claude_config_status");
|
2025-08-23 20:38:57 +08:00
|
|
|
|
} catch (error) {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
console.error("获取配置状态失败:", error);
|
2025-08-23 20:38:57 +08:00
|
|
|
|
return {
|
|
|
|
|
|
exists: false,
|
2025-08-27 11:00:53 +08:00
|
|
|
|
path: "",
|
|
|
|
|
|
error: String(error),
|
2025-08-23 20:38:57 +08:00
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2025-08-30 21:54:11 +08:00
|
|
|
|
// 获取应用配置状态(通用)
|
|
|
|
|
|
getConfigStatus: async (app?: AppType): Promise<ConfigStatus> => {
|
|
|
|
|
|
try {
|
2025-08-31 16:39:38 +08:00
|
|
|
|
return await invoke("get_config_status", { app_type: app, app });
|
2025-08-30 21:54:11 +08:00
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error("获取配置状态失败:", error);
|
|
|
|
|
|
return {
|
|
|
|
|
|
exists: false,
|
|
|
|
|
|
path: "",
|
|
|
|
|
|
error: String(error),
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2025-08-23 20:38:57 +08:00
|
|
|
|
// 打开配置文件夹
|
2025-08-30 21:54:11 +08:00
|
|
|
|
openConfigFolder: async (app?: AppType): Promise<void> => {
|
2025-08-23 20:38:57 +08:00
|
|
|
|
try {
|
2025-08-31 16:39:38 +08:00
|
|
|
|
await invoke("open_config_folder", { app_type: app, app });
|
2025-08-23 20:38:57 +08:00
|
|
|
|
} catch (error) {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
console.error("打开配置文件夹失败:", error);
|
2025-08-23 20:38:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 打开外部链接
|
|
|
|
|
|
openExternal: async (url: string): Promise<void> => {
|
|
|
|
|
|
try {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
await invoke("open_external", { url });
|
2025-08-23 20:38:57 +08:00
|
|
|
|
} catch (error) {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
console.error("打开外部链接失败:", error);
|
2025-08-23 20:38:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2025-09-06 16:21:21 +08:00
|
|
|
|
// 更新托盘菜单
|
|
|
|
|
|
updateTrayMenu: async (): Promise<boolean> => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
return await invoke("update_tray_menu");
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error("更新托盘菜单失败:", error);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 监听供应商切换事件
|
|
|
|
|
|
onProviderSwitched: async (
|
|
|
|
|
|
callback: (data: { appType: string; providerId: string }) => void
|
|
|
|
|
|
): Promise<UnlistenFn> => {
|
|
|
|
|
|
return await listen("provider-switched", (event) => {
|
|
|
|
|
|
callback(event.payload as { appType: string; providerId: string });
|
|
|
|
|
|
});
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2025-09-01 10:49:31 +08:00
|
|
|
|
// (保留空位,取消迁移提示)
|
|
|
|
|
|
|
2025-08-23 20:38:57 +08:00
|
|
|
|
// 选择配置文件(Tauri 暂不实现,保留接口兼容性)
|
|
|
|
|
|
selectConfigFile: async (): Promise<string | null> => {
|
2025-08-27 11:00:53 +08:00
|
|
|
|
console.warn("selectConfigFile 在 Tauri 版本中暂不支持");
|
2025-08-23 20:38:57 +08:00
|
|
|
|
return null;
|
2025-08-27 11:00:53 +08:00
|
|
|
|
},
|
2025-08-23 20:38:57 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 创建全局 API 对象,兼容现有代码
|
2025-08-27 11:00:53 +08:00
|
|
|
|
if (typeof window !== "undefined") {
|
2025-08-25 10:30:45 +08:00
|
|
|
|
// 绑定到 window.api,避免 Electron 命名造成误解
|
2025-08-24 23:04:55 +08:00
|
|
|
|
// API 内部已做 try/catch,非 Tauri 环境下也会安全返回默认值
|
2025-08-25 10:30:45 +08:00
|
|
|
|
(window as any).api = tauriAPI;
|
2025-08-23 20:38:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-23 23:11:39 +08:00
|
|
|
|
export default tauriAPI;
|