(value: T, delay = 700) {
+ const [v, setV] = useState(value);
+ useEffect(() => {
+ const t = setTimeout(() => setV(value), delay);
+ return () => clearTimeout(t);
+ }, [value, delay]);
+ return v;
+}
+
export default function SearchInputText({label=undefined, setValue=()=>{}, sidoSigun=undefined, fcltyName=undefined} :thisProps) {
const { ProcessFacilityList, searchProcessFacilitySearching } = useFoStore((state) => state);
const [isOpen, setIsOpen] = useState(false);
const [textValue, setTextValue] = useState(fcltyName || '');
+ const debouncedTextValue = useDebouncedValue(textValue);
const wrapperRef = useRef(null);
const processFacilityList = ProcessFacilityList?.processFacilityList || [];
@@ -23,29 +33,51 @@ export default function SearchInputText({label=undefined, setValue=()=>{}, sidoS
setTextValue(value);
if (value) {
setIsOpen(true);
- if(sidoSigun) {
- searchProcessFacilitySearching(1, 4999, 'A', sidoSigun, '0', '0', '0', value);
- } else {
- searchProcessFacilitySearching(1, 4999, '0', '0', '0', '0', '0', value);
- }
+ // 삭제된 기존 코드:
+ // if(sidoSigun) {
+ // searchProcessFacilitySearching(1, 4999, 'A', sidoSigun, '0', '0', '0', value);
+ // } else {
+ // searchProcessFacilitySearching(1, 4999, '0', '0', '0', '0', '0', value);
+ // }
+ // onChange 안에서 바로 검색하면 글자를 입력할 때마다 요청이 발생해서
+ // debounce가 사실상 동작하지 않습니다.
+ // 실제 검색은 아래 debounced useEffect에서만 실행되도록 변경했습니다.
} else {
setIsOpen(false);
}
- }, [searchProcessFacilitySearching, sidoSigun]);
+ }, []);
const onInputFocus = useCallback(() => {
setIsOpen(true);
+ if (textValue.trim()) return;
+
+ // 입력값이 없을 때만 기본 목록을 조회합니다.
+ // 이미 입력 중인 경우에는 기존 값으로 다시 전체/광범위 조회하지 않습니다.
if(sidoSigun) {
searchProcessFacilitySearching(1, 4999, 'A', sidoSigun, '0', '0', '0');
} else {
searchProcessFacilitySearching(1, 4999, '0', '0', '0', '0', '0');
}
- }, [searchProcessFacilitySearching, sidoSigun]);
+ }, [searchProcessFacilitySearching, sidoSigun, textValue]);
useEffect(() => {
setTextValue(fcltyName || '');
}, [fcltyName]);
+ useEffect(() => {
+ const keyword = debouncedTextValue.trim();
+
+ if (!keyword) return;
+
+ // debounce가 적용된 값이 확정된 뒤에만 검색해서
+ // 시설명을 입력하는 도중의 과도한 검색 요청을 막습니다.
+ if(sidoSigun) {
+ searchProcessFacilitySearching(1, 4999, 'A', sidoSigun, '0', '0', '0', keyword);
+ } else {
+ searchProcessFacilitySearching(1, 4999, '0', '0', '0', '0', '0', keyword);
+ }
+ }, [debouncedTextValue, searchProcessFacilitySearching, sidoSigun]);
+
const handleSuggestionClick = useCallback((bscFctCd: string, bscFctNm: string, fctCpc: number | '', trtFrfNm: string | '', efflWqltStndrdNm: string | '') => {
setTextValue(bscFctNm);
setValue(bscFctCd, bscFctNm, fctCpc, trtFrfNm, efflWqltStndrdNm);
@@ -100,4 +132,4 @@ export default function SearchInputText({label=undefined, setValue=()=>{}, sidoS
)}
)
-}
\ No newline at end of file
+}
diff --git a/apps/fo/app/pages/(with-layout)/dashboard/maingraph/page.tsx b/apps/fo/app/pages/(with-layout)/dashboard/maingraph/page.tsx
index 82eeb4d7c..8eddbd098 100644
--- a/apps/fo/app/pages/(with-layout)/dashboard/maingraph/page.tsx
+++ b/apps/fo/app/pages/(with-layout)/dashboard/maingraph/page.tsx
@@ -229,13 +229,6 @@ export default function DashBoardChart({searchYear = '', fcltyList = []}: facili
-
-
-
-
-
-
-
{/* 유입T-N-방류T-N */}
@@ -260,6 +253,14 @@ export default function DashBoardChart({searchYear = '', fcltyList = []}: facili
+ {/* 총인유입T-P-방류T-P */}
+
+
+
+
+
+
+
>
);