diff --git a/apps/desktop/src/main/index.ts b/apps/desktop/src/main/index.ts index 06e06b4c5..f44e6ec5c 100644 --- a/apps/desktop/src/main/index.ts +++ b/apps/desktop/src/main/index.ts @@ -1,74 +1,55 @@ -import { app, shell, BrowserWindow, ipcMain } from 'electron' -import { join } from 'path' -import { electronApp, optimizer, is } from '@electron-toolkit/utils' -import icon from '../../resources/icon.png?asset' +import { app, shell, BrowserWindow } from "electron"; +import { join } from "path"; +import { electronApp, optimizer, is } from "@electron-toolkit/utils"; + +let mainWindow: BrowserWindow | null = null; function createWindow(): void { - // Create the browser window. - const mainWindow = new BrowserWindow({ - width: 900, - height: 670, + mainWindow = new BrowserWindow({ + width: 1280, + height: 800, + minWidth: 900, + minHeight: 600, + titleBarStyle: "hiddenInset", + trafficLightPosition: { x: 16, y: 14 }, show: false, autoHideMenuBar: true, - ...(process.platform === 'linux' ? { icon } : {}), webPreferences: { - preload: join(__dirname, '../preload/index.js'), - sandbox: false - } - }) + preload: join(__dirname, "../preload/index.js"), + sandbox: false, + }, + }); - mainWindow.on('ready-to-show', () => { - mainWindow.show() - }) + mainWindow.on("ready-to-show", () => { + mainWindow?.show(); + }); mainWindow.webContents.setWindowOpenHandler((details) => { - shell.openExternal(details.url) - return { action: 'deny' } - }) + shell.openExternal(details.url); + return { action: "deny" }; + }); - // HMR for renderer base on electron-vite cli. - // Load the remote URL for development or the local html file for production. - if (is.dev && process.env['ELECTRON_RENDERER_URL']) { - mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) + if (is.dev && process.env["ELECTRON_RENDERER_URL"]) { + mainWindow.loadURL(process.env["ELECTRON_RENDERER_URL"]); } else { - mainWindow.loadFile(join(__dirname, '../renderer/index.html')) + mainWindow.loadFile(join(__dirname, "../renderer/index.html")); } } -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. app.whenReady().then(() => { - // Set app user model id for windows - electronApp.setAppUserModelId('com.electron') + electronApp.setAppUserModelId("ai.multica.desktop"); - // Default open or close DevTools by F12 in development - // and ignore CommandOrControl + R in production. - // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils - app.on('browser-window-created', (_, window) => { - optimizer.watchWindowShortcuts(window) - }) + app.on("browser-window-created", (_, window) => { + optimizer.watchWindowShortcuts(window); + }); - // IPC test - ipcMain.on('ping', () => console.log('pong')) + createWindow(); - createWindow() + app.on("activate", () => { + if (BrowserWindow.getAllWindows().length === 0) createWindow(); + }); +}); - app.on('activate', function () { - // On macOS it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (BrowserWindow.getAllWindows().length === 0) createWindow() - }) -}) - -// Quit when all windows are closed, except on macOS. There, it's common -// for applications and their menu bar to stay active until the user quits -// explicitly with Cmd + Q. -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit() - } -}) - -// In this file you can include the rest of your app's specific main process -// code. You can also put them in separate files and require them here. +app.on("window-all-closed", () => { + if (process.platform !== "darwin") app.quit(); +}); diff --git a/apps/desktop/src/preload/index.d.ts b/apps/desktop/src/preload/index.d.ts index a15366957..d7136c306 100644 --- a/apps/desktop/src/preload/index.d.ts +++ b/apps/desktop/src/preload/index.d.ts @@ -1,8 +1,14 @@ -import { ElectronAPI } from '@electron-toolkit/preload' +import { ElectronAPI } from "@electron-toolkit/preload"; declare global { interface Window { - electron: ElectronAPI - api: unknown + electron: ElectronAPI; + electronStore: { + get(key: string): string | null; + set(key: string, value: string): void; + delete(key: string): void; + }; } } + +export {}; diff --git a/apps/desktop/src/preload/index.ts b/apps/desktop/src/preload/index.ts index 2d1852475..e02a21fa3 100644 --- a/apps/desktop/src/preload/index.ts +++ b/apps/desktop/src/preload/index.ts @@ -1,22 +1,23 @@ -import { contextBridge } from 'electron' -import { electronAPI } from '@electron-toolkit/preload' +import { contextBridge } from "electron"; +import { electronAPI } from "@electron-toolkit/preload"; +import Store from "electron-store"; -// Custom APIs for renderer -const api = {} +const store = new Store>({ + name: "multica-desktop", +}); + +const electronStore = { + get: (key: string): string | null => store.get(key) ?? null, + set: (key: string, value: string): void => store.set(key, value), + delete: (key: string): void => store.delete(key), +}; -// Use `contextBridge` APIs to expose Electron APIs to -// renderer only if context isolation is enabled, otherwise -// just add to the DOM global. if (process.contextIsolated) { - try { - contextBridge.exposeInMainWorld('electron', electronAPI) - contextBridge.exposeInMainWorld('api', api) - } catch (error) { - console.error(error) - } + contextBridge.exposeInMainWorld("electron", electronAPI); + contextBridge.exposeInMainWorld("electronStore", electronStore); } else { - // @ts-ignore (define in dts) - window.electron = electronAPI - // @ts-ignore (define in dts) - window.api = api + // @ts-expect-error - fallback for non-isolated context + window.electron = electronAPI; + // @ts-expect-error - fallback for non-isolated context + window.electronStore = electronStore; }