import React, { useState, useEffect } from "react"; import { X, Loader2, History } from "lucide-react"; import { useTranslation } from "react-i18next"; import { formatDistanceToNow } from "date-fns"; import type { AnnotationItem, EditHistoryItem } from "../../types"; interface EditHistoryModalProps { isOpen: boolean; onClose: () => void; item: AnnotationItem; } export default function EditHistoryModal({ isOpen, onClose, item, }: EditHistoryModalProps) { const { t } = useTranslation(); const [history, setHistory] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { const fetchHistory = async () => { if (!item.uri) return; try { setLoading(true); setError(null); const res = await fetch( `/api/notes/history?uri=${encodeURIComponent(item.uri)}`, ); if (!res.ok) throw new Error("Failed to fetch history"); const data = await res.json(); setHistory(data); } catch (err) { console.error(err); setError(t("editHistory.failedLoad")); } finally { setLoading(false); } }; if (isOpen && item.uri) { fetchHistory(); document.body.style.overflow = "hidden"; } return () => { document.body.style.overflow = "unset"; }; }, [isOpen, item.uri, t]); if (!isOpen) return null; return (
e.stopPropagation()} >

{t("editHistory.title")}

{loading ? (
) : error ? (
{error}
) : history.length === 0 ? (
{t("editHistory.noHistory")}
) : (
{t("editHistory.currentVersion")} {item.editedAt ? t("editHistory.editedAgo", { time: formatDistanceToNow(new Date(item.editedAt)), }) : t("editHistory.postedAgo", { time: formatDistanceToNow(new Date(item.createdAt)), })}
{item.text || item.body?.value}
{history.map((edit, index) => (
{t("editHistory.previousVersion")} {t("editHistory.timeAgo", { time: formatDistanceToNow(new Date(edit.editedAt)), })}
{edit.previousContent}
))}
)}
); }