import { useState } from 'react'; import { Clock, GitBranch, User, FileText, RotateCcw, GitCompare } from 'lucide-react'; import { formatDistanceToNow } from 'date-fns'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Separator } from '@/components/ui/separator'; import { ScrollArea } from '@/components/ui/scroll-area'; import { VersionComparisonDialog } from './VersionComparisonDialog'; import { RollbackDialog } from './RollbackDialog'; import { useEntityVersions } from '@/hooks/useEntityVersions'; import { useUserRole } from '@/hooks/useUserRole'; import type { EntityType } from '@/types/versioning'; interface EntityVersionHistoryProps { entityType: EntityType; entityId: string; entityName: string; } const changeTypeColors = { created: 'bg-green-500/10 text-green-700 dark:text-green-400', updated: 'bg-blue-500/10 text-blue-700 dark:text-blue-400', deleted: 'bg-red-500/10 text-red-700 dark:text-red-400', restored: 'bg-purple-500/10 text-purple-700 dark:text-purple-400', archived: 'bg-gray-500/10 text-gray-700 dark:text-gray-400', }; export function EntityVersionHistory({ entityType, entityId, entityName }: EntityVersionHistoryProps) { const { versions, loading, rollbackToVersion } = useEntityVersions(entityType, entityId); const { isModerator } = useUserRole(); const [selectedVersions, setSelectedVersions] = useState([]); const [compareDialogOpen, setCompareDialogOpen] = useState(false); const [rollbackDialogOpen, setRollbackDialogOpen] = useState(false); const [selectedVersionForRollback, setSelectedVersionForRollback] = useState(null); const handleVersionSelect = (versionId: string) => { setSelectedVersions(prev => { if (prev.includes(versionId)) { return prev.filter(id => id !== versionId); } if (prev.length >= 2) { return [prev[1], versionId]; } return [...prev, versionId]; }); }; const handleCompare = () => { if (selectedVersions.length === 2) { setCompareDialogOpen(true); } }; const handleRollback = (versionId: string) => { setSelectedVersionForRollback(versionId); setRollbackDialogOpen(true); }; if (loading) { return (
); } if (versions.length === 0) { return (

No version history available

); } return (
{/* Header Actions */}

Version History

{versions.length} versions

{selectedVersions.length === 2 && ( )}
{/* Timeline */}
{/* Timeline line */}
{versions.map((version, index) => ( handleVersionSelect(version.version_id)} > {/* Timeline dot */}
{/* Header */}
{version.change_type} Version {version.version_number} {version.is_current && ( Current )}
{!version.is_current && isModerator() && ( )}
{/* Metadata */}
{version.profiles?.display_name || version.profiles?.username || 'Unknown'}
{formatDistanceToNow(new Date(version.created_at), { addSuffix: true })}
{version.submission_id && (
Submission
)}
{/* Change Reason */} {version.change_reason && ( <>

{version.change_reason}

)}
))}
{/* Dialogs */} {selectedVersions.length === 2 && ( )} {selectedVersionForRollback && ( { await rollbackToVersion(selectedVersionForRollback, reason); setRollbackDialogOpen(false); setSelectedVersionForRollback(null); }} /> )}
); }