import { cn } from "~/client/lib/utils"; import { Card } from "~/client/components/ui/card"; import { ByteSize } from "~/client/components/bytes-size"; import { useEffect } from "react"; import type { ListSnapshotsResponse } from "~/client/api-client"; interface Props { snapshots: ListSnapshotsResponse; snapshotId?: string; loading?: boolean; error?: string; onSnapshotSelect: (snapshotId: string) => void; } export const SnapshotTimeline = (props: Props) => { const { snapshots, snapshotId, loading, onSnapshotSelect, error } = props; useEffect(() => { if (!snapshotId && snapshots.length > 0) { onSnapshotSelect(snapshots[snapshots.length - 1].short_id); } }, [snapshotId, snapshots, onSnapshotSelect]); if (error) { return ( Error loading snapshots: {error} ); } if (loading) { return ( Loading snapshots... ); } if (snapshots.length === 0) { return ( No snapshots available ); } return ( {snapshots.map((snapshot, index) => { const date = new Date(snapshot.time); const isSelected = snapshotId === snapshot.short_id; const isLatest = index === snapshots.length - 1; return ( onSnapshotSelect(snapshot.short_id)} className={cn( "shrink-0 flex flex-col items-center gap-2 p-3 rounded-lg transition-all", "border-2 cursor-pointer", { "border-primary bg-primary/10 shadow-md": isSelected, "border-border hover:border-accent hover:bg-accent/5": !isSelected, }, )} > {date.toLocaleDateString("en-US", { month: "short", day: "numeric" })} {date.toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit" })} {isLatest && ( Latest )} ); })} {snapshots.length} snapshots {new Date(snapshots[0].time).toLocaleDateString()} -{" "} {new Date(snapshots.at(-1)?.time ?? 0).toLocaleDateString()} ); };
Error loading snapshots: {error}
Loading snapshots...
No snapshots available