Ziya/electron/main.ts
rizary 6efcf43691
feat: complete ESLint configuration overhaul and theme system improvements
- Migrate from legacy .eslintrc.json to modern flat config system
- Remove conflicting ESLint configuration files
- Fix auto-generation of eslint.config.mjs by Nuxt
- Update ESLint rules to use single quotes and proper formatting
- Add comprehensive theme switching system with 24 palettes
- Implement proper daisyUI theme integration
- Add theme store with persistence and dark/light mode support
- Create ThemeSwitcher component with enhanced UI
- Fix package.json scripts to work with new ESLint flat config
- Update VS Code settings for proper ESLint integration
- Add changelogen scripts for proper changelog management

BREAKING CHANGE: ESLint configuration migrated to flat config system
2025-06-22 00:53:24 +07:00

186 lines
4.9 KiB
TypeScript

import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { BrowserWindow, app, ipcMain, shell } from 'electron';
import started from 'electron-squirrel-startup';
import { Redis } from 'ioredis';
// Handle creating/removing shortcuts on Windows when installing/uninstalling.
if (started) {
app.quit();
}
// Redis connection for pubsub
let redisSubscriber: Redis | null = null;
const connectRedis = () => {
try {
redisSubscriber = new Redis({
host: 'bismillahdao-redis',
port: 6379,
lazyConnect: true,
});
console.log('Redis subscriber connection initialized');
}
catch (error) {
console.error('Failed to initialize Redis subscriber:', error);
}
};
const createWindow = () => {
// Create the browser window.
const mainWindow = new BrowserWindow({
minHeight: 800,
minWidth: 1080,
maxHeight: 1080,
maxWidth: 1920,
height: 1024,
width: 1280,
titleBarStyle: 'hidden',
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
preload: path.join(__dirname, 'preload.cjs'),
},
});
mainWindow.setMenuBarVisibility(false);
// Listen for maximize/unmaximize events
mainWindow.on('maximize', () => {
mainWindow.webContents.send('window-maximize-changed', true);
});
mainWindow.on('unmaximize', () => {
mainWindow.webContents.send('window-maximize-changed', false);
});
mainWindow.webContents.on('will-navigate', function (event, reqUrl) {
const requestedHost = new URL(reqUrl).host;
const currentHost = new URL(mainWindow.webContents.getURL()).host;
if (requestedHost && requestedHost != currentHost) {
event.preventDefault();
shell.openExternal(reqUrl);
}
});
// Set up Redis pubsub when window is ready
mainWindow.webContents.once('dom-ready', () => {
setupRedisPubSub(mainWindow);
});
const isDev = process.env.NODE_ENV === 'development';
// and load the index.html of the app.
if (isDev) {
mainWindow.setIcon(fileURLToPath(new URL('../../public/favicon.ico', import.meta.url)));
mainWindow.loadURL('http://localhost:3000');
mainWindow.webContents.openDevTools();
}
else {
mainWindow.loadFile(path.join(__dirname, '../renderer/index.html'));
}
return mainWindow;
};
const setupRedisPubSub = (mainWindow: BrowserWindow) => {
if (!redisSubscriber) {
console.error('Redis subscriber not initialized');
return;
}
try {
// Subscribe to the channels
redisSubscriber.subscribe('new_token_created', 'token_cex_updated', 'max_depth_reached');
redisSubscriber.on('message', (channel: string, message: string) => {
try {
const data = JSON.parse(message);
// Send data to renderer process
mainWindow.webContents.send('redis-data', {
channel,
data,
timestamp: Date.now(),
});
console.log(`Received data from channel ${channel}:`, data);
}
catch (error) {
console.error('Error parsing Redis message:', error);
}
});
console.log('Redis pubsub setup complete');
}
catch (error) {
console.error('Error setting up Redis pubsub:', error);
}
};
// IPC handlers
ipcMain.handle('window-minimize', () => {
const window = BrowserWindow.getFocusedWindow();
if (window) window.minimize();
});
ipcMain.handle('window-maximize', () => {
const window = BrowserWindow.getFocusedWindow();
if (window) {
if (window.isMaximized()) {
window.unmaximize();
}
else {
window.maximize();
}
}
});
ipcMain.handle('window-close', () => {
const window = BrowserWindow.getFocusedWindow();
if (window) window.close();
});
ipcMain.handle('window-is-maximized', () => {
const window = BrowserWindow.getFocusedWindow();
return window ? window.isMaximized() : false;
});
ipcMain.handle('open-external', (event, url: string) => {
shell.openExternal(url);
});
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', () => {
connectRedis();
createWindow();
});
// Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('activate', () => {
// On OS X it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
// Clean up Redis connection on app quit
app.on('before-quit', () => {
if (redisSubscriber) {
redisSubscriber.disconnect();
}
});
// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and import them here.