RSS Git Download  Clone
Raw Blame History 2kB 49 lines
/**
 * Desktop notification helper — 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.
 */

const STORAGE_KEY = 'p3xr-desktop-notifications'
const isElectron = /electron/i.test(navigator.userAgent)

export function isNotificationsEnabled(): 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 }
}

export function setNotificationsEnabled(enabled: boolean): void {
    try { localStorage.setItem(STORAGE_KEY, String(enabled)) } catch {}
    if (enabled && !isElectron) requestWebPermission()
}

function requestWebPermission(): void {
    if (typeof Notification === 'undefined') return
    if (Notification.permission !== 'granted' && Notification.permission !== 'denied') {
        Notification.requestPermission()
    }
}

export function notify(title: string, body: string): void {
    if (!isNotificationsEnabled()) return
    if (!document.hidden && document.hasFocus()) return

    if (isElectron) {
        try {
            window.parent?.postMessage({ type: 'p3x-notify', title, body }, '*')
        } catch {}
        return
    }

    // Web Notification API
    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 {}
    }
}