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');
+ }
+});