"use client"; import { BellIcon } from "lucide-react"; import { useRouter } from "next/navigation"; import { useTranslation } from "react-i18next"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { Button } from "@/components/ui/button"; import { Menu, MenuGroup, MenuGroupLabel, MenuItem, MenuPopup, MenuSeparator, MenuTrigger, } from "@/components/ui/menu"; import { markNotificationRead, notificationHref } from "@/lib/notifications"; import { useNotifications } from "@/lib/use-notifications"; // ISO timestamp -> "just now" / "10m ago" / "3h ago" / "2d ago". function relativeTime(iso: string): string { const diff = Date.now() - new Date(iso).getTime(); const mins = Math.floor(diff / 60000); if (mins < 1) return "just now"; if (mins < 60) return `${mins}m ago`; const hours = Math.floor(mins / 60); if (hours < 24) return `${hours}h ago`; return `${Math.floor(hours / 24)}d ago`; } export function NotificationsPopover() { const { t } = useTranslation(); const router = useRouter(); const { items, unread, markAllRead } = useNotifications(); return ( { // Viewing the list clears the unread badge. if (open && unread > 0) markAllRead(); }} > } > {unread > 0 && ( {unread > 9 ? "9+" : unread} )} {t("nav.notifications")} {items.length === 0 ? (
{t("nav.notificationsEmpty")}
) : ( items.map((n) => { const href = notificationHref(n); return ( { if (!href) return; if (!n.read) void markNotificationRead(n.id).catch(() => {}); router.push(href); }} > {n.actorInitials ?? "•"}
{n.text} {relativeTime(n.createdAt)}
); }) )}
); }