"use client"; import { MessageSquare } from "lucide-react"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; import { CommentActions } from "./comment-actions"; import type { CommentItemProps } from "./types"; function getInitials(name: string | null, email: string): string { if (name) { return name .split(" ") .map((part) => part[0]) .join("") .toUpperCase() .slice(0, 2); } return email[0].toUpperCase(); } function formatTimestamp(dateString: string): string { const date = new Date(dateString); const now = new Date(); const diffMs = now.getTime() - date.getTime(); const diffMins = Math.floor(diffMs / 60000); const diffHours = Math.floor(diffMs / 3600000); const diffDays = Math.floor(diffMs / 86400000); const timeStr = date.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit", hour12: true, }); if (diffMins < 1) { return "Just now"; } if (diffMins < 60) { return `${diffMins}m ago`; } if (diffHours < 24 && date.getDate() === now.getDate()) { return `Today at ${timeStr}`; } const yesterday = new Date(now); yesterday.setDate(yesterday.getDate() - 1); if (date.getDate() === yesterday.getDate() && diffDays < 2) { return `Yesterday at ${timeStr}`; } if (diffDays < 7) { const dayName = date.toLocaleDateString("en-US", { weekday: "long" }); return `${dayName} at ${timeStr}`; } return date.toLocaleDateString("en-US", { month: "short", day: "numeric", year: date.getFullYear() !== now.getFullYear() ? "numeric" : undefined, }) + ` at ${timeStr}`; } function renderMentions(content: string): React.ReactNode { const mentionPattern = /@(\w+(?:\s+\w+)*)/g; const parts: React.ReactNode[] = []; let lastIndex = 0; let match: RegExpExecArray | null; while ((match = mentionPattern.exec(content)) !== null) { if (match.index > lastIndex) { parts.push(content.slice(lastIndex, match.index)); } parts.push( {match[0]} ); lastIndex = match.index + match[0].length; } if (lastIndex < content.length) { parts.push(content.slice(lastIndex)); } return parts.length > 0 ? parts : content; } export function CommentItem({ comment, onEdit, onDelete, onReply, isReply = false, }: CommentItemProps) { const displayName = comment.author?.displayName || comment.author?.email.split("@")[0] || "Unknown"; const email = comment.author?.email || ""; return (