import { useEffect, useState } from "react"; import * as DialogPrimitive from "@radix-ui/react-dialog"; import { motion, AnimatePresence } from "framer-motion"; import { useMoonAuth } from "../../../context"; export interface Notification { id: number; text: string; sender_id: number | null; receiver_id: number; read: boolean; created_at: string; } export const NotificationComponent = () => { const { supabaseClient: supabase, user } = useMoonAuth(); const [notifications, setNotifications] = useState([]); const [open, setOpen] = useState(false); const [selectedNotification, setSelectedNotification] = useState(null); useEffect(() => { const fetchNotifications = async () => { if (user) { const { data, error } = await supabase .from("notifications") .select("*") .eq("receiver_id", user.id) .order("created_at", { ascending: false }); if (error) { console.error("Error fetching notifications:", error); } else { setNotifications(data as Notification[]); } } }; fetchNotifications(); const channel = supabase .channel("notifications") .on( "postgres_changes", { event: "INSERT", schema: "public", table: "notifications", filter: `receiver_id=eq.${user?.id}`, }, (payload) => { setNotifications((prevNotifications) => [ ...prevNotifications, payload.new as Notification, ]); }, ) .subscribe(); return () => { channel.unsubscribe(); }; }, [supabase, user]); const dismissNotification = async (notificationId: number) => { try { const { error } = await supabase .from("notifications") .update({ read: true }) .eq("id", notificationId); if (error) { console.error("Error dismissing notification:", error); } else { setNotifications((prevNotifications) => prevNotifications.map((notification) => notification.id === notificationId ? { ...notification, read: true } : notification, ), ); } } catch (error) { console.error("Error dismissing notification:", error); } }; const openNotificationModal = (notification: Notification) => { setSelectedNotification(notification); setOpen(true); }; const closeNotificationModal = () => { setSelectedNotification(null); setOpen(false); }; return (
{notifications.map((notification) => (

openNotificationModal(notification)} > {notification.text}

))}
{/* Notification Modal */} {open && (
Notification {selectedNotification?.text}
)}
); }; export default NotificationComponent;