159 lines
4.1 KiB
TypeScript
159 lines
4.1 KiB
TypeScript
/**
|
||
* 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}`
|
||
}
|
||
}
|
||
}
|
||
)
|
||
}
|