From e37837723ed69f473497cd71a7354536aed167e7 Mon Sep 17 00:00:00 2001 From: cv <34649812+cpvalente@users.noreply.github.com> Date: Thu, 3 Jun 2021 23:47:02 +0200 Subject: [PATCH] ipc react-electron --- client/src/features/menu/MenuBar.jsx | 28 ++++++++++++--- server/electron/preload.js | 11 +----- server/main.js | 53 +++++++++++++++++++++++++--- 3 files changed, 73 insertions(+), 19 deletions(-) diff --git a/client/src/features/menu/MenuBar.jsx b/client/src/features/menu/MenuBar.jsx index f2679fc2b..489e10316 100644 --- a/client/src/features/menu/MenuBar.jsx +++ b/client/src/features/menu/MenuBar.jsx @@ -7,6 +7,7 @@ import MinIconBtn from './buttons/MinIconBtn'; import QuitIconBtn from './buttons/QuitIconBtn'; import style from './MenuBar.module.css'; import HelpIconBtn from './buttons/HelpIconBtn'; +const { ipcRenderer } = window.require('electron'); export default function MenuBar(props) { const { onOpen, onClose } = props; @@ -15,13 +16,32 @@ export default function MenuBar(props) { downloadEvents(); }; + const handleIPC = (action) => { + switch (action) { + case 'min': + ipcRenderer.send('set-window', 'to-tray'); + break; + case 'max': + ipcRenderer.send('set-window', 'to-max'); + break; + case 'shutdown': + ipcRenderer.send('shutdown', 'now'); + break; + case 'help': + ipcRenderer.send('send-to-link', 'help'); + break; + default: + break; + } + }; + return ( <> - - - + handleIPC('shutdown')} /> + handleIPC('max')} /> + handleIPC('min')} />
- + handleIPC('help')} /> diff --git a/server/electron/preload.js b/server/electron/preload.js index 60e0b9be3..fa038c825 100644 --- a/server/electron/preload.js +++ b/server/electron/preload.js @@ -1,10 +1 @@ -window.addEventListener('DOMContentLoaded', () => { - const replaceText = (selector, text) => { - const element = document.getElementById(selector); - if (element) element.innerText = text; - }; - - for (const type of ['chrome', 'node', 'electron']) { - replaceText(`${type}-version`, process.versions[type]); - } -}); +window.require = require; diff --git a/server/main.js b/server/main.js index ae69d843f..61795c8c0 100644 --- a/server/main.js +++ b/server/main.js @@ -5,11 +5,14 @@ const { globalShortcut, Tray, dialog, + ipcMain, + shell, } = require('electron'); const path = require('path'); const { electron } = require('process'); +const { Notification } = require('electron'); -var env = process.env.NODE_ENV || 'prod'; +const env = process.env.NODE_ENV || 'prod'; (async () => { const { nodeapp } = import( @@ -33,8 +36,6 @@ if (!lock) { return; } -const { Notification } = require('electron'); - function showNotification(text) { new Notification({ title: 'ontime', @@ -75,14 +76,19 @@ function createWindow() { preload: path.join(__dirname, './electron/preload.js'), // TODO: what are recommended alternatives to node integration? nodeIntegration: true, - // enableRemoteModule: true, + contextIsolation: false, }, }); win.setMenu(null); // Load page served by node - win.loadURL('http://localhost:4001/editor').then(() => { + const reactApp = + env == 'prod' + ? 'http://localhost:4001/editor' + : 'http://localhost:3000/editor'; + + win.loadURL(reactApp).then(() => { win.webContents.setBackgroundThrottling(false); }); @@ -173,3 +179,40 @@ app app.once('will-quit', () => { globalShortcut.unregisterAll(); }); + +// Get messages from react +// Test message +ipcMain.on('test-message', (event, arg) => { + showNotification('testing 1-2', arg); +}); + +// Terminate +ipcMain.on('shutdown', (event, arg) => { + console.log('Got IPC shutdown'); + win.destroy(); + app.quit(); +}); + +// Window manipulation +ipcMain.on('set-window', (event, arg) => { + console.log('Got IPC set-window', arg); + + if (arg === 'to-max') { + // window full + win.setContentSize(1920, 1080); + win.setPosition(0, 0); + } else if (arg === 'to-tray') { + // window to tray + win.close(); + } +}); + +// Open links external +ipcMain.on('send-to-link', (event, arg) => { + console.log('Got IPC send-to-link', arg); + + // send to help URL + if (arg === 'help') { + shell.openExternal('http://blank'); + } +});