import {startTransition, useCallback, useEffect, useMemo, useRef, useState} from 'react'; import useFormSubmitSuccess from "../../hooks/useFormSubmitSuccess"; import IntlTelInput, {type IntlTelInputRef} from "intl-tel-input/react"; import isEditMode from "../../utils/isEditMode"; import type {Iso2} from "intl-tel-input/data"; import type {FieldProps} from './Field'; import use from "../../utils/use"; import fetchUtils from "./utils"; import geoIpLookup from "./geoIpLookup"; import {Iti} from 'intl-tel-input'; type TelInputProps = FieldProps & { attrs: Record } const TelInput = (props: TelInputProps) => { const inputRef = useRef(null); const inputRef2 = useRef(null); const [value, setValue] = useState(props.value); const [isValid, setIsValid] = useState(false); const [errorCode, setErrorCode] = useState(null); const [fullPhone, setFullPhone] = useState(''); // Reset after form submit useFormSubmitSuccess(inputRef, () => { setValue(props.value); }, [props.value]); const utilsLib: object = use(fetchUtils()); const geoIpLookupCode: Iso2 = useMemo(() => { if (props.autoCountry) { return use(geoIpLookup()); } return '' as Iso2; }, [props.autoCountry]); const geoIpLookupCallback = useCallback((callback: any) => { if (props.autoCountry && geoIpLookupCode) { return callback(geoIpLookupCode) } return null; }, [geoIpLookupCode, props.autoCountry]); const excludeCountries = useMemo(() => { if (props.autoCountry) { return props.excludeCountries.filter(value1 => { return value1.toLowerCase() !== geoIpLookupCode.toLowerCase(); }); } return props.excludeCountries; }, [geoIpLookupCode, props.autoCountry, props.excludeCountries]); const onlyCountries = useMemo(() => { if (props.autoCountry && props.onlyCountries.length > 0) { const found = props.onlyCountries.some(value1 => { return value1.toLowerCase() === geoIpLookupCode.toLowerCase(); }); if (!found) { props.onlyCountries.push(geoIpLookupCode); } } return props.onlyCountries; }, [geoIpLookupCode, props.autoCountry, props.onlyCountries]); const instance = useRef(null); useEffect(() => { if (!props.fullPhone) { return; } startTransition(() => { if (!instance.current) { instance.current = inputRef2.current?.getInstance(); } if (!instance.current) { return; } setFullPhone(instance.current.getNumber()); }); }, [props.fullPhone, value]); return ( <> { return props.placeholder.replace('{{country}}', selectedCountryPlaceholder) } }), ...(isEditMode && {useFullscreenPopup: false}), ...((props.autoCountry && geoIpLookupCode) && {geoIpLookup: geoIpLookupCallback}), loadUtils: (): Promise<{ default: any }> => Promise.resolve({default: utilsLib}), containerClass: 'hulk-telephone', }} />
); }; export default TelInput;