import { app, dialog, ipcMain, Menu, MenuItem, nativeTheme } from "electron"; import { promises as fs } from "fs"; import { MessagingService } from "jslib-common/abstractions/messaging.service"; import { RendererMenuItem } from "../utils"; import { ThemeType } from "jslib-common/enums/themeType"; import { WindowMain } from "../window.main"; export class ElectronMainMessagingService implements MessagingService { constructor(private windowMain: WindowMain, private onMessage: (message: any) => void) { ipcMain.handle("appVersion", () => { return app.getVersion(); }); ipcMain.handle("systemTheme", () => { return nativeTheme.shouldUseDarkColors ? ThemeType.Dark : ThemeType.Light; }); ipcMain.handle("showMessageBox", (event, options) => { return dialog.showMessageBox(options); }); ipcMain.handle("openContextMenu", (event, options: { menu: RendererMenuItem[] }) => { return new Promise((resolve) => { const menu = new Menu(); options.menu.forEach((m, index) => { menu.append( new MenuItem({ label: m.label, type: m.type, click: () => { resolve(index); }, }) ); }); menu.popup({ window: windowMain.win, callback: () => { resolve(-1); }, }); }); }); ipcMain.handle("windowVisible", () => { return windowMain.win?.isVisible(); }); nativeTheme.on("updated", () => { windowMain.win?.webContents.send( "systemThemeUpdated", nativeTheme.shouldUseDarkColors ? ThemeType.Dark : ThemeType.Light ); }); } send(subscriber: string, arg: any = {}) { const message = Object.assign({}, { command: subscriber }, arg); this.onMessage(message); if (this.windowMain.win != null) { this.windowMain.win.webContents.send("messagingService", message); } } }