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 , private onMessage ) { 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 ) => { 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 , arg = { } ) { const message = Object . assign ( { } , { command : subscriber } , arg ) ; this . onMessage ( message ) ; if ( this . windowMain . win != null ) { this . windowMain . win . webContents . send ( "messagingService" , message ) ; } } }