Nativefier/app/src/preload.ts

67 lines
1.9 KiB
TypeScript

/**
* Preload file that will be executed in the renderer process.
* Note: This needs to be attached **prior to imports**, as imports
* would delay the attachment till after the event has been raised.
*/
document.addEventListener('DOMContentLoaded', () => {
injectScripts(); // eslint-disable-line @typescript-eslint/no-use-before-define
});
import * as fs from 'fs';
import * as path from 'path';
import { ipcRenderer } from 'electron';
import * as log from 'loglevel';
const INJECT_JS_PATH = path.join(__dirname, '..', 'inject/inject.js');
/**
* Patches window.Notification to:
* - set a callback on a new Notification
* - set a callback for clicks on notifications
* @param createCallback
* @param clickCallback
*/
function setNotificationCallback(createCallback, clickCallback) {
const OldNotify = window.Notification;
const newNotify = (title, opt) => {
createCallback(title, opt);
const instance = new OldNotify(title, opt);
instance.addEventListener('click', clickCallback);
return instance;
};
newNotify.requestPermission = OldNotify.requestPermission.bind(OldNotify);
Object.defineProperty(newNotify, 'permission', {
get: () => OldNotify.permission,
});
// @ts-ignore
window.Notification = newNotify;
}
function injectScripts() {
const needToInject = fs.existsSync(INJECT_JS_PATH);
if (!needToInject) {
return;
}
// Dynamically require scripts
require(INJECT_JS_PATH);
}
function notifyNotificationCreate(title, opt) {
ipcRenderer.send('notification', title, opt);
}
function notifyNotificationClick() {
ipcRenderer.send('notification-click');
}
setNotificationCallback(notifyNotificationCreate, notifyNotificationClick);
ipcRenderer.on('params', (event, message) => {
const appArgs = JSON.parse(message);
log.info('nativefier.json', appArgs);
});
ipcRenderer.on('debug', (event, message) => {
log.info('debug:', message);
});