import { updateReadedNotification } from '@/service/notify.api'; import { notificationQueries } from '@/service/queries'; import useNotificationStore from '@/store/useNotificationStore'; import { formatTimeAgo } from '@/utils/helper'; import { cn } from '@lib/utils'; import { m } from '@paraglide/messages'; import { BellIcon } from '@phosphor-icons/react'; import { useMutation, useQuery } from '@tanstack/react-query'; import { Link } from '@tanstack/react-router'; import { Button } from '@ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '@ui/dropdown-menu'; import { useEffect, useState } from 'react'; import { toast } from 'sonner'; import { Item, ItemContent, ItemDescription, ItemTitle } from './ui/item'; const Notification = () => { const [open, _setOpen] = useState(false); const { hasNew, setHasNew } = useNotificationStore((state) => state); const { data } = useQuery(notificationQueries.topFive()); const { mutate: updateReaded } = useMutation({ mutationFn: () => updateReadedNotification(), onError: (error: ReturnError) => { const code = error.code as Parameters< typeof m.backend_message >[0]['code']; toast.error(m.backend_message({ code }), { richColors: true, }); }, }); const onOpenNotification = (isOpen: boolean) => { _setOpen(isOpen); updateReaded(); }; useEffect(() => { if (data) { setHasNew(data.hasNewNotify); } }, [data]); if (!data) return null; return ( {m.ui_label_notifications()} {data.list && data.list.length > 0 ? ( data.list.map((notify) => { return ( {m.templates_title_notification({ title: notify.title as Parameters< typeof m.templates_title_notification >[0]['title'], })} {formatTimeAgo(new Date(notify.createdAt))} ); }) ) : ( {m.common_no_notify()} )} {m.ui_view_all_notifications()} ); }; export default Notification;