| 1 | import { BrowserWindow, dialog, ipcMain, type WebContents } from 'electron' |
| 2 | import log from 'electron-log/main.js' |
| 3 | import type { IpcContext } from '../ipc/context' |
| 4 | import { importSessionFile } from '../session-import/session-importer' |
| 5 | |
| 6 | export function registerSessionImportHandlers(ctx: IpcContext): void { |
| 7 | const { mainWindow } = ctx |
| 8 | |
| 9 | const resolveOwnerWindow = (sender: WebContents): BrowserWindow => |
| 10 | BrowserWindow.fromWebContents(sender) ?? BrowserWindow.getFocusedWindow() ?? mainWindow |
| 11 | |
| 12 | ipcMain.handle('session:importFile', async (event) => { |
| 13 | const ownerWindow = resolveOwnerWindow(event.sender) |
| 14 | log.info('[session:importFile] open dialog') |
| 15 | const openResult = await dialog.showOpenDialog(ownerWindow, { |
| 16 | title: '导入会话文件', |
| 17 | buttonLabel: '导入', |
| 18 | properties: ['openFile'], |
| 19 | filters: [ |
| 20 | { name: 'OhMyPPT 会话文件', extensions: ['zip', 'exe'] }, |
| 21 | { name: '所有文件', extensions: ['*'] } |
| 22 | ] |
| 23 | }) |
| 24 | |
| 25 | if (openResult.canceled || openResult.filePaths.length === 0) { |
| 26 | log.info('[session:importFile] cancelled') |
| 27 | return { success: false, cancelled: true } |
| 28 | } |
| 29 | |
| 30 | try { |
| 31 | log.info('[session:importFile] selected file', { |
| 32 | filePath: openResult.filePaths[0] |
| 33 | }) |
| 34 | return await importSessionFile(ctx, openResult.filePaths[0]) |
| 35 | } catch (error) { |
| 36 | log.error('[session:importFile] failed', { |
| 37 | filePath: openResult.filePaths[0], |
| 38 | message: error instanceof Error ? error.message : String(error) |
| 39 | }) |
| 40 | throw error |
| 41 | } |
| 42 | }) |
| 43 | } |
| 44 |