"use client" import { useEffect, useState } from "react" import { subscribeUser, sendNotification, unsubscribeUser } from "@/app/actions" // helper for converting VAPID key function urlBase64ToUint8Array(base64String) { const padding = '='.repeat((4 - (base64String.length % 4)) % 4) const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/') const rawData = window.atob(base64) const outputArray = new Uint8Array(rawData.length) for (let i = 0; i < rawData.length; ++i) { outputArray[i] = rawData.charCodeAt(i) } return outputArray } export default function PushNotificationManager() { const [isSupported, setIsSupported] = useState(false) const [subscription, setSubscription] = useState(null) const [message, setMessage] = useState('') async function registerServiceWorker() { console.log("check0") const registration = await navigator.serviceWorker.register('/sw.js', { scope: '/', updateViaCache: 'none', }) const sub = await registration.pushManager.getSubscription() setSubscription(sub) console.log("check1") } async function subscribeToPush() { const registration = await navigator.serviceWorker.ready console.log("check3") const key = urlBase64ToUint8Array(process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY) const sub = await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: key }) console.log("check4") setSubscription(sub) const serializedSub = JSON.parse(JSON.stringify(sub)) await subscribeUser(serializedSub) console.log("check5") } async function unsubscribeFromPush() { await subscription?.unsubscribe() setSubscription(null) await unsubscribeUser() } async function sendTestNotification() { if (subscription) { await sendNotification(message) setMessage('') } } useEffect(() => { if ('serviceWorker' in navigator && 'PushManager' in window) { setIsSupported(true) registerServiceWorker() } }, []) return (

Push Notifications

{!isSupported ? (

Push notifications are not supported in this browser.

) : subscription ? ( <>

You are subscribed to push notifications.

setMessage(e.target.value)} /> ) : ( <>

You are not subscribed to push notifications.

)}
) }