import { skipGuideSchema, type SkipGuide } from "@/lib/schemas"; import { cn } from "@/lib/utils"; const recommendationStyles = { recommended: "bg-red-400/15 text-red-200 border-red-400/25", optional: "bg-amber-400/15 text-amber-200 border-amber-400/25", do_not_skip: "bg-slate-400/15 text-slate-200 border-slate-400/25", }; const recommendationLabels = { recommended: "Recommended skip", optional: "Optional skip", do_not_skip: "Do not skip", }; function parseTimestamp(value: string): number { const hours = value.match(/(\d+)\s*h/i); const minutes = value.match(/(\d+)\s*m/i); return (hours ? Number(hours[1]) * 60 : 0) + (minutes ? Number(minutes[1]) : 0); } export function SkipGuideView({ data }: { data: unknown }) { const result = skipGuideSchema.safeParse(data); if (!result.success) { return (
Could not display this insight (data format issue). Try another card or refresh later.
); } const parsed = result.data as SkipGuide; const maxMinutes = Math.max( ...parsed.segments.map((segment) => parseTimestamp(segment.end)), 120, ); return (

Content timeline

{parsed.segments.map((segment, index) => { const start = parseTimestamp(segment.start); const end = parseTimestamp(segment.end); const left = (start / maxMinutes) * 100; const width = Math.max(((end - start) / maxMinutes) * 100, 1.5); return (
); })}
0:00 {Math.floor(maxMinutes / 60)}h {maxMinutes % 60}m
{parsed.segments.map((segment, index) => (
{segment.start} – {segment.end} {recommendationLabels[segment.skipRecommendation]} Plot impact: {segment.plotImpact.replace("_", " ")}

{segment.reason}

Resume hint:{" "} {segment.resumeHint}

))}

{parsed.disclaimer}

); } function Stat({ label, value }: { label: string; value: string }) { return (

{label}

{value}

); }