import { useEffect, useState } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Badge } from '@/components/ui/badge'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Separator } from '@/components/ui/separator'; import { ArrowRight, Plus, Minus, Edit } from 'lucide-react'; import { useEntityVersions } from '@/hooks/useEntityVersions'; import type { EntityType } from '@/types/versioning'; interface VersionComparisonDialogProps { open: boolean; onOpenChange: (open: boolean) => void; entityType: EntityType; entityId: string; fromVersionId: string; toVersionId: string; } interface VersionDiff { [fieldName: string]: { from: unknown; to: unknown; }; } export function VersionComparisonDialog({ open, onOpenChange, entityType, entityId, fromVersionId, toVersionId, }: VersionComparisonDialogProps) { const { versions, compareVersions } = useEntityVersions(entityType, entityId); const [diff, setDiff] = useState(null); const [loading, setLoading] = useState(true); const fromVersion = versions.find(v => v.version_id === fromVersionId); const toVersion = versions.find(v => v.version_id === toVersionId); useEffect(() => { const loadDiff = async () => { if (open && fromVersionId && toVersionId) { setLoading(true); const result = await compareVersions(fromVersionId, toVersionId); setDiff(result as VersionDiff); setLoading(false); } }; loadDiff(); }, [open, fromVersionId, toVersionId, compareVersions]); const formatValue = (value: any): string => { if (value === null || value === undefined) return 'null'; if (typeof value === 'boolean') return value ? 'true' : 'false'; if (typeof value === 'object') return JSON.stringify(value, null, 2); return String(value); }; const formatFieldName = (fieldName: string): string => { return fieldName .split('_') .map(word => word.charAt(0).toUpperCase() + word.slice(1)) .join(' '); }; return ( Compare Versions
Version {fromVersion?.version_number} {new Date(fromVersion?.created_at || '').toLocaleString()}
Version {toVersion?.version_number} {new Date(toVersion?.created_at || '').toLocaleString()}
{loading ? (
) : diff && Object.keys(diff).length > 0 ? (
{Object.entries(diff).map(([fieldName, changes]: [string, any]) => { const isAdded = changes.from === null; const isRemoved = changes.to === null; const isModified = changes.from !== null && changes.to !== null; return (
{isAdded && } {isRemoved && } {isModified && } {formatFieldName(fieldName)} {isAdded ? 'Added' : isRemoved ? 'Removed' : 'Modified'}
{/* From value */}
Before
{formatValue(changes.from)}
{/* To value */}
After
{formatValue(changes.to)}
); })}
) : (

No differences found between these versions

)}
); }