feat(FN-1076): integrate desktop IPC bridge and lifecycle modules

- Extract main-process IPC registration into src/ipc.ts for window controls, system info, tray status, updater checks, and native dialogs
- Refactor main.ts startup into initializeApp/run and wire menu, tray, deep-link, updater, and window-state restore/quit cleanup
- Rework preload bridge to expose typed window.fusionAPI subscriptions and replace preload.d.ts with shared src/types.d.ts global declarations
- Add comprehensive tests for IPC handlers, preload contracts, and main-process integration behavior
- Document IPC channels, preload API, and lifecycle sequencing in packages/desktop/README.md
This commit is contained in:
gsxdsm
2026-04-08 00:45:23 -07:00
parent 07697b2f5b
commit b280bc711e
11 changed files with 996 additions and 357 deletions

View File

@@ -0,0 +1,53 @@
import { app, type BrowserWindow, ipcMain, type Tray } from "electron";
import { setupAutoUpdater, showExportSettingsDialog, showImportSettingsDialog } from "./native.js";
import { type EngineStatus, updateTrayStatus } from "./tray.js";
export function registerIpcHandlers(mainWindow: BrowserWindow, tray: Tray): void {
ipcMain.handle("window:minimize", () => {
mainWindow.minimize();
});
ipcMain.handle("window:maximize", () => {
const isCurrentlyMaximized = mainWindow.isMaximized();
if (isCurrentlyMaximized) {
mainWindow.unmaximize();
return false;
}
mainWindow.maximize();
return true;
});
ipcMain.handle("window:close", () => {
mainWindow.close();
});
ipcMain.handle("window:isMaximized", () => mainWindow.isMaximized());
ipcMain.handle("app:getSystemInfo", () => ({
platform: process.platform,
arch: process.arch,
electronVersion: process.versions.electron,
nodeVersion: process.versions.node,
appVersion: app.getVersion(),
}));
ipcMain.handle("app:checkForUpdates", () => {
try {
setupAutoUpdater(mainWindow);
return { status: "checking" as const };
} catch (error) {
return {
status: "error" as const,
error: error instanceof Error ? error.message : String(error),
};
}
});
ipcMain.handle("tray:updateStatus", (_event, status: EngineStatus) => {
updateTrayStatus(tray, status);
});
ipcMain.handle("native:showExportDialog", () => showExportSettingsDialog(mainWindow));
ipcMain.handle("native:showImportDialog", () => showImportSettingsDialog(mainWindow));
}