import React, { useState, useEffect } from 'react'; import { Card, CardContent, Typography, Button, Box, Alert, LinearProgress, Chip, Stack, Divider, Tooltip, IconButton, } from '@mui/material'; import { Lightbulb as LightbulbIcon, Refresh as RefreshIcon, TrendingUp as TrendingUpIcon, Info as InfoIcon, } from '@mui/icons-material'; import { documentService, OcrRetryRecommendation, BulkOcrRetryResponse } from '../services/api'; interface RetryRecommendationsProps { onRetrySuccess?: (result: BulkOcrRetryResponse) => void; onRetryClick?: (recommendation: OcrRetryRecommendation) => void; } export const RetryRecommendations: React.FC = ({ onRetrySuccess, onRetryClick, }) => { const [recommendations, setRecommendations] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [retryingRecommendation, setRetryingRecommendation] = useState(null); const loadRecommendations = async () => { setLoading(true); setError(null); try { const response = await documentService.getRetryRecommendations(); setRecommendations(response.data.recommendations); } catch (err: any) { setError(err.response?.data?.message || 'Failed to load retry recommendations'); } finally { setLoading(false); } }; useEffect(() => { loadRecommendations(); }, []); const handleRetryRecommendation = async (recommendation: OcrRetryRecommendation) => { if (onRetryClick) { onRetryClick(recommendation); return; } setRetryingRecommendation(recommendation.reason); try { const response = await documentService.bulkRetryOcr({ mode: 'filter', filter: recommendation.filter, preview_only: false, }); if (onRetrySuccess) { onRetrySuccess(response.data); } // Reload recommendations after successful retry loadRecommendations(); } catch (err: any) { setError(err.response?.data?.message || 'Failed to execute retry'); } finally { setRetryingRecommendation(null); } }; const getSuccessRateColor = (rate: number) => { if (rate >= 0.7) return 'success'; if (rate >= 0.4) return 'warning'; return 'error'; }; const getSuccessRateLabel = (rate: number) => { const percentage = Math.round(rate * 100); if (percentage >= 70) return `${percentage}% (High)`; if (percentage >= 40) return `${percentage}% (Medium)`; return `${percentage}% (Low)`; }; if (loading && (!recommendations || recommendations.length === 0)) { return ( Retry Recommendations Analyzing failure patterns... ); } return ( Retry Recommendations {error && ( {error} )} {(!recommendations || recommendations.length === 0) && !loading ? ( No retry recommendations available. This usually means:
  • All failed documents have already been retried multiple times
  • No clear patterns in failure reasons that suggest likely success
  • No documents with failure types that commonly succeed on retry
) : ( {(recommendations || []).map((recommendation, index) => ( {recommendation.title} } label={getSuccessRateLabel(recommendation.estimated_success_rate)} color={getSuccessRateColor(recommendation.estimated_success_rate) as any} size="small" /> {recommendation.description} {recommendation.document_count} documents Pattern: {recommendation.reason.replace(/_/g, ' ')} {/* Filter Summary */} Criteria: {recommendation.filter.failure_reasons?.map((reason) => ( ))} {recommendation.filter.mime_types?.map((type) => ( ))} {recommendation.filter.max_file_size && ( )} ))} )} {loading && recommendations && recommendations.length > 0 && ( )}
); };