nova-betterchat/electron/index.cjs
Jack Schedel 82f8761397
Fixed 2 Electron Crashes (#288)
Fixes #277

* fixed crash on attempting to open new instance, required refactoring BrowserWindow to global

Uncaught Exception:
ReferenceError: win is not defined
    at click (C:\Users\jacks\AppData\Local\Programs\better-chatgpt\resources\app.asar\electron\index.cjs:53:9)
    at MenuItem.click (node:electron/js2c/browser_init:2:30166)
    at a._executeCommand (node:electron/js2c/browser_init:2:35562)

* fixed crash on attempting to open new instance, required refactoring BrowserWindow to global

Uncaught Exception:
ReferenceError: win is not defined
    at click (C:\Users\jacks\AppData\Local\Programs\better-chatgpt\resources\app.asar\electron\index.cjs:53:9)
    at MenuItem.click (node:electron/js2c/browser_init:2:30166)
    at a._executeCommand (node:electron/js2c/browser_init:2:35562)

* fixed Electron process not closing on crash

previously left the process still existing on crash (only viewable in task manager). error behavior is the same as it was before, just now must be explicitly defined.
2023-05-10 23:54:22 +08:00

172 lines
3.9 KiB
JavaScript

const path = require('path');
const {dialog, app, BrowserWindow, Tray, Menu } = require('electron');
const isDev = require('electron-is-dev');
const { autoUpdater } = require('electron-updater');
let win = null;
const instanceLock = app.requestSingleInstanceLock();
if (require('electron-squirrel-startup')) app.quit();
const PORT = isDev ? '5173' : '51735';
function createWindow() {
let iconPath = '';
if (isDev) {
iconPath = path.join(__dirname, '../public/icon-rounded.png');
} else {
iconPath = path.join(__dirname, '../dist/icon-rounded.png');
}
autoUpdater.checkForUpdatesAndNotify();
win = new BrowserWindow({
autoHideMenuBar: true,
show: false,
icon: iconPath,
});
createTray(win);
win.maximize();
win.show();
isDev || createServer();
win.loadURL(`http://localhost:${PORT}`);
if (isDev) {
win.webContents.openDevTools({ mode: 'detach' });
}
return win;
}
const createTray = (window) => {
const tray = new Tray(
path.join(
__dirname,
isDev ? '../public/icon-rounded.png' : '../dist/icon-rounded.png'
)
);
const contextMenu = Menu.buildFromTemplate([
{
label: 'Show',
click: () => {
win.maximize();
window.show();
},
},
{
label: 'Exit',
click: () => {
app.isQuiting = true;
app.quit();
},
},
]);
tray.on('click', () => {
win.maximize();
window.show();
});
tray.setToolTip('Better ChatGPT');
tray.setContextMenu(contextMenu);
return tray;
};
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
process.on('uncaughtException', (error) => {
// Perform any necessary cleanup tasks here
dialog.showErrorBox('An error occurred', error.stack);
// Exit the app
process.exit(1);
});
if (!instanceLock) {
app.quit()
} else {
app.on('second-instance', (event, commandLine, workingDirectory) => {
if (win) {
if (win.isMinimized()) win.restore()
win.focus()
}
})
app.whenReady().then(() => {
win = createWindow()
})
}
const createServer = () => {
// Dependencies
const http = require('http');
const fs = require('fs');
const path = require('path');
// MIME types for different file extensions
const mimeTypes = {
'.html': 'text/html',
'.css': 'text/css',
'.js': 'text/javascript',
'.wasm': 'application/wasm',
'.jpg': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.png': 'image/png',
'.gif': 'image/gif',
'.svg': 'image/svg+xml',
'.json': 'application/json',
};
// Create a http server
const server = http.createServer((request, response) => {
// Get the file path from the URL
let filePath =
request.url === '/'
? `${path.join(__dirname, '../dist/index.html')}`
: `${path.join(__dirname, `../dist/${request.url}`)}`;
// Get the file extension from the filePath
let extname = path.extname(filePath);
// Set the default MIME type to text/plain
let contentType = 'text/plain';
// Check if the file extension is in the MIME types object
if (extname in mimeTypes) {
contentType = mimeTypes[extname];
}
// Read the file from the disk
fs.readFile(filePath, (error, content) => {
if (error) {
// If file read error occurs
if (error.code === 'ENOENT') {
// File not found error
response.writeHead(404);
response.end('File Not Found');
} else {
// Server error
response.writeHead(500);
response.end(`Server Error: ${error.code}`);
}
} else {
// File read successful
response.writeHead(200, { 'Content-Type': contentType });
response.end(content, 'utf-8');
}
});
});
// Listen for request on port ${PORT}
server.listen(PORT, () => {
console.log(`Server listening on http://localhost:${PORT}/`);
});
};