Implement notifications for Electron

This commit is contained in:
2025-09-21 15:23:27 +03:00
Unverified
parent fcb567a198
commit 137d02567b
7 changed files with 368 additions and 183 deletions
+43 -4
View File
@@ -1,8 +1,10 @@
import { app, BrowserWindow } from 'electron';
import { app, BrowserWindow, Notification, ipcMain } from 'electron';
import path from "node:path";
let mainWindow: BrowserWindow | null = null;
app.whenReady().then(() => {
const win = new BrowserWindow({
mainWindow = new BrowserWindow({
title: 'Main window',
minWidth: 800,
minHeight: 420,
@@ -19,8 +21,45 @@ app.whenReady().then(() => {
});
if (process.env.VITE_DEV_SERVER_URL) {
win.loadURL(process.env.VITE_DEV_SERVER_URL);
mainWindow.loadURL(process.env.VITE_DEV_SERVER_URL);
} else {
win.loadFile('frontend/build/electron/dist/index.html');
mainWindow.loadFile('frontend/build/electron/dist/index.html');
}
// Handle notification permission requests
ipcMain.handle('request-notification-permission', async () => {
if (Notification.isSupported()) {
return 'granted';
}
return 'denied';
});
// Handle showing notifications
ipcMain.handle('show-notification', async (event, options) => {
if (Notification.isSupported()) {
try {
const notification = new Notification({
title: options.title,
body: options.body,
icon: options.icon,
silent: false,
urgency: 'normal'
});
notification.on('click', () => {
if (mainWindow) {
mainWindow.show();
mainWindow.focus();
}
});
notification.show();
return true;
} catch (error) {
console.error('Error creating notification:', error);
return false;
}
}
return false;
});
});
+6 -2
View File
@@ -1,9 +1,13 @@
import { contextBridge } from "electron";
import { contextBridge, ipcRenderer } from "electron";
import type { ElectronInterface, Platform } from "../electron";
const electronInterface: ElectronInterface = {
desktop: true,
platform: process.platform as Platform
platform: process.platform as Platform,
notifications: {
requestPermission: () => ipcRenderer.invoke('request-notification-permission'),
show: (options: any) => ipcRenderer.invoke('show-notification', options)
}
}
contextBridge.exposeInMainWorld("electronInterface", electronInterface);