import React, { useState, useEffect } from 'react'; import { FormControl, InputLabel, Select, MenuItem, Typography, Box, Chip, CircularProgress, Alert, SelectChangeEvent, } from '@mui/material'; import { Language as LanguageIcon } from '@mui/icons-material'; import { useTranslation } from 'react-i18next'; import { ocrService, LanguageInfo } from '../../services/api'; interface OcrLanguageSelectorProps { value?: string; onChange: (language: string) => void; label?: string; size?: 'small' | 'medium'; fullWidth?: boolean; disabled?: boolean; showCurrentIndicator?: boolean; required?: boolean; helperText?: string; } const OcrLanguageSelector: React.FC = ({ value = '', onChange, label = 'OCR Language', size = 'medium', fullWidth = true, disabled = false, showCurrentIndicator = true, required = false, helperText, }) => { const { t } = useTranslation(); const [languages, setLanguages] = useState([]); const [currentUserLanguage, setCurrentUserLanguage] = useState('eng'); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); useEffect(() => { fetchLanguages(); }, []); const fetchLanguages = async () => { try { setLoading(true); setError(''); const response = await ocrService.getAvailableLanguages(); setLanguages(response.data.available_languages); setCurrentUserLanguage(response.data.current_user_language); // If no value is set, default to user's current language if (!value) { onChange(response.data.current_user_language); } } catch (err: any) { setError(err.response?.data?.message || 'Failed to load OCR languages'); // Fallback to English if API fails setLanguages([ { code: 'eng', name: 'English', installed: true } ]); if (!value) { onChange('eng'); } } finally { setLoading(false); } }; const handleChange = (event: SelectChangeEvent) => { onChange(event.target.value); }; const getLanguageDisplay = (langCode: string) => { const language = languages.find(lang => lang.code === langCode); return language ? language.name : langCode; }; if (loading) { return ( {label} {t('ocr.languageSelector.loading')} ); } if (error) { return ( {t('ocr.languageSelector.retry')} } > {error} {label} ); } return ( {label} {helperText && ( {helperText} )} {showCurrentIndicator && languages.length > 0 && ( {t('ocr.languageSelector.languagesAvailable', { count: languages.length, plural: languages.length !== 1 ? 's' : '' })} {value && value !== currentUserLanguage && ( • {t('ocr.languageSelector.selectingWillUpdate', { language: getLanguageDisplay(value) })} )} )} ); }; export default OcrLanguageSelector;