actual/packages/desktop-electron/preload.js
2022-04-28 22:44:38 -04:00

98 lines
2.2 KiB
JavaScript

const { ipcRenderer, contextBridge } = require('electron');
const SentryClient = require('@sentry/electron');
const ipc = require('node-ipc');
const fs = require('fs');
let { version: VERSION, isDev: IS_DEV } = ipcRenderer.sendSync(
'get-bootstrap-data'
);
if (!IS_DEV) {
// This just inits the IPC bridge for sending events from the renderer process
// back to the main process
SentryClient.init({
dsn:
'https://f2fa901455894dc8bf28210ef1247e2d:b9e69eb21d9740539b3ff593f7346396@sentry.io/261029',
release: VERSION
});
}
let resolveSocketPromise;
let socketPromise = new Promise(resolve => {
resolveSocketPromise = resolve;
});
ipcRenderer.on('set-socket', (event, { name }) => {
resolveSocketPromise(name);
});
contextBridge.exposeInMainWorld('Actual', {
IS_DEV,
ACTUAL_VERSION: VERSION,
logToTerminal: (...args) => {
require('console').log(...args);
},
ipcConnect: (id, func) => {
ipc.config.silent = true;
ipc.connectTo(id, () => {
let client = ipc.of[id];
func({
on(name, handler) {
return client.on(name, handler);
},
emit(name, data) {
return client.emit(name, data);
}
});
});
},
relaunch: () => {
ipcRenderer.invoke('relaunch');
},
openFileDialog: opts => {
return ipcRenderer.invoke('open-file-dialog', opts);
},
saveFile: async (contents, filename, dialogTitle) => {
const fileLocation = await ipcRenderer.invoke('save-file-dialog', {
title: dialogTitle,
defaultPath: filename
});
return new Promise((resolve, reject) => {
if (fileLocation) {
fs.writeFile(fileLocation, contents, error => {
if (error) {
return reject(error);
}
resolve();
});
}
});
},
openURLInBrowser: url => {
ipcRenderer.invoke('open-external-url', url);
},
onEventFromMain: (type, handler) => {
ipcRenderer.on(type, handler);
},
applyAppUpdate: () => {
ipcRenderer.send('apply-update');
},
updateAppMenu: isBudgetOpen => {
ipcRenderer.send('update-menu', isBudgetOpen);
},
getServerSocket: () => {
return socketPromise;
}
});