import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Edit, MapPin, Zap, Building2, Image, Package } from 'lucide-react'; import { type SubmissionItemWithDeps } from '@/lib/submissionItemsService'; import { useIsMobile } from '@/hooks/use-mobile'; import { PhotoSubmissionDisplay } from './PhotoSubmissionDisplay'; import { SubmissionChangesDisplay } from './SubmissionChangesDisplay'; import { ValidationSummary } from './ValidationSummary'; import { useState, useCallback } from 'react'; import { ValidationResult } from '@/lib/entityValidationSchemas'; interface ItemReviewCardProps { item: SubmissionItemWithDeps; onEdit: () => void; onStatusChange: (status: 'approved' | 'rejected') => void; submissionId: string; } export function ItemReviewCard({ item, onEdit, onStatusChange, submissionId }: ItemReviewCardProps) { const isMobile = useIsMobile(); const [validationResult, setValidationResult] = useState(null); const [validationKey, setValidationKey] = useState(0); const handleValidationChange = useCallback((result: ValidationResult) => { setValidationResult(result); }, []); const getItemIcon = () => { switch (item.item_type) { case 'park': return ; case 'ride': return ; case 'manufacturer': case 'operator': case 'property_owner': case 'designer': return ; case 'ride_model': return ; case 'photo': return ; default: return null; } }; const getStatusColor = () => { switch (item.status) { case 'approved': return 'default'; case 'rejected': return 'destructive'; case 'pending': return 'secondary'; default: return 'outline'; } }; const getValidationBadgeVariant = (): "default" | "secondary" | "destructive" | "outline" => { if (!validationResult) return 'outline'; if (validationResult.blockingErrors.length > 0) return 'destructive'; if (validationResult.warnings.length > 0) return 'outline'; return 'secondary'; }; const getValidationBadgeLabel = () => { if (!validationResult) return 'Validating...'; if (validationResult.blockingErrors.length > 0) return '❌ Errors'; if (validationResult.warnings.length > 0) return '⚠️ Warnings'; return '✓ Valid'; }; const renderItemPreview = () => { // Use detailed view for review manager with photo detection return ( ); }; const hasBlockingErrors = validationResult && validationResult.blockingErrors.length > 0; return (
{getItemIcon()} {item.item_type.replace('_', ' ').toUpperCase()} {(item.original_data && Object.keys(item.original_data).length > 0 && ( Moderator Edited )) as React.ReactNode} {hasBlockingErrors && ( Blocked )}
{item.status} {getValidationBadgeLabel()} {item.status === 'pending' && ( )}
{renderItemPreview()} {/* Validation Summary */}
{item.depends_on && (

Depends on another item in this submission

)} {item.rejection_reason && (

Rejection Reason:

{item.rejection_reason}

)}
); }