import { useState, useEffect } from 'react'; export default function PushOptIn() { const [show, setShow] = useState(false); const [status, setStatus] = useState<'idle' | 'subscribing' | 'done'>('idle'); useEffect(() => { // Don't show if: no support, already subscribed, already dismissed, or first visit if (!('PushManager' in window) || !('serviceWorker' in navigator)) return; if (localStorage.getItem('sp_push_dismissed') || localStorage.getItem('sp_push_subscribed')) return; // Show after 2nd page view const views = parseInt(localStorage.getItem('sp_page_views') || '0') + 1; localStorage.setItem('sp_page_views', String(views)); if (views >= 3) { setTimeout(() => setShow(true), 5000); } }, []); const subscribe = async () => { setStatus('subscribing'); try { const reg = await navigator.serviceWorker.ready; const sub = await reg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: urlBase64ToUint8Array( // VAPID public key — generate with: npx web-push generate-vapid-keys import.meta.env.PUBLIC_VAPID_KEY || 'BJ_placeholder_replace_with_real_vapid_key' ), }); await fetch('/api/push/subscribe', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(sub.toJSON()), }); localStorage.setItem('sp_push_subscribed', '1'); setStatus('done'); if ((window as any).__showToast) (window as any).__showToast('Push notificaties ingeschakeld!', 'success'); setTimeout(() => setShow(false), 2000); } catch { setStatus('idle'); } }; const dismiss = () => { setShow(false); localStorage.setItem('sp_push_dismissed', '1'); }; if (!show) return null; return (

Prijsdaling meldingen

Ontvang direct een melding wanneer sneakers op je watchlist in prijs dalen.

); } function urlBase64ToUint8Array(base64String: string) { const padding = '='.repeat((4 - (base64String.length % 4)) % 4); const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/'); const rawData = atob(base64); const outputArray = new Uint8Array(rawData.length); for (let i = 0; i < rawData.length; ++i) outputArray[i] = rawData.charCodeAt(i); return outputArray; }