import React, { useEffect, useState } from 'react'; import { Phone, MapPin, Loader2 } from 'lucide-react'; import { apiFetch } from '@/lib/api'; function formatWhen(iso) { if (!iso) return ''; const d = new Date(iso); if (Number.isNaN(d.getTime())) return ''; return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit', }); } /** * Chronological Call/Visit activity feed. Self-fetching — pass `endpoint` (the GET URL) and bump * `refreshKey` after logging a new activity elsewhere to re-fetch. */ export default function ActivityTimeline({ endpoint, refreshKey, heading = 'Activity timeline', className }) { const [activities, setActivities] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { if (!endpoint) return; let cancelled = false; setLoading(true); (async () => { try { const res = await apiFetch(endpoint); if (!res.ok) return; const data = await res.json(); if (!cancelled) setActivities(data.activities || []); } catch (e) { console.error(e); } finally { if (!cancelled) setLoading(false); } })(); return () => { cancelled = true; }; }, [endpoint, refreshKey]); if (!endpoint) return null; return (

{heading}

{loading ? (
Loading…
) : activities.length === 0 ? (

No calls or visits logged yet.

) : ( )}
); }