import { useEffect } from 'react'; import { apiFetch } from '../api-client'; const VAPID_PUBLIC_KEY = import.meta.env['VITE_VAPID_PUBLIC_KEY'] as string | undefined; function urlBase64ToUint8Array(base64: string): Uint8Array { const padding = '='.repeat((4 - (base64.length % 4)) % 4); const b64 = (base64 + padding).replace(/-/g, '+').replace(/_/g, '/'); const raw = atob(b64); return Uint8Array.from(raw, (c) => c.charCodeAt(0)); } export function usePushRegistration() { useEffect(() => { if (!VAPID_PUBLIC_KEY || !('serviceWorker' in navigator) || !('PushManager' in window)) return; const register = async () => { try { const reg = await navigator.serviceWorker.ready; const existing = await reg.pushManager.getSubscription(); const sub = existing ?? (await reg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY), })); const json = sub.toJSON(); await apiFetch('/notifications/subscribe', { method: 'POST', body: { endpoint: sub.endpoint, keys: { p256dh: json.keys?.['p256dh'] ?? '', auth: json.keys?.['auth'] ?? '' }, }, }); } catch { // Push é opt-in — permissão negada ou SW não disponível é normal } }; void register(); }, []); }