"use client"; import { Dropdown, DropdownContent, DropdownTrigger, } from "@/components/ui/dropdown"; import Modal from "@/components/ui/modal"; import Status from "@/components/ui/Status"; import { useMarkNotificationAsSeen } from "@/hooks/queries/useNotificationQueries"; import { useIsMobile } from "@/hooks/use-mobile"; import { TNotificationDetailsResponse } from "@/lib/api/types/NotificationHistory"; import { cn, sanitizeHtmlWithStyles } from "@/lib/utils"; import { capitalize, unixToDate } from "@/utils/shared"; import Link from "next/link"; import { useState } from "react"; import { BellIcon } from "./icons"; import NotificationList from "./notification-list"; export function Notification() { const [isOpen, setIsOpen] = useState(false); const [isDotVisible, setIsDotVisible] = useState(true); const [unreadNotificationCount, setUnreadNotificationCount] = useState(0); const [isModalOpen, setIsModalOpen] = useState(false); const [currentNotification, setCurrentNotification] = useState(null); const { mutate } = useMarkNotificationAsSeen(); const isMobile = useIsMobile(); const handleNotificationClick = ( notification: TNotificationDetailsResponse, ) => { setCurrentNotification(notification); setIsModalOpen(true); setIsOpen(false); if (notification.id) mutate(notification.id); }; return ( <> { setIsOpen(open); if (setIsDotVisible) setIsDotVisible(false); }} > {isDotVisible && unreadNotificationCount > 0 && ( 9 ? "h-[18px]" : "size-[18px]", )} > {unreadNotificationCount > 99 ? "99+" : unreadNotificationCount} )}
Notifications {unreadNotificationCount} new
setIsOpen(false)} className="block rounded-xl border border-primary/40 bg-white/70 p-2 text-center text-sm font-semibold tracking-wide text-primary outline-none transition-colors hover:bg-primary/10 focus:bg-primary/10 focus:text-primary focus-visible:border-primary dark:border-dark-3 dark:bg-dark-2/70 dark:text-dark-6 dark:hover:border-dark-5 dark:hover:bg-dark-3 dark:hover:text-dark-7 dark:focus-visible:border-dark-5 dark:focus-visible:bg-dark-3 dark:focus-visible:text-dark-7" > See all notifications
{ setIsModalOpen(false); }} confirmText="Mark as read" classNames="relative !p-0 w-[34rem] max-w-[calc(100vw-2rem)] !rounded-3xl border border-stroke/60 dark:border-dark-3 [&>button]:absolute [&>button]:right-3 [&>button]:top-3 [&>button]:z-10 [&>button]:!mb-0 [&>button]:!text-white/80 [&>button]:hover:!text-white" >
{/* Gradient header */}
{currentNotification?.priority && ( {capitalize(currentNotification.priority)} )} {currentNotification?.type && ( {capitalize(currentNotification.type)} )}

{currentNotification?.title || "Notification"}

{!!currentNotification?.created_at && (

{unixToDate({ unix: currentNotification.created_at, hasTime: true, })}

)}
{/* Body */}
{currentNotification?.image && ( // eslint-disable-next-line @next/next/no-img-element {currentNotification.title )}
{currentNotification?.link && ( setIsModalOpen(false)} className="rounded-xl border border-primary/40 bg-primary/5 px-4 py-2 text-sm font-semibold text-primary transition-colors hover:bg-primary/10" > Open link )}
); }