import { useEffect, useState } from "react"; import { generalverificationApiService } from '@/entities/statistics/api/general-verification-service'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@common/components"; type OperatorItem = { opertSn: string; opertSymbl: string; opertKornNm: string; }; // opertSeCd 별 operators 목록을 전역 캐싱해서, 수식 블록이 여러 개여도 중복 요청이 발생하지 않게 한다. const operatorsCache: Map< string, OperatorItem[] | Promise > = new Map(); interface OperatorsComponentsProps { cmprOpert?: string | null; onValueChange?: (value: string) => void; placeholder?: string; opertSeCd?: string; } const OperatorsComponents = ({ cmprOpert, onValueChange, placeholder = "연산자 없음", opertSeCd = "opertSeCd=CMPR" }: OperatorsComponentsProps) => { const [operators, setOperators] = useState([]); const [localValue, setLocalValue] = useState(cmprOpert ?? ""); useEffect(() => { setLocalValue(cmprOpert ?? ""); }, [cmprOpert]); useEffect(() => { const cached = operatorsCache.get(opertSeCd); if (Array.isArray(cached)) { setOperators(cached); return; } const promise = cached ?? (async (): Promise => { const response = await generalverificationApiService.getVrfcOperators( opertSeCd, ); if (response.status === "success" && response.data) { return response.data as OperatorItem[]; } return []; })(); operatorsCache.set(opertSeCd, promise); void promise.then((items) => { operatorsCache.set(opertSeCd, items); setOperators(items); }); }, [opertSeCd]); // onValueChange가 있으면 부모가 제어(controlled), 없으면 내부 state로 표시 const isControlled = onValueChange !== undefined; const value = (isControlled ? (cmprOpert ?? "") : localValue) || ""; return ( ); }; export default OperatorsComponents;