'use client'; import { useState, useEffect } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Bell, X, AlertCircle, Info, AlertTriangle } from 'lucide-react'; import { useToast } from '@/hooks/use-toast'; interface Announcement { id: string; title: string; content: string; priority: 'low' | 'medium' | 'high'; isActive: boolean; createdAt: string; } interface AnnouncementsProps { isOpen: boolean; onClose: () => void; unreadCount: number; onCountUpdate: (count: number) => void; } export function AnnouncementsModal({ isOpen, onClose, unreadCount, onCountUpdate }: AnnouncementsProps) { const [announcements, setAnnouncements] = useState([]); const [loading, setLoading] = useState(false); const { toast } = useToast(); useEffect(() => { if (isOpen) { fetchAnnouncements(); } }, [isOpen]); const fetchAnnouncements = async () => { setLoading(true); try { const response = await fetch('/api/announcements'); if (response.ok) { const data = await response.json(); setAnnouncements(data.announcements || []); onCountUpdate(data.unreadCount || 0); } else { toast({ title: 'Error', description: 'Failed to fetch announcements', variant: 'destructive', }); } } catch (error) { console.error('Error fetching announcements:', error); toast({ title: 'Error', description: 'Failed to fetch announcements', variant: 'destructive', }); } finally { setLoading(false); } }; const getPriorityIcon = (priority: string) => { switch (priority) { case 'high': return ; case 'medium': return ; default: return ; } }; const getPriorityColor = (priority: string) => { switch (priority) { case 'high': return 'border-destructive/20 bg-destructive/5'; case 'medium': return 'border-amber-500/20 bg-amber-500/5 dark:border-amber-400/20 dark:bg-amber-400/5'; default: return 'border-primary/20 bg-primary/5'; } }; const formatDate = (dateStr: string) => { return new Date(dateStr).toLocaleDateString('en-IE', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', }); }; return ( Announcements {unreadCount > 0 && ( {unreadCount} )}
{loading ? (

Loading announcements...

) : announcements.length === 0 ? (

No announcements at this time

) : (
{announcements.map((announcement) => ( {getPriorityIcon(announcement.priority)} {announcement.title} {announcement.priority}

{announcement.content}

{formatDate(announcement.createdAt)}

))}
)}
); } // Bell button component for header interface NotificationBellProps { unreadCount: number; onClick: () => void; } export function NotificationBell({ unreadCount, onClick }: NotificationBellProps) { return ( ); }