/** * ArchiveBrowser — Browsable list of saved plan decisions * * Reusable in both standalone archive mode and as a sidebar tab * during normal plan review sessions. */ import React from "react"; import type { ArchivedPlan } from "@plannotator/core/storage-types"; export type { ArchivedPlan }; interface ArchiveBrowserProps { plans: ArchivedPlan[]; selectedFile: string | null; onSelect: (filename: string) => void; isLoading: boolean; } function relativeTime(dateStr: string): string { if (!dateStr) return ""; const now = Date.now(); const then = new Date(dateStr + "T12:00:00").getTime(); const diff = now - then; if (diff < 86_400_000) return "today"; if (diff < 172_800_000) return "yesterday"; if (diff < 604_800_000) return `${Math.floor(diff / 86_400_000)}d ago`; if (diff < 2_592_000_000) return `${Math.floor(diff / 604_800_000)}w ago`; return dateStr; } export const ArchiveBrowser: React.FC = ({ plans, selectedFile, onSelect, isLoading, }) => { if (isLoading) { return (
Loading archive...
); } if (plans.length === 0) { return (
No archived plans found.
); } return (
{plans.map((plan, i) => { const showDateHeader = i === 0 || plan.date !== plans[i - 1].date; const isSelected = selectedFile === plan.filename; return ( {showDateHeader && (
{relativeTime(plan.date)} — {plan.date}
)}
); })}
); };