"use client"; /** * Page history popover (topbar): lists page versions (usePageVersions data * passed in) and restores a chosen version after an explicit confirm * (destructive: the current state is replaced). */ import { useState } from "react"; import { Camera, Clock, RotateCcw } from "lucide-react"; import { useQueryClient } from "@tanstack/react-query"; import { pageApi, isApiError } from "@/lib/api"; import { formatRelativeTime } from "@/lib/utils"; import { toast } from "@/stores/ui-store"; import { ConfirmDialog } from "@/components/ui/confirm-dialog"; import type { PageVersion } from "@/lib/types"; export interface HistoryPopoverProps { versions: PageVersion[]; isLoading: boolean; pageId: string; onClose: () => void; /** T-150/T-151: open the compare/preview dialog for a version. */ onCompare?: (v: PageVersion) => void; /** T-192: true for EDIT-capable users — the "Snapshot now" button (TASK-0043 * criterion 5) renders only for them (VIEW users get the read-only list). */ canEdit?: boolean; } export function HistoryPopover({ versions, isLoading, pageId, onClose, onCompare, canEdit }: HistoryPopoverProps) { const [target, setTarget] = useState(null); const [restoring, setRestoring] = useState(false); const [snapping, setSnapping] = useState(false); const qc = useQueryClient(); // TASK-0043: the only Phase-3 way to create a version (auto-snapshot on // block edits is deferred to Phase 4). Invalidates the versions list so the // new row appears without a full panel re-fetch. const takeSnapshot = async () => { if (snapping) return; setSnapping(true); try { await pageApi.snapshotVersion(pageId); qc.invalidateQueries({ queryKey: ["pages", pageId, "versions"] }); toast("success", "Snapshot captured"); } catch (err) { toast("error", "Snapshot failed", isApiError(err) ? err.message : err instanceof Error ? err.message : String(err)); } finally { setSnapping(false); } }; const doRestore = async () => { if (!target) return; setRestoring(true); try { await pageApi.restoreVersion(pageId, target.id); toast("success", "Version restored", `Restored to ${target.createdAt}`); setTarget(null); onClose(); } catch (err) { toast("error", "Restore failed", err instanceof Error ? err.message : undefined); } finally { setRestoring(false); } }; return ( <>

Page history

{canEdit ? ( ) : null}
{isLoading ? (

Loading…

) : versions.length === 0 ? (

No versions yet — take a snapshot.

) : ( )}
void doRestore()} onClose={() => setTarget(null)} /> ); }