import { useEffect, useState } from 'react'; import { AlertCircle, CheckCircle, Info, AlertTriangle } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; import { validateEntityData, ValidationResult } from '@/lib/entityValidationSchemas'; interface ValidationSummaryProps { item: { item_type: string; item_data: any; id?: string; }; onValidationChange?: (result: ValidationResult) => void; compact?: boolean; } export function ValidationSummary({ item, onValidationChange, compact = false }: ValidationSummaryProps) { const [validationResult, setValidationResult] = useState(null); const [isLoading, setIsLoading] = useState(true); const [isExpanded, setIsExpanded] = useState(false); useEffect(() => { async function validate() { setIsLoading(true); try { const result = await validateEntityData( item.item_type as any, { ...item.item_data, id: item.id } ); setValidationResult(result); onValidationChange?.(result); } catch (error) { console.error('Validation error:', error); setValidationResult({ isValid: false, blockingErrors: [{ field: 'validation', message: 'Failed to validate', severity: 'blocking' }], warnings: [], suggestions: [], allErrors: [{ field: 'validation', message: 'Failed to validate', severity: 'blocking' }], }); } finally { setIsLoading(false); } } validate(); }, [item.item_type, item.item_data, item.id, onValidationChange]); if (isLoading) { return (
Validating...
); } if (!validationResult) { return null; } const hasBlockingErrors = validationResult.blockingErrors.length > 0; const hasWarnings = validationResult.warnings.length > 0; const hasSuggestions = validationResult.suggestions.length > 0; const hasAnyIssues = hasBlockingErrors || hasWarnings || hasSuggestions; // Compact view (for queue items) if (compact) { return (
{validationResult.isValid && !hasWarnings && !hasSuggestions && ( Valid )} {hasBlockingErrors && ( {validationResult.blockingErrors.length} Error{validationResult.blockingErrors.length !== 1 ? 's' : ''} )} {hasWarnings && !hasBlockingErrors && ( {validationResult.warnings.length} Warning{validationResult.warnings.length !== 1 ? 's' : ''} )} {hasSuggestions && !hasBlockingErrors && !hasWarnings && ( {validationResult.suggestions.length} Suggestion{validationResult.suggestions.length !== 1 ? 's' : ''} )}
); } // Detailed view (for review manager) return (
{/* Summary Badge */}
{validationResult.isValid && !hasWarnings && !hasSuggestions && ( All Valid )} {hasBlockingErrors && ( {validationResult.blockingErrors.length} Blocking Error{validationResult.blockingErrors.length !== 1 ? 's' : ''} )} {hasWarnings && ( {validationResult.warnings.length} Warning{validationResult.warnings.length !== 1 ? 's' : ''} )} {hasSuggestions && ( {validationResult.suggestions.length} Suggestion{validationResult.suggestions.length !== 1 ? 's' : ''} )}
{/* Detailed Issues */} {hasAnyIssues && ( {isExpanded ? 'Hide' : 'Show'} validation details {/* Blocking Errors */} {hasBlockingErrors && ( Blocking Errors {validationResult.blockingErrors.map((error, index) => (
{error.field}: {error.message}
))}
)} {/* Warnings */} {hasWarnings && ( Warnings {validationResult.warnings.map((warning, index) => (
{warning.field}: {warning.message}
))}
)} {/* Suggestions */} {hasSuggestions && ( Suggestions {validationResult.suggestions.map((suggestion, index) => (
{suggestion.field}: {suggestion.message}
))}
)}
)}
); }