import { app, BrowserWindow, Menu, ipcMain } from "electron"; import path from "node:path"; import { getDb, closeDb } from "./db"; import { registerIpcHandlers } from "./ipc/handlers"; const isDev = !app.isPackaged; let mainWindow: BrowserWindow | null = null; function createWindow() { mainWindow = new BrowserWindow({ width: 1400, height: 900, minWidth: 1000, minHeight: 600, show: false, titleBarStyle: "hiddenInset", webPreferences: { contextIsolation: true, nodeIntegration: false, preload: path.join(__dirname, "preload.js"), }, }); registerIpcHandlers(mainWindow); // Maximize toggle — works identically on Linux and macOS ipcMain.handle("window:toggleMaximize", () => { if (mainWindow!.isMaximized()) mainWindow!.unmaximize(); else mainWindow!.maximize(); }); // Push state to renderer so the button glyph stays accurate. // On macOS, clicking the green traffic light also fires these events, // keeping our custom button in sync with the native control. mainWindow.on("maximize", () => mainWindow!.webContents.send("window:maximized", true)); mainWindow.on("unmaximize", () => mainWindow!.webContents.send("window:maximized", false)); if (isDev) { const url = process.env.VITE_DEV_SERVER_URL ?? "http://localhost:5173"; mainWindow.loadURL(url).finally(() => { mainWindow!.show(); mainWindow!.webContents.openDevTools({ mode: "detach" }); }); } else { const indexHtml = path.join( app.getAppPath(), "renderer", "dist", "index.html" ); mainWindow.loadFile(indexHtml).finally(() => mainWindow!.show()); } } app.whenReady().then(() => { Menu.setApplicationMenu(null); // Initialize database getDb(); createWindow(); app.on("activate", () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } }); }); app.on("window-all-closed", () => { closeDb(); if (process.platform !== "darwin") { app.quit(); } });