// SearchInputText.tsx "use client"; import { Input } from "@common/components/ui"; import { useEffect, useRef, useState } from "react"; interface SearchInputTextProps { initValue?: string; setValue: (val: string) => void; setRtnData: (val: { fnm: string; fid: string }) => void; searchList: { fnm: string; fid: string }[]; onEnter?: () => void; className?: string; } export default function SearchInputText({ initValue, setValue, setRtnData, searchList, onEnter, className, }: SearchInputTextProps) { const [showResults, setShowResults] = useState(false); const [text, setText] = useState(initValue ?? ""); const [highlightIndex, setHighlightIndex] = useState(-1); const wrapperRef = useRef(null); useEffect(() => { setText(initValue ?? ""); }, [initValue]); useEffect(() => { if (searchList.length > 0) { setShowResults(true); } else { setShowResults(false); } setHighlightIndex(-1); }, [searchList]); useEffect(() => { function handleClickOutside(event: MouseEvent) { if ( wrapperRef.current && !(wrapperRef.current as any).contains(event.target) ) { setShowResults(false); } } document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, [wrapperRef]); const handleChange = (e: React.ChangeEvent) => { setText(e.target.value); setValue(e.target.value); setHighlightIndex(-1); }; const handleSelect = (item: { fnm: string; fid: string }) => { setText(item.fnm); setValue(item.fnm); setRtnData(item); setShowResults(false); }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") { if (highlightIndex >= 0 && highlightIndex < searchList.length) { const selected = searchList[highlightIndex]; if (selected) handleSelect(selected); } else if (onEnter) { onEnter(); } } else if (e.key === "ArrowDown") { e.preventDefault(); setHighlightIndex((prev) => prev < searchList.length - 1 ? prev + 1 : prev ); } else if (e.key === "ArrowUp") { e.preventDefault(); setHighlightIndex((prev) => (prev > 0 ? prev - 1 : -1)); } }; return (
{showResults && (
{searchList.length > 0 ? ( searchList.map((item, index) => (
handleSelect(item)} > {item.fnm}
)) ) : (
검색 결과가 없습니다.
)}
)}
); }