import { ActionIcon, Group, Text, Tooltip, UnstyledButton, } from "@mantine/core"; import { IconCheck, IconFileDescription, IconPointFilled, } from "@tabler/icons-react"; import { CustomAvatar } from "@/components/ui/custom-avatar"; import { INotification } from "../types/notification.types"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { useState } from "react"; import { useMarkReadMutation } from "../queries/notification-query"; import { buildPageUrl } from "@/features/page/page.utils"; import { formatRelativeTime } from "../notification.utils"; import classes from "../notification.module.css"; type NotificationItemProps = { notification: INotification; onNavigate: () => void; }; export function NotificationItem({ notification, onNavigate, }: NotificationItemProps) { const { t } = useTranslation(); const navigate = useNavigate(); const markRead = useMarkReadMutation(); const [hovered, setHovered] = useState(false); const isUnread = !notification.readAt; const getNotificationMessage = (): string => { switch (notification.type) { case "comment.user_mention": return t("mentioned you in a comment"); case "comment.created": return t("commented on a page"); case "comment.resolved": return t("resolved a comment"); case "page.user_mention": return t("mentioned you on a page"); default: return ""; } }; const handleClick = () => { if (notification.page && notification.space) { if (isUnread) { markRead.mutate([notification.id]); } navigate( buildPageUrl( notification.space.slug, notification.page.slugId, notification.page.title, ), ); onNavigate(); } }; const handleMarkRead = (e: React.MouseEvent) => { e.stopPropagation(); if (isUnread) { markRead.mutate([notification.id]); } }; return ( setHovered(true)} onMouseLeave={() => setHovered(false)} w="100%" className={classes.notificationItem} >
{notification.actor?.name} {" "} {getNotificationMessage()} {notification.page && ( {notification.page.icon ? ( {notification.page.icon} ) : ( )} {notification.page.title || t("Untitled")} )}
{hovered && isUnread ? ( ) : ( {formatRelativeTime(notification.createdAt)} )} {isUnread && ( )}
); }