/** * Browser notification + in-app toast for generation task completions. * Falls back gracefully when Notification API is unavailable. */ import { toast } from "../components/toast/toastStore"; let permissionGranted = false; async function requestPermission(): Promise { if (permissionGranted) return true; if (typeof Notification === "undefined") return false; if (Notification.permission === "granted") { permissionGranted = true; return true; } if (Notification.permission === "denied") return false; try { const result = await Notification.requestPermission(); permissionGranted = result === "granted"; return permissionGranted; } catch { return false; } } export function notifyTaskCompleted(label: string, mode: "image" | "video" = "image") { const emoji = mode === "video" ? "🎬" : "🖼️"; const title = `${emoji} ${label}生成完成`; const body = "点击返回查看生成结果"; // Browser notification (background tab) if (typeof Notification !== "undefined" && Notification.permission === "granted") { try { new Notification(title, { body, icon: "/favicon.ico", tag: "gen-complete" }); } catch { /* */ } } // In-app toast dispatchGenToast(title); } // Use the existing toast system for in-app notifications function dispatchGenToast(msg: string) { toast(msg, "success"); } /** Call once on app init to pre-warm permission. */ export async function initNotificationPermission() { if (typeof Notification === "undefined") return; if (Notification.permission === "default") { // Don't prompt immediately — wait for first user interaction document.addEventListener("click", () => requestPermission(), { once: true }); } }