const electron = require('electron'); const Errors = require('../js/modules/types/errors'); const { app, dialog, clipboard } = electron; const { redactAll } = require('../js/modules/privacy'); // We use hard-coded strings until we're able to update these strings from the locale. let quitText = 'Quit'; let copyErrorAndQuitText = 'Copy error and quit'; function handleError(prefix, error) { console.error(`${prefix}:`, Errors.toLogFormat(error)); if (app.isReady()) { // title field is not shown on macOS, so we don't use it const buttonIndex = dialog.showMessageBoxSync({ buttons: [quitText, copyErrorAndQuitText], defaultId: 0, detail: redactAll(error.stack), message: prefix, noLink: true, type: 'error', }); if (buttonIndex === 1) { clipboard.writeText(`${prefix}\n\n${redactAll(error.stack)}`); } } else { dialog.showErrorBox(prefix, error.stack); } app.exit(1); } exports.updateLocale = messages => { quitText = messages.quit.message; copyErrorAndQuitText = messages.copyErrorAndQuit.message; }; exports.addHandler = () => { process.on('uncaughtException', error => { handleError('Unhandled Error', error); }); process.on('unhandledRejection', error => { handleError('Unhandled Promise Rejection', error); }); };