import { IconClock, IconRestore, IconTimeline } from "@tabler/icons-react"; import { useState, type ReactNode } from "react"; import type { ResourceVersion } from "../../history/types.js"; import { cn } from "../utils.js"; import { useResourceVersions, useRestoreResourceVersion, } from "./use-history.js"; export interface VersionHistoryPanelProps { resourceType: string; resourceId: string; title?: string; className?: string; limit?: number; emptyState?: ReactNode; renderVersion?: (version: ResourceVersion) => ReactNode; onRestored?: (version: ResourceVersion, result: unknown) => void; } export function VersionHistoryPanel({ resourceType, resourceId, title = "Version history", className, limit = 20, emptyState = "No saved versions yet.", renderVersion, onRestored, }: VersionHistoryPanelProps) { const versions = useResourceVersions({ resourceType, resourceId, limit }); const restore = useRestoreResourceVersion(); const [confirmRestoreId, setConfirmRestoreId] = useState(null); return (

{title}

{versions.isLoading ? (
Loading versions...
) : versions.data?.versions.length ? ( versions.data.versions.map((version) => { const confirming = confirmRestoreId === version.id; return (
{renderVersion ? ( renderVersion(version) ) : ( <>

{version.title ?? `Version ${version.versionNumber}`}

{formatVersionDate(version.createdAt)}
{version.summary ? (

{version.summary}

) : null} )}
{confirming ? ( <> ) : ( )}
); }) ) : (
{emptyState}
)}
); } export function HistoryTimeline({ versions, className, }: { versions: ResourceVersion[]; className?: string; }) { return (
    {versions.map((version) => (
  1. {version.title ?? `Version ${version.versionNumber}`}
    {formatVersionDate(version.createdAt)}
    {version.summary ? (

    {version.summary}

    ) : null}
  2. ))}
); } function formatVersionDate(value: string): string { const date = new Date(value); if (Number.isNaN(date.getTime())) { return value; } return date.toLocaleString(); }