import { Injectable } from '@angular/core';
const STORAGE_KEY = 'p3xr-desktop-notifications';
const isElectron = /electron/i.test(navigator.userAgent);
/**
* Desktop notification service — works in Electron (native) and web (Notification API).
* Default: disabled. User opts in via Settings toggle.
* Only fires when the app/tab is not focused.
*/
@Injectable({ providedIn: 'root' })
export class NotificationService {
isEnabled(): boolean {
try {
const stored = localStorage.getItem(STORAGE_KEY);
if (stored === null) return isElectron; // default: on in Electron, off in web
return stored === 'true';
} catch { return false; }
}
setEnabled(enabled: boolean): void {
try { localStorage.setItem(STORAGE_KEY, String(enabled)); } catch {}
if (enabled && !isElectron) this.requestWebPermission();
}
private requestWebPermission(): void {
if (typeof Notification === 'undefined') return;
if (Notification.permission !== 'granted' && Notification.permission !== 'denied') {
Notification.requestPermission();
}
}
notify(title: string, body: string): void {
if (!this.isEnabled()) return;
if (!document.hidden && document.hasFocus()) return;
if (isElectron) {
try {
window.parent?.postMessage({ type: 'p3x-notify', title, body }, '*');
} catch {}
return;
}
if (typeof Notification !== 'undefined' && Notification.permission === 'granted') {
try {
const n = new Notification(title, { body, icon: '/images/redis.svg' });
n.onclick = () => { window.focus(); n.close(); };
} catch {}
}
}
}