// ============================================================ // CATCH-UP SCHEDULE — CDC catch-up immunization tables from // GET /api/schedule-data. // ============================================================ import { useQuery } from '@tanstack/react-query'; import { api } from '@/lib/api'; interface CatchUpSeries { dose: number | string; minimumAge?: string; minimumIntervalToPrev?: string; notes?: string } interface CatchUpEntry { minimumAgeForDose1?: string; series?: CatchUpSeries[]; catchUpNotes?: string | string[]; } interface ScheduleData { catchUpSchedule: Record; vaccineFullNames: Record; } export default function Catchup() { const { data, isLoading, error } = useQuery({ queryKey: ['schedule-data'], queryFn: () => api.get('/api/schedule-data'), }); if (isLoading) return
Loading…
; if (error) return
{(error as Error).message}
; if (!data) return null; return (

Catch-Up Schedule

CDC 2025 catch-up immunization schedule — minimum ages and intervals per vaccine.

{Object.entries(data.catchUpSchedule).map(([key, v]) => { const fullName = data.vaccineFullNames[key] || key; const notes = v.catchUpNotes ? (Array.isArray(v.catchUpNotes) ? v.catchUpNotes : [v.catchUpNotes]) : []; return (

{fullName}

{v.minimumAgeForDose1 && ( Min age dose 1: {v.minimumAgeForDose1} )}
{v.series && v.series.length > 0 && ( {v.series.map((s) => ( ))}
Dose Min age Min interval from prev Notes
Dose {s.dose} {s.minimumAge || '—'} {s.minimumIntervalToPrev || '—'} {s.notes || ''}
)} {notes.length > 0 && (
    {notes.map((n, i) =>
  • {n}
  • )}
)}
); })}
); }