import { toast } from "@zerodevx/svelte-toast"; import type { SvelteToastOptions } from "@zerodevx/svelte-toast/stores"; import { type Notification } from "framework7/components/notification" import { f7 } from "framework7-svelte" export type NotifyOptions = { title?: string, type?: "neutral" | "info" | "warning" | "error" | "success", imageUrl?: string, timeout?: number | null, showOn?: "web" | "native" | "all" | "none" } function notifyf7(text: string, options: NotifyOptions) { if (!f7) return; let closeTimeout = options.timeout if (closeTimeout === undefined) closeTimeout = 3000; const notification = f7.notification.create({ title: options.title, titleRightText: 'now', // subtitle: 'Notification with close on click', text: text, closeOnClick: true, closeTimeout }); notification.open(); } function notifyToast(text: string, options: NotifyOptions) { const toastOptions: SvelteToastOptions = { dismissable: options.timeout !== null, } if (options.type === "success") { toastOptions.theme = { '--toastBackground': 'var(--color-green-600)', } } else if (options.type === "info") { toastOptions.theme = { '--toastBackground': 'var(--color-blue-500)', } } else if (options.type === "warning") { toastOptions.theme = { '--toastBackground': 'var(--color-yellow-600)', } } else if (options.type === "error") { toastOptions.theme = { '--toastBackground': 'var(--color-red-500)', } } toast.push(text, toastOptions); } function notifyNative(text: string, options: NotifyOptions) { if (document.hasFocus()) return; const title = options.title || "ComfyBox" const nativeOptions: NotificationOptions = { body: text, } if (options.imageUrl) { nativeOptions.icon = options.imageUrl nativeOptions.image = options.imageUrl } if (options.timeout === null) { nativeOptions.requireInteraction = true; } const notification = new Notification(title, nativeOptions); notification.onclick = () => window.focus(); } export default function notify(text: string, options: NotifyOptions = {}) { const showOn = options.showOn || "web"; if (showOn === "none") return; if (showOn === "all" || showOn === "web") { notifyf7(text, options); notifyToast(text, options); } if (showOn === "all" || showOn === "native") { notifyNative(text, options) } }