import { Button } from "@/components/ui/button"; import Heading from "@/components/ui/heading"; import { Toaster } from "@/components/ui/sonner"; import { FrigateConfig } from "@/types/frigateConfig"; import axios from "axios"; import { useCallback, useEffect, useState } from "react"; import useSWR from "swr"; const NOTIFICATION_SERVICE_WORKER = "notifications-worker.ts"; export default function NotificationView() { const { data: config } = useSWR("config", { revalidateOnFocus: false, }); // notification key handling const { data: publicKey } = useSWR( config?.notifications?.enabled ? "notifications/pubkey" : null, { revalidateOnFocus: false }, ); const subscribeToNotifications = useCallback( (registration: ServiceWorkerRegistration) => { if (registration) { registration.pushManager .subscribe({ userVisibleOnly: true, applicationServerKey: publicKey, }) .then((pushSubscription) => { axios.post("notifications/register", { sub: pushSubscription, }); }); } }, [publicKey], ); // notification state const [registration, setRegistration] = useState(); useEffect(() => { navigator.serviceWorker .getRegistration(NOTIFICATION_SERVICE_WORKER) .then((worker) => { if (worker) { setRegistration(worker); } else { setRegistration(null); } }) .catch(() => { setRegistration(null); }); }, []); return ( <>
Notification Settings {config?.notifications.enabled && (
{ // TODO need to register the worker before enabling the notifications button // TODO make the notifications button show enable / disable depending on current state }
)}
); }