mirror of
https://github.com/DeNNiiInc/Advanced-Smtp-Tester.git
synced 2026-04-17 17:35:59 +00:00
feat: Add Electron desktop application wrapper
- Create electron-main.js with window, tray, and menu management - Add Electron and electron-builder dependencies - Configure build settings for Windows - Add npm scripts for electron and build - Desktop app features: system tray, menu bar, auto-start server
This commit is contained in:
211
electron-main.js
Normal file
211
electron-main.js
Normal file
@@ -0,0 +1,211 @@
|
||||
const { app, BrowserWindow, Tray, Menu, ipcMain } = require('electron');
|
||||
const path = require('path');
|
||||
const express = require('express');
|
||||
const server = require('./server');
|
||||
|
||||
let mainWindow;
|
||||
let tray;
|
||||
let isQuitting = false;
|
||||
|
||||
// Express server instance (from server.js)
|
||||
const PORT = process.env.PORT || 3000;
|
||||
|
||||
function createWindow() {
|
||||
mainWindow = new BrowserWindow({
|
||||
width: 1200,
|
||||
height: 900,
|
||||
minWidth: 800,
|
||||
minHeight: 600,
|
||||
icon: path.join(__dirname, 'public/Logo.png'),
|
||||
webPreferences: {
|
||||
nodeIntegration: false,
|
||||
contextIsolation: true,
|
||||
enableRemoteModule: false
|
||||
},
|
||||
title: 'Advanced SMTP Tester',
|
||||
backgroundColor: '#0f172a',
|
||||
show: false // Don't show until ready
|
||||
});
|
||||
|
||||
// Load the app
|
||||
mainWindow.loadURL(`http://localhost:${PORT}`);
|
||||
|
||||
// Show window when ready
|
||||
mainWindow.once('ready-to-show', () => {
|
||||
mainWindow.show();
|
||||
});
|
||||
|
||||
// Handle window close
|
||||
mainWindow.on('close', (event) => {
|
||||
if (!isQuitting) {
|
||||
event.preventDefault();
|
||||
mainWindow.hide();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
mainWindow.on('closed', () => {
|
||||
mainWindow = null;
|
||||
});
|
||||
|
||||
// Create application menu
|
||||
createMenu();
|
||||
}
|
||||
|
||||
function createTray() {
|
||||
tray = new Tray(path.join(__dirname, 'public/Logo.png'));
|
||||
|
||||
const contextMenu = Menu.buildFromTemplate([
|
||||
{
|
||||
label: 'Show App',
|
||||
click: () => {
|
||||
mainWindow.show();
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'Hide App',
|
||||
click: () => {
|
||||
mainWindow.hide();
|
||||
}
|
||||
},
|
||||
{ type: 'separator' },
|
||||
{
|
||||
label: 'Quit',
|
||||
click: () => {
|
||||
isQuitting = true;
|
||||
app.quit();
|
||||
}
|
||||
}
|
||||
]);
|
||||
|
||||
tray.setToolTip('Advanced SMTP Tester');
|
||||
tray.setContextMenu(contextMenu);
|
||||
|
||||
// Double click to show/hide
|
||||
tray.on('double-click', () => {
|
||||
if (mainWindow.isVisible()) {
|
||||
mainWindow.hide();
|
||||
} else {
|
||||
mainWindow.show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function createMenu() {
|
||||
const template = [
|
||||
{
|
||||
label: 'File',
|
||||
submenu: [
|
||||
{
|
||||
label: 'Minimize to Tray',
|
||||
accelerator: 'CmdOrCtrl+H',
|
||||
click: () => {
|
||||
mainWindow.hide();
|
||||
}
|
||||
},
|
||||
{ type: 'separator' },
|
||||
{
|
||||
label: 'Quit',
|
||||
accelerator: 'CmdOrCtrl+Q',
|
||||
click: () => {
|
||||
isQuitting = true;
|
||||
app.quit();
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Edit',
|
||||
submenu: [
|
||||
{ role: 'undo' },
|
||||
{ role: 'redo' },
|
||||
{ type: 'separator' },
|
||||
{ role: 'cut' },
|
||||
{ role: 'copy' },
|
||||
{ role: 'paste' },
|
||||
{ role: 'selectAll' }
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'View',
|
||||
submenu: [
|
||||
{ role: 'reload' },
|
||||
{ role: 'forceReload' },
|
||||
{ role: 'toggleDevTools' },
|
||||
{ type: 'separator' },
|
||||
{ role: 'resetZoom' },
|
||||
{ role: 'zoomIn' },
|
||||
{ role: 'zoomOut' },
|
||||
{ type: 'separator' },
|
||||
{ role: 'togglefullscreen' }
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Help',
|
||||
submenu: [
|
||||
{
|
||||
label: 'About',
|
||||
click: async () => {
|
||||
const { shell } = require('electron');
|
||||
await shell.openExternal('https://github.com/DeNNiiInc/Advanced-Smtp-Tester');
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'Documentation',
|
||||
click: async () => {
|
||||
const { shell } = require('electron');
|
||||
await shell.openExternal('https://github.com/DeNNiiInc/Advanced-Smtp-Tester#readme');
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
const menu = Menu.buildFromTemplate(template);
|
||||
Menu.setApplicationMenu(menu);
|
||||
}
|
||||
|
||||
// Wait for server to be ready before creating window
|
||||
function waitForServer(callback) {
|
||||
const http = require('http');
|
||||
const checkServer = () => {
|
||||
http.get(`http://localhost:${PORT}`, (res) => {
|
||||
callback();
|
||||
}).on('error', () => {
|
||||
setTimeout(checkServer, 100);
|
||||
});
|
||||
};
|
||||
checkServer();
|
||||
}
|
||||
|
||||
// App lifecycle
|
||||
app.whenReady().then(() => {
|
||||
// Server is already started by requiring ./server.js
|
||||
// Wait for it to be ready
|
||||
waitForServer(() => {
|
||||
createWindow();
|
||||
createTray();
|
||||
});
|
||||
|
||||
app.on('activate', () => {
|
||||
if (BrowserWindow.getAllWindows().length === 0) {
|
||||
createWindow();
|
||||
} else {
|
||||
mainWindow.show();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
app.on('window-all-closed', () => {
|
||||
// Don't quit on window close, keep running in tray
|
||||
// User must explicitly quit from tray menu
|
||||
});
|
||||
|
||||
app.on('before-quit', () => {
|
||||
isQuitting = true;
|
||||
});
|
||||
|
||||
// Handle app quit
|
||||
app.on('will-quit', () => {
|
||||
// Cleanup if needed
|
||||
});
|
||||
Reference in New Issue
Block a user