import { Combobox as ComboboxPrimitive } from '@base-ui/react'; import { router, usePage, WhenVisible } from '@inertiajs/react'; import { format } from 'date-fns'; import { Bell, CheckCheck, Loader2, Trash2 } from 'lucide-react'; import { useState } from 'react'; import { ConfirmDialog } from '@/components/confirm-dialog'; import { Button } from '@/components/ui/button'; import { Combobox, ComboboxContent } from '@/components/ui/combobox'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { cn } from '@/lib/utils'; import { destroy, markAllRead, clearAll, read } from '@/routes/notifications'; import type { Notification, NotificationPage } from '@/types/notification'; export function NotificationBell() { const { props } = usePage<{ notifications?: NotificationPage }>(); const unreadCount = props.unreadNotificationsCount ?? 0; const notifications = props.notifications ?? { data: [], current_page: 1, last_page: 1, per_page: 15, total: 0, }; const [open, setOpen] = useState(false); const [clearAllOpen, setClearAllOpen] = useState(false); const [detail, setDetail] = useState(null); const hasMore = notifications.current_page < notifications.last_page; const hasNotifications = notifications.data.length > 0; const hasUnread = notifications.data.some((n) => !n.is_read); function handleMarkAllRead() { router.patch(markAllRead().url, {}, { preserveScroll: true }); } function handleClearAll() { router.delete(clearAll().url, { preserveScroll: true, onSuccess: () => setClearAllOpen(false), }); } function handleMarkRead(notification: Notification) { router.patch(read(notification.id).url, {}, { preserveScroll: true }); } function handleDelete(notification: Notification) { router.delete(destroy(notification.id).url, { preserveScroll: true }); } function handleOpenDetail(notification: Notification) { setDetail(notification); if (!notification.is_read) { handleMarkRead(notification); } } return ( <> } > {unreadCount > 0 && ( {unreadCount > 99 ? '99+' : unreadCount} )} Notifikasi
Notifikasi
{hasNotifications ? (
{notifications.data.map((notification) => (
{!notification.is_read && ( )}
))} {hasMore && (
} >
)}
) : (
Belum ada notifikasi.
)}
{ if (!open) { setDetail(null); } }} > {detail?.title ?? '-'} {detail?.creator?.profile?.full_name && `${detail.creator.profile.full_name} · `} {detail && format( new Date(detail.created_at), 'd MMM yyyy, HH:mm', )} {detail?.content && (

{detail.content}

)}
); }