feat: 创建 Tauri API 层替换 Electron IPC 调用

- 创建 tauri-api.ts 封装所有 Tauri invoke 调用
- 保持与 Electron API 相同的接口,确保代码兼容性
- 添加类型声明文件 vite-env.d.ts
- 在 main.tsx 中导入 Tauri API
This commit is contained in:
farion1231
2025-08-23 20:38:57 +08:00
parent 8a3133be43
commit 1402fd0cc5
4 changed files with 448 additions and 6 deletions

View File

@@ -0,0 +1,163 @@
import { invoke } from '@tauri-apps/api/core';
import { open } from '@tauri-apps/plugin-shell';
import { Provider } from '../../shared/types';
// 定义配置状态类型
interface ConfigStatus {
exists: boolean;
path: string;
error?: string;
}
// 定义导入结果类型
interface ImportResult {
success: boolean;
message?: string;
}
// Tauri API 封装,保持与 Electron API 相同的接口
export const tauriAPI = {
// 获取所有供应商
getProviders: async (): Promise<Record<string, Provider>> => {
try {
return await invoke('get_providers');
} catch (error) {
console.error('获取供应商列表失败:', error);
return {};
}
},
// 获取当前供应商ID
getCurrentProvider: async (): Promise<string> => {
try {
return await invoke('get_current_provider');
} catch (error) {
console.error('获取当前供应商失败:', error);
return '';
}
},
// 添加供应商
addProvider: async (provider: Provider): Promise<boolean> => {
try {
return await invoke('add_provider', { provider });
} catch (error) {
console.error('添加供应商失败:', error);
throw error;
}
},
// 更新供应商
updateProvider: async (provider: Provider): Promise<boolean> => {
try {
return await invoke('update_provider', { provider });
} catch (error) {
console.error('更新供应商失败:', error);
throw error;
}
},
// 删除供应商
deleteProvider: async (id: string): Promise<boolean> => {
try {
return await invoke('delete_provider', { id });
} catch (error) {
console.error('删除供应商失败:', error);
throw error;
}
},
// 切换供应商
switchProvider: async (providerId: string): Promise<boolean> => {
try {
return await invoke('switch_provider', { id: providerId });
} catch (error) {
console.error('切换供应商失败:', error);
return false;
}
},
// 导入当前配置为默认供应商
importCurrentConfigAsDefault: async (): Promise<ImportResult> => {
try {
const success = await invoke<boolean>('import_default_config');
return {
success,
message: success ? '成功导入默认配置' : '导入失败'
};
} catch (error) {
console.error('导入默认配置失败:', error);
return {
success: false,
message: String(error)
};
}
},
// 获取 Claude Code 配置文件路径
getClaudeCodeConfigPath: async (): Promise<string> => {
try {
return await invoke('get_claude_code_config_path');
} catch (error) {
console.error('获取配置路径失败:', error);
return '';
}
},
// 获取 Claude Code 配置状态
getClaudeConfigStatus: async (): Promise<ConfigStatus> => {
try {
return await invoke('get_claude_config_status');
} catch (error) {
console.error('获取配置状态失败:', error);
return {
exists: false,
path: '',
error: String(error)
};
}
},
// 打开配置文件夹
openConfigFolder: async (): Promise<void> => {
try {
await invoke('open_config_folder');
} catch (error) {
console.error('打开配置文件夹失败:', error);
}
},
// 打开外部链接
openExternal: async (url: string): Promise<void> => {
try {
await invoke('open_external', { url });
} catch (error) {
console.error('打开外部链接失败:', error);
}
},
// 选择配置文件Tauri 暂不实现,保留接口兼容性)
selectConfigFile: async (): Promise<string | null> => {
console.warn('selectConfigFile 在 Tauri 版本中暂不支持');
return null;
}
};
// 创建全局 API 对象,兼容现有代码
if (typeof window !== 'undefined') {
// 检测是否在 Tauri 环境中
const isTauri = '__TAURI__' in window;
if (isTauri) {
// 在 Tauri 环境中,将 API 绑定到 window.electronAPI
// 保持代码兼容性,无需修改组件代码
(window as any).electronAPI = tauriAPI;
}
// 提供平台信息
(window as any).platform = {
isMac: navigator.platform.toLowerCase().includes('mac')
};
}
export default tauriAPI;

View File

@@ -2,12 +2,8 @@ import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
import './index.css'
declare global {
interface Window {
platform?: { isMac?: boolean }
}
}
// 导入 Tauri API自动绑定到 window.electronAPI
import './lib/tauri-api'
// 根据平台添加 body class便于平台特定样式
if (window.platform?.isMac) {

39
src/renderer/vite-env.d.ts vendored Normal file
View File

@@ -0,0 +1,39 @@
/// <reference types="vite/client" />
import { Provider } from './shared/types';
interface ImportResult {
success: boolean;
message?: string;
}
interface ConfigStatus {
exists: boolean;
path: string;
error?: string;
}
declare global {
interface Window {
electronAPI: {
getProviders: () => Promise<Record<string, Provider>>;
getCurrentProvider: () => Promise<string>;
addProvider: (provider: Provider) => Promise<boolean>;
deleteProvider: (id: string) => Promise<boolean>;
updateProvider: (provider: Provider) => Promise<boolean>;
switchProvider: (providerId: string) => Promise<boolean>;
importCurrentConfigAsDefault: () => Promise<ImportResult>;
getClaudeCodeConfigPath: () => Promise<string>;
getClaudeConfigStatus: () => Promise<ConfigStatus>;
selectConfigFile: () => Promise<string | null>;
openConfigFolder: () => Promise<void>;
openExternal: (url: string) => Promise<void>;
};
platform: {
isMac: boolean;
};
__TAURI__?: any;
}
}
export {};