import { useState, useEffect, useRef } from 'react' const AutoComplete = ({ languages, onComplete }) => { const [isOpen, setIsOpen] = useState(false) const [searchTerm, setSearchTerm] = useState('') const [selectedLanguage, setSelectedLanguage] = useState(null) const [filteredLanguages, setFilteredLanguages] = useState([]) const dropdownRef = useRef(null) const inputRef = useRef(null) useEffect(() => { if (!languages) return // Most spoken languages (by number of speakers) - you can adjust this list const mostSpokenCodes = [ 'en', 'zh', 'hi', 'es', 'ar', 'bn', 'pt', 'ru', 'ja', 'pa', 'de', 'jv', 'ko', 'fr', 'te', 'mr', 'tr', 'ta', 'vi', 'ur' ] if (searchTerm.trim() === '') { // Show most spoken languages first, then others const mostSpoken = mostSpokenCodes .map(code => languages.find(lang => lang.bcp_47 === code)) .filter(Boolean) const others = languages .filter(lang => !mostSpokenCodes.includes(lang.bcp_47)) .sort((a, b) => a.language_name.localeCompare(b.language_name)) setFilteredLanguages([...mostSpoken, ...others]) } else { const query = searchTerm.toLowerCase() const matches = languages.filter( language => language.language_name.toLowerCase().includes(query) || language.autonym.toLowerCase().includes(query) || language.bcp_47.toLowerCase().includes(query) ) setFilteredLanguages(matches) } }, [searchTerm, languages]) useEffect(() => { const handleClickOutside = event => { if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { setIsOpen(false) setSearchTerm('') } } document.addEventListener('mousedown', handleClickOutside) return () => document.removeEventListener('mousedown', handleClickOutside) }, []) const handleSelect = language => { setSelectedLanguage(language) setIsOpen(false) setSearchTerm('') onComplete([language]) } const handleClear = e => { e.stopPropagation() setSelectedLanguage(null) onComplete([]) } const handleContainerClick = () => { setIsOpen(true) if (!selectedLanguage) { setTimeout(() => inputRef.current?.focus(), 100) } } const handleInputChange = e => { // If user starts typing while a language is selected, clear the selection to enable search if (selectedLanguage && e.target.value.length > 0) { setSelectedLanguage(null) onComplete([]) } setSearchTerm(e.target.value) } const handleKeyDown = e => { if (e.key === 'Escape') { setIsOpen(false) setSearchTerm('') } } const containerStyle = { position: 'relative', display: 'inline-block', minWidth: '400px', maxWidth: '600px' } const buttonStyle = { color: selectedLanguage ? '#333' : '#666', border: '1px solid #ddd', padding: '0.75rem 1rem', borderRadius: '4px', fontSize: '0.95rem', backgroundColor: '#fff', cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'space-between', width: '100%', minHeight: '44px', transition: 'border-color 0.2s ease, box-shadow 0.2s ease' } const inputStyle = { border: 'none', outline: 'none', fontSize: '0.95rem', width: '100%', backgroundColor: 'transparent', color: '#333' } const dropdownStyle = { position: 'absolute', top: '100%', left: 0, right: 0, backgroundColor: '#fff', border: '1px solid #ddd', borderTop: 'none', borderRadius: '0 0 4px 4px', maxHeight: '300px', overflowY: 'auto', zIndex: 1000, boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)' } const itemStyle = { padding: '0.75rem 1rem', cursor: 'pointer', borderBottom: '1px solid #f0f0f0', display: 'flex', justifyContent: 'space-between', alignItems: 'center', transition: 'background-color 0.2s ease' } const clearButtonStyle = { background: 'none', border: 'none', color: '#999', cursor: 'pointer', padding: '0.25rem', borderRadius: '50%', display: 'flex', alignItems: 'center', justifyContent: 'center', width: '20px', height: '20px', fontSize: '14px', marginLeft: '0.5rem' } return (