import { RefObject } from 'react'; import React, { FC, useRef, useEffect, memo, useCallback, } from '../../lib/teact/teact'; import buildClassName from '../../util/buildClassName'; import useFlag from '../../hooks/useFlag'; import useLang from '../../hooks/useLang'; import useInputFocusOnOpen from '../../hooks/useInputFocusOnOpen'; import Loading from './Loading'; import Button from './Button'; import ShowTransition from './ShowTransition'; import './SearchInput.scss'; type OwnProps = { ref?: RefObject; children?: React.ReactNode; parentContainerClassName?: string; className?: string; inputId?: string; value?: string; focused?: boolean; isLoading?: boolean; spinnerColor?: 'yellow'; spinnerBackgroundColor?: 'light'; placeholder?: string; disabled?: boolean; autoComplete?: string; canClose?: boolean; autoFocusSearch?: boolean; onChange: (value: string) => void; onReset?: NoneToVoidFunction; onFocus?: NoneToVoidFunction; onBlur?: NoneToVoidFunction; onSpinnerClick?: NoneToVoidFunction; }; const SearchInput: FC = ({ ref, children, parentContainerClassName, value, inputId, className, focused, isLoading, spinnerColor, spinnerBackgroundColor, placeholder, disabled, autoComplete, canClose, autoFocusSearch, onChange, onReset, onFocus, onBlur, onSpinnerClick, }) => { // eslint-disable-next-line no-null/no-null let inputRef = useRef(null); if (ref) { inputRef = ref; } const [isInputFocused, markInputFocused, unmarkInputFocused] = useFlag(focused); useInputFocusOnOpen(inputRef, autoFocusSearch, unmarkInputFocused); useEffect(() => { if (!inputRef.current) { return; } if (focused) { inputRef.current.focus(); } else { inputRef.current.blur(); } }, [focused, placeholder]); // Trick for setting focus when selecting a contact to search for const lang = useLang(); function handleChange(event: React.ChangeEvent) { const { currentTarget } = event; onChange(currentTarget.value); } function handleFocus() { markInputFocused(); if (onFocus) { onFocus(); } } function handleBlur() { unmarkInputFocused(); if (onBlur) { onBlur(); } } const handleKeyDown = useCallback((e: React.KeyboardEvent) => { if (e.key === 'ArrowDown' || e.key === 'Enter') { const element = document.querySelector(`.${parentContainerClassName} .ListItem-button`) as HTMLElement; if (element) { element.focus(); } } }, [parentContainerClassName]); return (
{children} {!isLoading && (value || canClose) && onReset && ( )}
); }; export default memo(SearchInput);