"use client"; import { useState, useEffect } from "react"; import { Box, Paper, Text, Group, CloseButton, Badge, ActionIcon, Stack, Transition } from "@mantine/core"; import { IconBell, IconChevronRight } from "@tabler/icons-react"; import { usePathname, useRouter } from "next/navigation"; interface NewsItem { id: string | number; type: "berita" | "pengumuman"; title: string; content: string; timestamp?: string | Date; } interface ModernNewsNotificationProps { news: NewsItem[]; hasNewContent?: boolean; // ✅ TAMBAHAN newItemCount?: number; // ← tambahkan ini onSeen?: () => void; // ✅ TAMBAHAN autoShowDelay?: number; } function stripHtml(html: string): string { return html .replace(/<[^>]+>/g, '') .replace(/ /gi, ' ') .replace(/&/gi, '&') .replace(/\s+/g, ' ') .trim(); } export default function ModernNewsNotification({ news = [], hasNewContent = false, newItemCount = 0, // 👈 tambahkan ini onSeen, autoShowDelay = 2000, }: ModernNewsNotificationProps) { const router = useRouter(); const [toastVisible, setToastVisible] = useState(false); const [widgetOpen, setWidgetOpen] = useState(false); const [hasNewNotifications, setHasNewNotifications] = useState(hasNewContent); const [hasShownToast, setHasShownToast] = useState(false); const [iconVisible, setIconVisible] = useState(true); const pathname = usePathname(); // Sinkronisasi dari luar useEffect(() => { if (hasNewContent) { setHasNewNotifications(true); // Jangan otomatis tampilkan toast di sini — biarkan saat page load saja } }, [hasNewContent]); // Auto show toast hanya saat page pertama kali load useEffect(() => { if (news.length > 0 && !toastVisible && !hasShownToast) { const timer = setTimeout(() => { setToastVisible(true); setHasShownToast(true); // Jika ada new content, anggap sudah "dilihat" setelah toast muncul if (hasNewNotifications) { onSeen?.(); } }, autoShowDelay); return () => clearTimeout(timer); } }, [news.length, autoShowDelay, toastVisible, hasShownToast, hasNewNotifications, onSeen]); // Auto hide toast useEffect(() => { if (toastVisible) { const timer = setTimeout(() => setToastVisible(false), 8000); return () => clearTimeout(timer); } }, [toastVisible]); // Scroll handler useEffect(() => { let lastScrollY = window.scrollY; const HIDE_THRESHOLD = 100; const SHOW_THRESHOLD = 50; const handleScroll = () => { const currentScrollY = window.scrollY; const scrollDirection = currentScrollY > lastScrollY ? 'down' : 'up'; if (scrollDirection === 'down' && currentScrollY > HIDE_THRESHOLD) { setIconVisible(false); } else if (scrollDirection === 'up' && currentScrollY < SHOW_THRESHOLD) { setIconVisible(true); } if (currentScrollY > 150 && toastVisible) { setToastVisible(false); } lastScrollY = currentScrollY; }; window.addEventListener('scroll', handleScroll, { passive: true }); return () => window.removeEventListener('scroll', handleScroll); }, [toastVisible]); const currentNews = news[0]; const handleNotificationClick = (item: NewsItem) => { setWidgetOpen(false); onSeen?.(); // ✅ tandai sebagai dilihat if (item.type === "berita") { router.push("/darmasaba/desa/berita/semua"); } else if (item.type === "pengumuman") { router.push("/darmasaba/desa/pengumuman"); } }; const handleLihatSemua = () => { setToastVisible(false); setWidgetOpen(true); setHasNewNotifications(false); onSeen?.(); // ✅ }; const handleDismissToast = (e: React.MouseEvent) => { e.stopPropagation(); setToastVisible(false); onSeen?.(); // ✅ }; // Only show on landing page if (pathname !== '/darmasaba') { return null; } return ( <> {/* Floating Bell Icon */} {(transitionStyles) => ( { setWidgetOpen(!widgetOpen); setHasNewNotifications(false); onSeen?.(); // ✅ }} style={{ width: "60px", height: "60px", boxShadow: "0 4px 20px rgba(0,0,0,0.15)", position: "relative", }} > {hasNewNotifications && news.length > 0 && ( {newItemCount || news.length} )} )} {/* Widget Panel */} {(styles) => ( Berita & Pengumuman { setWidgetOpen(false); onSeen?.(); // ✅ }} variant="transparent" c="white" /> {news.length === 0 ? ( Tidak ada berita terbaru ) : ( {news.map((item, index) => ( { e.currentTarget.style.borderColor = "#1e5a7e"; e.currentTarget.style.transform = "translateY(-2px)"; e.currentTarget.style.boxShadow = "0 4px 12px rgba(0,0,0,0.08)"; }} onMouseLeave={(e) => { e.currentTarget.style.borderColor = "#e9ecef"; e.currentTarget.style.transform = "translateY(0)"; e.currentTarget.style.boxShadow = "none"; }} onClick={() => handleNotificationClick(item)} > {item.type === "berita" ? "📰 Berita" : "📢 Pengumuman"} {item.title || "Tanpa Judul"} {stripHtml(item.content).substring(0, 100)}... ))} )} )} {/* Toast Notification */} {(styles) => ( {currentNews?.type === "berita" ? "Berita Terbaru" : "Pengumuman"} {currentNews?.title || "Informasi Terbaru"} {stripHtml(currentNews?.content || "")} {news.length > 1 ? `${news.length} berita tersedia` : '1 berita'} Lihat Semua → )} ); }