"use client"; import React, { useState, useEffect } from "react"; import type { KnowledgeEntryVersionWithAuthor } from "@mosaic/shared"; import { fetchVersions, fetchVersion, restoreVersion } from "@/lib/api/knowledge"; interface VersionHistoryProps { slug: string; onRestore?: () => void; } /** * Version History Component * Displays version history timeline for a knowledge entry * Allows viewing and restoring previous versions */ export function VersionHistory({ slug, onRestore }: VersionHistoryProps): React.JSX.Element { const [versions, setVersions] = useState([]); const [selectedVersion, setSelectedVersion] = useState( null ); const [isLoading, setIsLoading] = useState(true); const [isRestoring, setIsRestoring] = useState(false); const [error, setError] = useState(null); const [page, setPage] = useState(1); const [totalPages, setTotalPages] = useState(1); // Load versions useEffect(() => { async function loadVersions(): Promise { try { setIsLoading(true); setError(null); const response = await fetchVersions(slug, page, 20); setVersions([...response.data]); setTotalPages(response.totalPages); } catch (err) { setError(err instanceof Error ? err.message : "Failed to load version history"); } finally { setIsLoading(false); } } void loadVersions(); }, [slug, page]); // Load specific version for preview const handleViewVersion = async (version: number): Promise => { try { setError(null); const versionData = await fetchVersion(slug, version); setSelectedVersion(versionData); } catch (err) { setError(err instanceof Error ? err.message : "Failed to load version"); } }; // Restore a version const handleRestore = async (version: number): Promise => { if ( !confirm( `Are you sure you want to restore version ${version.toString()}? This will create a new version with the content from version ${version.toString()}.` ) ) { return; } try { setIsRestoring(true); setError(null); await restoreVersion(slug, version, { changeNote: `Restored from version ${String(version)}`, }); setSelectedVersion(null); setPage(1); // Reload first page to see new version if (onRestore) { onRestore(); } } catch (err) { setError(err instanceof Error ? err.message : "Failed to restore version"); } finally { setIsRestoring(false); } }; const formatDate = (date: Date): string => { return new Date(date).toLocaleString("en-US", { year: "numeric", month: "short", day: "numeric", hour: "2-digit", minute: "2-digit", }); }; if (isLoading && versions.length === 0) { return (
); } return (
{error && (

{error}

)} {versions.length === 0 ? (

No version history available

) : ( <> {/* Version Timeline */}
{versions.map((version, index) => (
Version {version.version} {index === 0 && ( Current )}

{version.author.name} ({version.author.email})

{formatDate(version.createdAt)}

{version.changeNote && (

"{version.changeNote}"

)}

{version.title}

{index !== 0 && ( )}
{/* Version Preview */} {selectedVersion?.id === version.id && (

Content Preview

                        {selectedVersion.content}
                      
)}
))}
{/* Pagination */} {totalPages > 1 && (
Page {page} of {totalPages}
)} )}
); }