import { Box, InputAdornment, ListItem, ListItemIcon, ListItemText, Menu, MenuItem, TextField, } from '@mui/material'; import { useMemo, useRef, useState, type RefObject } from 'react'; import { ArrowDown2 } from 'iconsax-react'; import ReactCountryFlag from 'react-country-flag'; import { useTranslation } from 'react-i18next'; import { countries, type Country } from '../../../data/countries'; import type { CountryCode } from '@/types/commonTypes'; import { Icon } from '@rkheftan/harmony-ui'; import { LTRTypography } from '@/components/common/LTRTypography'; import { Virtuoso } from 'react-virtuoso'; interface CountryCodeSelectorProps { show: boolean; value: CountryCode; onChange: (newValue: CountryCode) => void; menuAnchor: HTMLElement | null; onCloseFocusRef: RefObject; disabled?: boolean; } export function CountryCodeSelector({ show, value, onChange, menuAnchor, onCloseFocusRef, disabled = false, }: CountryCodeSelectorProps) { const [anchorEl, setAnchorEl] = useState(null); const [searchTerm, setSearchTerm] = useState(''); const open = Boolean(anchorEl); const searchInputRef = useRef(null); const menuWidth = menuAnchor ? menuAnchor.clientWidth : 'auto'; const { t } = useTranslation(['country', 'common']); const selectedCountry = countries.find((c) => c.phone === value) || countries[0]; const handleClick = () => { if (disabled) return; setAnchorEl(menuAnchor); }; const handleClose = () => { setTimeout(() => setAnchorEl(null), 0); setTimeout(() => { onCloseFocusRef.current?.focus(); }, 100); setSearchTerm(''); }; const handleSelect = (country: Country) => { onChange(country.phone); handleClose(); }; const handleMenuEntered = () => { searchInputRef.current?.focus(); }; const filteredCountries = useMemo( () => countries.filter( (country) => t(country.label, { ns: 'country' }) .toLowerCase() .includes(searchTerm.toLowerCase()) || country.label.toLowerCase().includes(searchTerm.toLowerCase()) || country.phone.includes(searchTerm), ), [searchTerm, t], ); const initialIndex = Math.max( 0, filteredCountries.findIndex((c) => c.phone === value), ); return ( theme.transitions.create(['width', 'opacity'], { duration: theme.transitions.duration.standard, }), overflow: 'hidden', whiteSpace: 'nowrap', height: '100%', display: 'flex', alignItems: 'center', flexDirection: 'row-reverse', gap: 0.25, pl: show ? 0.25 : 0, '&:hover': { cursor: disabled ? 'default' : 'pointer', }, }} > {/* This inner Box prevents the content from being squeezed during the transition */} {value} setSearchTerm(e.target.value)} /> {filteredCountries.length === 0 ? ( {t('messages.noResualtFound', { ns: 'common' })} ) : ( ( handleSelect(country)} > {country.phone} )} computeItemKey={(_, c) => c.code} /> )} ); }