import { Group, Text, Box } from "@mantine/core"; import React, { useEffect, useState } from "react"; import classes from "./comment.module.css"; import { useAtom, useAtomValue } from "jotai"; import { timeAgo } from "@/lib/time"; import CommentEditor from "@/features/comment/components/comment-editor"; import { pageEditorAtom } from "@/features/editor/atoms/editor-atoms"; import CommentActions from "@/features/comment/components/comment-actions"; import CommentMenu from "@/features/comment/components/comment-menu"; import { useHover } from "@mantine/hooks"; import { useDeleteCommentMutation, useUpdateCommentMutation, } from "@/features/comment/queries/comment-query"; import { IComment } from "@/features/comment/types/comment.types"; import { CustomAvatar } from "@/components/ui/custom-avatar.tsx"; import { currentUserAtom } from "@/features/user/atoms/current-user-atom.ts"; import { useQueryEmit } from "@/features/websocket/use-query-emit"; interface CommentListItemProps { comment: IComment; pageId: string; } function CommentListItem({ comment, pageId }: CommentListItemProps) { const { hovered, ref } = useHover(); const [isEditing, setIsEditing] = useState(false); const [isLoading, setIsLoading] = useState(false); const editor = useAtomValue(pageEditorAtom); const [content, setContent] = useState(comment.content); const updateCommentMutation = useUpdateCommentMutation(); const deleteCommentMutation = useDeleteCommentMutation(comment.pageId); const [currentUser] = useAtom(currentUserAtom); const emit = useQueryEmit(); useEffect(() => { setContent(comment.content) }, [comment]); async function handleUpdateComment() { try { setIsLoading(true); const commentToUpdate = { commentId: comment.id, content: JSON.stringify(content), }; await updateCommentMutation.mutateAsync(commentToUpdate); setIsEditing(false); emit({ operation: "invalidateComment", pageId: pageId, }); } catch (error) { console.error("Failed to update comment:", error); } finally { setIsLoading(false); } } async function handleDeleteComment() { try { await deleteCommentMutation.mutateAsync(comment.id); editor?.commands.unsetComment(comment.id); emit({ operation: "invalidateComment", pageId: pageId, }); } catch (error) { console.error("Failed to delete comment:", error); } } function handleCommentClick(comment: IComment) { const el = document.querySelector(`.comment-mark[data-comment-id="${comment.id}"]`); if (el) { el.scrollIntoView({ behavior: "smooth", block: "center" }); el.classList.add("comment-highlight"); setTimeout(() => { el.classList.remove("comment-highlight"); }, 3000); } } function handleEditToggle() { setIsEditing(true); } function cancelEdit() { setIsEditing(false); } return (
{comment.creator.name}
{/*!comment.parentCommentId && ( )*/} {currentUser?.user?.id === comment.creatorId && ( )}
{timeAgo(comment.createdAt)}
{!comment.parentCommentId && comment?.selection && ( handleCommentClick(comment)}> {comment?.selection} )} {!isEditing ? ( ) : ( <> setContent(newContent)} onSave={handleUpdateComment} autofocus={true} /> )}
); } export default CommentListItem;