import React, { FC, useState, memo, useCallback, useRef, } from '../../lib/teact/teact'; import { countryList } from '../../util/phoneNumber'; import searchWords from '../../util/searchWords'; import buildClassName from '../../util/buildClassName'; import renderText from '../common/helpers/renderText'; import DropdownMenu from '../ui/DropdownMenu'; import MenuItem from '../ui/MenuItem'; import Spinner from '../ui/Spinner'; import './CountryCodeInput.scss'; import { ANIMATION_END_DELAY } from '../../config'; type OwnProps = { id: string; value?: Country; isLoading?: boolean; onChange: (value: Country) => void; }; const MENU_HIDING_DURATION = 200 + ANIMATION_END_DELAY; const SELECT_TIMEOUT = 50; const CountryCodeInput: FC = ({ id, value, isLoading, onChange, }) => { // eslint-disable-next-line no-null/no-null const inputRef = useRef(null); const [filter, setFilter] = useState(); const [filteredList, setFilteredList] = useState(countryList); function updateFilter(filterValue?: string) { setFilter(filterValue); setFilteredList(getFilteredList(filterValue)); } const handleChange = useCallback((e: React.SyntheticEvent) => { const { countryId } = (e.currentTarget.firstElementChild as HTMLDivElement).dataset; const country = countryList.find((c) => c.id === countryId); if (country) { onChange(country); } setTimeout(() => updateFilter(undefined), MENU_HIDING_DURATION); }, [onChange]); const handleInput = useCallback((e: React.FormEvent) => { updateFilter(e.currentTarget.value); }, []); const handleInputKeyDown = useCallback((e: React.KeyboardEvent) => { if (e.keyCode !== 8) { return; } const target = e.currentTarget; if (value && filter === undefined) { target.value = ''; } updateFilter(target.value); }, [filter, value]); const CodeInput: FC<{ onTrigger: () => void; isOpen?: boolean }> = ({ onTrigger, isOpen }) => { const handleTrigger = () => { if (isOpen) { return; } setTimeout(() => { inputRef.current!.select(); }, SELECT_TIMEOUT); onTrigger(); const formEl = document.getElementById('auth-phone-number-form')!; formEl.scrollTo({ top: formEl.scrollHeight, behavior: 'smooth' }); }; const inputValue = filter !== undefined ? filter : (value && value.name) || ''; return (
{isLoading ? ( ) : ( )}
); }; return ( {filteredList.map((country: Country) => ( {renderText(country.flag, ['hq_emoji'])} {country.name} {country.code} ))} {!filteredList.length && ( No countries matched your filter. )} ); }; function getFilteredList(filter = ''): Country[] { return filter.length ? countryList.filter((country) => searchWords(country.name, filter)) : countryList; } export default memo(CountryCodeInput);