"use client"; import { RichText } from "@payloadcms/richtext-lexical/react"; import { convertLexicalToPlaintext } from "@payloadcms/richtext-lexical/plaintext"; import type { Ticket, User } from "@/payload-types"; import { cn } from "@/lib/utils"; import { HistoryIcon } from "lucide-react"; interface TicketTimelineProps { readonly ticket: Pick; readonly currentUserId: number; } type UserRelation = number | User | null | undefined; function resolveUser(relation: UserRelation): User | null { return typeof relation === "object" && relation ? relation : null; } function userId(relation: UserRelation): number | null { return typeof relation === "object" && relation ? relation.id : (relation ?? null); } function displayName(relation: UserRelation, fallback: string): string { const user = resolveUser(relation); if (user) return user.payloadDisplayName || user.username || user.displayName; if (typeof relation === "number") return `User #${relation}`; return fallback; } function formatDate(iso: string | null | undefined): string { if (!iso) return "Unknown time"; return new Intl.DateTimeFormat(undefined, { dateStyle: "medium", timeStyle: "short", }).format(new Date(iso)); } export function TicketTimeline({ ticket, currentUserId }: TicketTimelineProps) { const activities = [...(ticket.activity ?? [])].sort( (left, right) => new Date(left.created_at ?? 0).getTime() - new Date(right.created_at ?? 0).getTime(), ); const reporterName = displayName(ticket.reporter, "Reporter"); return (
{activities.length === 0 && (

No activity yet.

)} {activities.map((activity, index) => { const key = activity.id ?? `${activity.type}-${activity.created_at ?? "unknown"}-${index}`; const content = convertLexicalToPlaintext({ data: activity.content }); if (activity.type === "system") { return (
); } const isClientMessage = activity.type === "client_message"; const authorId = userId(activity.author); const authorName = displayName( activity.author, isClientMessage ? reporterName : "Staff member", ); const bubbleLabel = isClientMessage ? authorId === currentUserId ? "You" : reporterName : "Staff"; return (
{bubbleLabel}
{authorName} ยท {formatDate(activity.created_at)}
); })}
); }