import { SearchOutlined } from "@ant-design/icons"; import { AutoComplete, Input } from "antd"; import useMergedState from "rc-util/es/hooks/useMergedState"; import React, { useRef } from "react"; import classNames from "classnames"; import styles from "./index.less"; const HeaderSearch = (props) => { const { className, defaultValue, onVisibleChange, placeholder, visible, defaultVisible, ...restProps } = props; const inputRef = useRef(null); const [value, setValue] = useMergedState(defaultValue, { value: props.value, onChange: props.onChange, }); const [searchMode, setSearchMode] = useMergedState(defaultVisible ?? false, { value: props.visible, onChange: onVisibleChange, }); const inputClass = classNames(styles.input, { [styles.show]: searchMode, }); return ( <div className={classNames(className, styles.headerSearch)} onClick={() => { setSearchMode(true); if (searchMode && inputRef.current) { inputRef.current.focus(); } }} onTransitionEnd={({ propertyName }) => { if (propertyName === "width" && !searchMode) { if (onVisibleChange) { onVisibleChange(searchMode); } } }} > <SearchOutlined key="Icon" style={{ cursor: "pointer", }} /> <AutoComplete key="AutoComplete" className={inputClass} value={value} options={restProps.options} onChange={setValue} > <Input size="small" ref={inputRef} defaultValue={defaultValue} aria-label={placeholder} placeholder={placeholder} onKeyDown={(e) => { if (e.key === "Enter") { if (restProps.onSearch) { restProps.onSearch(value); } } }} onBlur={() => { setSearchMode(false); }} /> </AutoComplete> </div> ); }; export default HeaderSearch;