import Link from "next/link"; import type { Ticket, User } from "@/payload-types"; import { convertLexicalToPlaintext } from "@payloadcms/richtext-lexical/plaintext"; import { Item, ItemContent, ItemDescription, ItemFooter, ItemHeader, ItemTitle, } from "@/components/ui/item"; import { TicketBadges, TicketCategoryBadge } from "@/components/frontend/helpdesk/TicketBadges"; interface TicketCardProps { readonly ticket: Ticket; } type UserRelation = number | User | null | undefined; function resolveUser(relation: UserRelation): User | null { return typeof relation === "object" && relation ? relation : null; } function userName(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 timeAgo(iso: string): string { const diff = Date.now() - new Date(iso).getTime(); const minutes = Math.floor(diff / 60000); if (minutes < 1) return "just now"; if (minutes < 60) return `${minutes}m ago`; const hours = Math.floor(minutes / 60); if (hours < 24) return `${hours}h ago`; const days = Math.floor(hours / 24); return `${days}d ago`; } export function TicketCard({ ticket }: TicketCardProps) { const description = convertLexicalToPlaintext({ data: ticket.description }); const reporterName = userName(ticket.reporter, "Unknown reporter"); const assigneeName = userName(ticket.assignee, "Unassigned"); const hasAssignee = ticket.assignee !== null && ticket.assignee !== undefined; return ( #{ticket.id} {ticket.title} {description || "No description provided."} opened by {reporterName} {hasAssignee && assigned to {assigneeName}} {timeAgo(ticket.updatedAt)} ); }