'use client'; import { Bell } from 'lucide-react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { Button } from '@/components/ui/button'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Separator } from '@/components/ui/separator'; import { apiFetch } from '@/lib/api/client'; import { useNotifications } from '@/hooks/use-notifications'; import { NotificationItem } from './notification-item'; interface NotificationListResponse { data: Array<{ id: string; type: string; title: string; description: string | null; link: string | null; isRead: boolean; createdAt: Date; }>; total: number; } export function NotificationBell() { const { unreadCount } = useNotifications(); const queryClient = useQueryClient(); const { data, isLoading } = useQuery({ queryKey: ['notifications', 'list'], queryFn: () => apiFetch('/api/v1/notifications?limit=20'), staleTime: 30_000, }); const markReadMutation = useMutation({ mutationFn: (notificationId: string) => apiFetch(`/api/v1/notifications/${notificationId}`, { method: 'PATCH' }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['notifications'] }); }, }); const markAllReadMutation = useMutation({ mutationFn: () => apiFetch('/api/v1/notifications/read-all', { method: 'POST' }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['notifications'] }); }, }); const notifications = data?.data ?? []; return ( {/* Header */}

Notifications

{unreadCount > 0 && ( )}
{/* Notification list */} {isLoading ? (
Loading...
) : notifications.length === 0 ? (
No notifications
) : (
{notifications.map((notification) => ( markReadMutation.mutate(id)} /> ))}
)}
); }