"use client"; import { useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; import type { WikiRevision } from "@/payload-types"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { restoreWikiRevision } from "@/app/(frontend)/wiki/actions"; export interface WikiRevisionSummary { readonly id: number; readonly revisionNumber: number; readonly titleSnapshot: string; readonly editorName: string; readonly summary: string; readonly type: WikiRevision["type"]; readonly restoredFromRevision: number | null; readonly createdAt: string; } interface RevisionListProps { readonly pageId: number; readonly slug: string; readonly revisions: readonly WikiRevisionSummary[]; readonly isModerator: boolean; } const REVISION_TYPE_META: Record = { create: { label: "Create", className: "border-emerald-500/40 text-emerald-400", }, edit: { label: "Edit", className: "border-blue-500/40 text-blue-400", }, restore: { label: "Restore", className: "border-amber-500/40 text-amber-400", }, }; function timeAgo(iso: string): string { const diff = Math.max(0, Date.now() - new Date(iso).getTime()); const minutes = Math.floor(diff / 60000); if (minutes < 1) return "just now"; if (minutes < 60) return `${minutes}m ago`; const hours = Math.floor(minutes / 60); if (hours < 24) return `${hours}h ago`; const days = Math.floor(hours / 24); return `${days}d ago`; } export function RevisionList({ pageId, slug, revisions, isModerator }: RevisionListProps) { const router = useRouter(); const [restoring, setRestoring] = useState(null); async function handleRestore(revisionNumber: number) { setRestoring(revisionNumber); const result = await restoreWikiRevision({ id: pageId, revisionNumber }); setRestoring(null); if (!result.success) { toast.error(result.error ?? "Could not restore the revision."); return; } toast.success(`Restored revision ${revisionNumber}`); router.refresh(); } if (revisions.length === 0) { return (

No revisions recorded yet.

); } return (
{revisions.map((revision) => { const typeMeta = REVISION_TYPE_META[revision.type]; return (
Revision {revision.revisionNumber} {typeMeta.label} {revision.restoredFromRevision !== null && ( from revision {revision.restoredFromRevision} )}

{revision.titleSnapshot}

{revision.summary || "No summary provided."}

Edited by {revision.editorName}
{isModerator && ( )}
); })}
); }