'use client'; import { ComponentType } from 'react'; import { formatDistanceToNow } from 'date-fns'; import { Clock, User } from 'lucide-react'; import { EmptyState } from './states'; export interface ActivityTimelineItem { id: string; type: string; title: string; description?: string; occurredAt: string; createdBy: { name: string }; durationMinutes?: number; outcome?: string; isAutomated?: boolean; participants?: Array<{ name?: string }>; } export interface ActivityTimelineProps { activities: ActivityTimelineItem[]; loading: boolean; emptyTitle?: string; emptyDescription?: string; onLoadMore?: () => void; hasMore?: boolean; activityIcons?: Record>; activityColors?: Record; formatTime?: (date: string) => string; } function defaultFormatTime(date: string): string { try { return formatDistanceToNow(new Date(date), { addSuffix: true }); } catch { return ''; } } export function ActivityTimeline({ activities, loading, emptyTitle = 'No activities yet', emptyDescription = 'Log calls, meetings, and notes to track your interactions', onLoadMore, hasMore = false, activityIcons = {}, activityColors = {}, formatTime = defaultFormatTime, }: ActivityTimelineProps) { if (loading) { return (
{[...Array(3)].map((_, i) => (
))}
); } return (
{/* Timeline */}
{/* Timeline line */}
{/* Activities */}
{activities.length === 0 ? ( ) : ( activities.map((activity) => { const Icon = activityIcons[activity.type]; const colorClass = activityColors[activity.type] || 'bg-gray-100 text-gray-600'; return (
{/* Icon */}
{Icon ? : null}
{/* Content */}

{activity.title}

{activity.description && (

{activity.description}

)}
{formatTime(activity.occurredAt)}
{/* Metadata */}
{activity.createdBy.name}
{activity.durationMinutes && (
{activity.durationMinutes}m
)} {activity.outcome && (
{activity.outcome.replace(/_/g, ' ')}
)} {activity.isAutomated && (
Auto-tracked
)}
{/* Participants */} {activity.participants && activity.participants.length > 0 && (
With:{' '} {activity.participants .map((p) => p.name) .filter(Boolean) .join(', ')}
)}
); }) )}
{/* Load More */} {hasMore && onLoadMore && (
)}
); }