"use client"; import { useEffect, useState, useRef } from "react"; import { initializeApp, getApps } from "firebase/app"; import { getMessaging, getToken, onMessage } from "firebase/messaging"; import AuthService from "../services/AuthService"; import { setFCMToken } from "../utils/api"; const firebaseConfig = { apiKey: "AIzaSyBZV7KBLRJSTApahfrO8lBesmIM3zNRSaY", authDomain: "sweet-home-b2766.firebaseapp.com", projectId: "sweet-home-b2766", storageBucket: "sweet-home-b2766.firebasestorage.app", messagingSenderId: "602865114600", appId: "1:602865114600:web:ed9b6754940507a6ab585d", measurementId: "G-M2V95NBJLX", }; const app = getApps().length === 0 ? initializeApp(firebaseConfig) : getApps()[0]; export default function NotificationHandler() { const [notification, setNotification] = useState(null); const [showPrompt, setShowPrompt] = useState(false); const initialized = useRef(false); useEffect(() => { function checkAuth() { if (initialized.current) return; if (!AuthService.getToken()) return; initialized.current = true; if ("Notification" in window) { if (Notification.permission === "default") { setShowPrompt(true); } else if (Notification.permission === "granted") { setupFCM(); } } } // Check immediately checkAuth(); // Also check when auth token changes (login via client-side navigation) const interval = setInterval(() => { if (!initialized.current && AuthService.getToken()) { checkAuth(); } }, 1000); // Check on route change (visibility) const onVisibility = () => { if (document.visibilityState === "visible") checkAuth(); }; document.addEventListener("visibilitychange", onVisibility); return () => { clearInterval(interval); document.removeEventListener("visibilitychange", onVisibility); }; }, []); async function setupFCM() { try { const registration = await navigator.serviceWorker.register("/firebase-messaging-sw.js"); const messaging = getMessaging(app); const fcmToken = await getToken(messaging, { vapidKey: "BGZ4Fo8rRhoTdStLGlCySDZOnAX4ekCA0e3HDWXL5uEi2kOnXynYjbaDbY15002phUrFqxBpPPFHgfH2VhrmFDU", serviceWorkerRegistration: registration, }); if (fcmToken) { await setFCMToken(fcmToken, 2); } onMessage(messaging, (payload) => { const title = payload.notification?.title || payload.data?.title || "Sweet Home"; const body = payload.notification?.body || payload.data?.body || ""; setNotification({ title, body }); setTimeout(() => setNotification(null), 5000); }); } catch (err) { console.error("[FCM] Setup error:", err); } } async function handleEnable() { setShowPrompt(false); // This MUST be synchronous from a user gesture const permission = await Notification.requestPermission(); console.log("[FCM] Permission result:", permission); if (permission === "granted") { await setupFCM(); } } return ( <> {showPrompt && (
تفعيل الإشعارات
اسمح بالإشعارات للبقاء على اطلاع بحجوزاتك وعروضنا.
{notification.title}
{notification.body}