import React, { useCallback, useEffect, useRef, useState } from "react"; type SearchType = { bscFctNm: string; bscFctCd: string; }; type thisProps = { label: string | undefined; initValue: string | undefined; setValue: (searchNm?: string) => void; setRtnData: (rtnData: any) => void; searchList?: SearchType[]; }; export default function SearchInputText({ label = undefined, initValue = undefined, setValue = () => {}, setRtnData = () => {}, searchList = [], }: thisProps) { const [isOpen, setIsOpen] = useState(false); const [textValue, setTextValue] = useState(initValue || ""); const [highlightIndex, setHighlightIndex] = useState(-1); const wrapperRef = useRef(null); const handleInputChange = useCallback( (e: React.ChangeEvent) => { const value = e.target.value; setTextValue(value); setValue(value); setHighlightIndex(-1); setIsOpen(value !== ""); }, [setValue] ); const handleSuggestionClick = useCallback( (searchNm: string) => { setValue(searchNm); setTextValue(searchNm); setIsOpen(false); setRtnData(searchList?.find((item) => item.bscFctNm === searchNm) || {}); }, [searchList, setRtnData, setValue] ); const handleKeyDown = useCallback( (e: React.KeyboardEvent) => { if (!isOpen || searchList.length === 0) return; if (e.key === "ArrowDown") { e.preventDefault(); setHighlightIndex((prev) => (prev + 1) % searchList.length); } else if (e.key === "ArrowUp") { e.preventDefault(); setHighlightIndex((prev) => prev <= 0 ? searchList.length - 1 : prev - 1 ); } else if (e.key === "Enter") { e.preventDefault(); if (searchList.length === 1 && searchList[0]) { handleSuggestionClick(searchList[0].bscFctNm); } else if (highlightIndex >= 0 && highlightIndex < searchList.length && searchList[highlightIndex]) { handleSuggestionClick(searchList[highlightIndex].bscFctNm); } } }, [highlightIndex, isOpen, searchList, handleSuggestionClick] ); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( wrapperRef.current && !wrapperRef.current.contains(event.target as Node) ) { setIsOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, []); return (
{ setTextValue(""); setValue(""); setIsOpen(false); }} /> {isOpen && (
{searchList.length > 0 ? ( searchList.map((item, index) => (
handleSuggestionClick(item.bscFctNm)} role="button" tabIndex={0} onKeyDown={(e) => { if (e.key === "Enter" || e.key === " ") { handleSuggestionClick(item.bscFctNm); } }} > {item.bscFctNm}
)) ) : (
검색 결과가 없습니다.
)}
)}
); }