import { useState, useEffect } from 'react'; import { Badge } from '@/components/ui/badge'; import { Skeleton } from '@/components/ui/skeleton'; import { FieldDiff, ImageDiff, LocationDiff } from './FieldComparison'; import { PhotoAdditionPreview, PhotoEditPreview, PhotoDeletionPreview } from './PhotoComparison'; import { detectChanges, type ChangesSummary } from '@/lib/submissionChangeDetection'; import type { SubmissionItemData } from '@/types/submissions'; import type { SubmissionItemWithDeps } from '@/lib/submissionItemsService'; import { Building2, Train, MapPin, Building, User, ImageIcon, Trash2, Edit, Plus, AlertTriangle } from 'lucide-react'; interface SubmissionChangesDisplayProps { item: SubmissionItemData | SubmissionItemWithDeps | { item_data?: any; original_data?: any; item_type: string }; view?: 'summary' | 'detailed'; showImages?: boolean; submissionId?: string; } // Helper to determine change magnitude function getChangeMagnitude(totalChanges: number, hasImages: boolean, action: string) { if (action === 'delete') return { label: 'Deletion', variant: 'destructive' as const, icon: AlertTriangle }; if (action === 'create') return { label: 'New', variant: 'default' as const, icon: Plus }; if (hasImages) return { label: 'Major', variant: 'default' as const, icon: Edit }; if (totalChanges >= 5) return { label: 'Major', variant: 'default' as const, icon: Edit }; if (totalChanges >= 3) return { label: 'Moderate', variant: 'secondary' as const, icon: Edit }; return { label: 'Minor', variant: 'outline' as const, icon: Edit }; } export function SubmissionChangesDisplay({ item, view = 'summary', showImages = true, submissionId }: SubmissionChangesDisplayProps) { const [changes, setChanges] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const loadChanges = async () => { setLoading(true); const detectedChanges = await detectChanges(item, submissionId); setChanges(detectedChanges); setLoading(false); }; loadChanges(); }, [item, submissionId]); if (loading || !changes) { return ; } // Get appropriate icon for entity type const getEntityIcon = () => { const iconClass = "h-4 w-4"; switch (item.item_type) { case 'park': return ; case 'ride': return ; case 'ride_model': return ; case 'manufacturer': case 'operator': case 'property_owner': case 'designer': return ; case 'photo': case 'photo_edit': case 'photo_delete': return ; default: return ; } }; // Get action badge const getActionBadge = () => { switch (changes.action) { case 'create': return New; case 'edit': return Edit; case 'delete': return Delete; } }; const magnitude = getChangeMagnitude( changes.totalChanges, changes.imageChanges.length > 0, changes.action ); if (view === 'summary') { return (
{getEntityIcon()} {changes.entityName} {getActionBadge()} {changes.action === 'edit' && ( {magnitude.label} Change )}
{changes.action === 'edit' && changes.totalChanges > 0 && (
{changes.fieldChanges.slice(0, 5).map((change, idx) => ( ))} {changes.imageChanges.map((change, idx) => ( ))} {changes.photoChanges.map((change, idx) => { if (change.type === 'added' && change.photos) { return ; } if (change.type === 'edited' && change.photo) { return ; } if (change.type === 'deleted' && change.photo) { return ; } return null; })} {changes.hasLocationChange && ( Location )} {changes.totalChanges > 5 && ( +{changes.totalChanges - 5} more )}
)} {changes.action === 'create' && item.item_data?.description && (
{item.item_data.description}
)} {changes.action === 'delete' && (
Marked for deletion
)}
); } // Detailed view return (
{getEntityIcon()}

{changes.entityName}

{getActionBadge()}
{changes.action === 'create' && (
Creating new {item.item_type}
)} {changes.action === 'delete' && (
This {item.item_type} will be deleted
)} {changes.action === 'edit' && changes.totalChanges > 0 && ( <> {changes.fieldChanges.length > 0 && (

Field Changes ({changes.fieldChanges.length})

{changes.fieldChanges.map((change, idx) => ( ))}
)} {showImages && changes.imageChanges.length > 0 && (

Image Changes

{changes.imageChanges.map((change, idx) => ( ))}
)} {showImages && changes.photoChanges.length > 0 && (

Photo Changes

{changes.photoChanges.map((change, idx) => { if (change.type === 'added' && change.photos) { return ; } if (change.type === 'edited' && change.photo) { return ; } if (change.type === 'deleted' && change.photo) { return ; } return null; })}
)} {changes.hasLocationChange && (

Location Change

)} )} {changes.action === 'edit' && changes.totalChanges === 0 && (
No changes detected
)}
); }