/** * IPC 通信处理器 * 安全地暴露主进程功能给渲染进程 */ import { ipcMain, app } from 'electron' import { promises as fs } from 'fs' import path from 'path' import { getSettings, saveSettings } from './store' // IPC 通道名称常量 export const IPC_CHANNELS = { // 文件操作 SAVE_FILE: 'file:save', READ_FILE: 'file:read', // 设置操作 GET_SETTINGS: 'settings:get', SAVE_SETTINGS: 'settings:save' } as const /** * 设置所有 IPC 处理器 */ export function setupIpcHandlers() { // ============================================ // 文件操作相关 IPC // ============================================ /** * 保存文件到桌面 * @param content - 要保存的文件内容 * @param filename - 文件名(默认为 demo-note.txt) * @returns 保存结果 */ ipcMain.handle( IPC_CHANNELS.SAVE_FILE, async (_event, content: string, filename: string = 'demo-note.txt') => { try { // 获取桌面路径 const desktopPath = app.getPath('desktop') const filePath = path.join(desktopPath, filename) // 写入文件(使用 UTF-8 编码) await fs.writeFile(filePath, content, 'utf-8') return { success: true, message: `文件已保存到: ${filePath}`, path: filePath } } catch (error) { const errorMessage = error instanceof Error ? error.message : '未知错误' console.error('保存文件失败:', errorMessage) return { success: false, message: `保存失败: ${errorMessage}`, path: null } } } ) /** * 从桌面读取文件 * @param filename - 文件名(默认为 demo-note.txt) * @returns 文件内容 */ ipcMain.handle( IPC_CHANNELS.READ_FILE, async (_event, filename: string = 'demo-note.txt') => { try { // 获取桌面路径 const desktopPath = app.getPath('desktop') const filePath = path.join(desktopPath, filename) // 检查文件是否存在 try { await fs.access(filePath) } catch { return { success: false, message: '文件不存在,请先保存一个文件', content: null } } // 读取文件内容 const content = await fs.readFile(filePath, 'utf-8') return { success: true, message: '文件读取成功', content } } catch (error) { const errorMessage = error instanceof Error ? error.message : '未知错误' console.error('读取文件失败:', errorMessage) return { success: false, message: `读取失败: ${errorMessage}`, content: null } } } ) // ============================================ // 用户设置相关 IPC // ============================================ /** * 获取用户设置 * @param key - 可选的设置键名,不传则返回所有设置 * @returns 设置值 */ ipcMain.handle(IPC_CHANNELS.GET_SETTINGS, async (_event, key?: string) => { try { const settings = getSettings(key) return { success: true, data: settings } } catch (error) { const errorMessage = error instanceof Error ? error.message : '未知错误' console.error('获取设置失败:', errorMessage) return { success: false, data: null, message: errorMessage } } }) /** * 保存用户设置 * @param key - 设置键名 * @param value - 设置值 * @returns 保存结果 */ ipcMain.handle( IPC_CHANNELS.SAVE_SETTINGS, async (_event, key: string, value: unknown) => { try { saveSettings(key, value) return { success: true, message: '设置已保存' } } catch (error) { const errorMessage = error instanceof Error ? error.message : '未知错误' console.error('保存设置失败:', errorMessage) return { success: false, message: `保存失败: ${errorMessage}` } } } ) }