import React, { useState, useEffect } from 'react' import { CheckIcon, XMarkIcon } from '@heroicons/react/24/outline' import { LanguageInfo } from '../services/api' interface LanguageSelectorProps { selectedLanguages: string[] primaryLanguage?: string onLanguagesChange: (languages: string[], primary?: string) => void maxLanguages?: number disabled?: boolean showPrimarySelector?: boolean className?: string } // Common languages with display names const COMMON_LANGUAGES: LanguageInfo[] = [ { code: 'eng', name: 'English', installed: true }, { code: 'spa', name: 'Spanish', installed: true }, { code: 'fra', name: 'French', installed: true }, { code: 'deu', name: 'German', installed: true }, { code: 'ita', name: 'Italian', installed: true }, { code: 'por', name: 'Portuguese', installed: true }, { code: 'rus', name: 'Russian', installed: true }, { code: 'chi_sim', name: 'Chinese (Simplified)', installed: true }, { code: 'chi_tra', name: 'Chinese (Traditional)', installed: true }, { code: 'jpn', name: 'Japanese', installed: true }, { code: 'kor', name: 'Korean', installed: true }, { code: 'ara', name: 'Arabic', installed: true }, { code: 'hin', name: 'Hindi', installed: true }, { code: 'nld', name: 'Dutch', installed: true }, { code: 'swe', name: 'Swedish', installed: true }, { code: 'nor', name: 'Norwegian', installed: true }, { code: 'dan', name: 'Danish', installed: true }, { code: 'fin', name: 'Finnish', installed: true }, { code: 'pol', name: 'Polish', installed: true }, { code: 'ces', name: 'Czech', installed: true }, { code: 'hun', name: 'Hungarian', installed: true }, { code: 'tur', name: 'Turkish', installed: true }, { code: 'tha', name: 'Thai', installed: true }, { code: 'vie', name: 'Vietnamese', installed: true }, ] function LanguageSelector({ selectedLanguages, primaryLanguage, onLanguagesChange, maxLanguages = 4, disabled = false, showPrimarySelector = true, className = '', }: LanguageSelectorProps) { const [availableLanguages, setAvailableLanguages] = useState(COMMON_LANGUAGES) const [isOpen, setIsOpen] = useState(false) // Auto-set primary language to first selected if not specified const effectivePrimary = primaryLanguage || selectedLanguages[0] || '' const handleLanguageToggle = (languageCode: string) => { if (disabled) return let newLanguages: string[] let newPrimary = effectivePrimary if (selectedLanguages.includes(languageCode)) { // Remove language newLanguages = selectedLanguages.filter(lang => lang !== languageCode) // If removing the primary language, set new primary to first remaining language if (languageCode === effectivePrimary && newLanguages.length > 0) { newPrimary = newLanguages[0] } else if (newLanguages.length === 0) { newPrimary = '' } } else { // Add language (check max limit) if (selectedLanguages.length >= maxLanguages) { return } newLanguages = [...selectedLanguages, languageCode] // If this is the first language, make it primary if (newLanguages.length === 1) { newPrimary = languageCode } } onLanguagesChange(newLanguages, newPrimary) } const handlePrimaryChange = (languageCode: string) => { if (disabled || !selectedLanguages.includes(languageCode)) return onLanguagesChange(selectedLanguages, languageCode) } const removeLanguage = (languageCode: string) => { handleLanguageToggle(languageCode) } const getLanguageName = (code: string) => { const language = availableLanguages.find(lang => lang.code === code) return language?.name || code } return (
{/* Selected Languages Display */}
{selectedLanguages.length > 0 ? (
{selectedLanguages.map((langCode) => ( {getLanguageName(langCode)} {langCode === effectivePrimary && ( (Primary) )} {!disabled && ( )} ))}
) : (
No languages selected. Documents will use default OCR language.
)}
{/* Language Selector Button */} {!disabled && ( )} {/* Dropdown Panel */} {isOpen && !disabled && (
Available Languages
{availableLanguages .filter(lang => lang.installed) .map((language) => { const isSelected = selectedLanguages.includes(language.code) const isPrimary = language.code === effectivePrimary const canSelect = !isSelected && selectedLanguages.length < maxLanguages return (
{/* Primary selector */} {isSelected && showPrimarySelector && selectedLanguages.length > 1 && ( )}
) })}
{selectedLanguages.length >= maxLanguages && (
Maximum {maxLanguages} languages allowed for optimal performance.
)}
)} {/* Help Text */} {selectedLanguages.length > 1 && (

Primary language is processed first for better accuracy. Multiple languages help with mixed-language documents.

)}
) } export default LanguageSelector