import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Calendar, MapPin, Building2, Tag, Milestone, ArrowRight } from "lucide-react"; import { format } from "date-fns"; export type HistoryEventType = 'name_change' | 'status_change' | 'ownership_change' | 'relocation' | 'milestone'; export interface HistoryEvent { date: string; title: string; description?: string; type: HistoryEventType; from?: string; to?: string; } interface EntityHistoryTimelineProps { events: HistoryEvent[]; entityName: string; } const eventTypeConfig: Record = { name_change: { icon: Tag, color: 'text-blue-500', label: 'Name Change' }, status_change: { icon: Calendar, color: 'text-amber-500', label: 'Status Change' }, ownership_change: { icon: Building2, color: 'text-purple-500', label: 'Ownership Change' }, relocation: { icon: MapPin, color: 'text-green-500', label: 'Relocation' }, milestone: { icon: Milestone, color: 'text-pink-500', label: 'Milestone' }, }; // Fallback config for unknown event types const defaultEventConfig = { icon: Tag, color: 'text-gray-500', label: 'Event' }; export function EntityHistoryTimeline({ events, entityName }: EntityHistoryTimelineProps) { if (events.length === 0) { return ( No Historical Events No historical events recorded for {entityName} ); } // Sort events by date (most recent first) const sortedEvents = [...events].sort((a, b) => { const dateA = new Date(a.date); const dateB = new Date(b.date); return dateB.getTime() - dateA.getTime(); }); return (
{/* Timeline line */}
{sortedEvents.map((event, index) => { // Safety check: verify event.type exists in eventTypeConfig, use fallback if not const config = event.type && eventTypeConfig[event.type] ? eventTypeConfig[event.type] : defaultEventConfig; const Icon = config.icon; return (
{/* Timeline dot */}
{/* Event content */}
{event.title} {formatEventDate(event.date)} {config.label}
{(event.description || (event.from && event.to)) && ( {event.from && event.to && (
{event.from} {event.to}
)} {event.description && (

{event.description}

)}
)}
); })}
); } function formatEventDate(dateString: string): string { // Safety check: validate dateString exists and is a string if (!dateString || typeof dateString !== 'string') { return 'Unknown date'; } try { // Handle year-only dates if (/^\d{4}$/.test(dateString)) { return dateString; } // Validate date string before creating Date object const date = new Date(dateString); // Check if date is valid if (isNaN(date.getTime())) { return dateString; } return format(date, 'MMMM d, yyyy'); } catch { return dateString; } }