/** * 📄 useReportTabStore * 보고서 탭 Zustand 스토어 * * - 보고서 탭 모달 열기/닫기 상태 관리 * - 보고서 파일 목록 및 트리 구조 상태 관리 * - DC 트리 데이터 조회 및 캐싱 기능 * - DC 파일 목록 조회 및 상태 업데이트 * - Zustand를 통한 중앙 집중식 상태 관리 * - 데이터 변경 감지 및 불필요한 재렌더링 방지 * * 🔗 사용 API * - DC 트리 데이터 조회: GET /dc-service//api/v1/dc/clsf * - DC 파일 목록 조회: GET /dc-service//api/v1/dc/file */ import { type Folder, type ReportDataFile } from '../(map-layout)/map/searchModal/useReportTab'; import { create } from 'zustand'; import { getDcData } from '@/components/lib/api'; interface useReportTabStoreType { isOpen: boolean; files: ReportDataFile[]; dcTree: Folder[]; dcFiles: ReportDataFile[]; setIsOpen: (open: boolean) => void; setFiles: (files: ReportDataFile[]) => void; fetchDcTree: (clsfSystmNm: string) => void; fetchDcFiles: (clsfSystmNm: string) => void; } export const useReportTabStore = create((set, get) => ({ isOpen: false, files: [], dcTree: [], dcFiles: [], setIsOpen: (open: boolean) => set({ isOpen: open }), setFiles: (files: ReportDataFile[]) => set({ files }), fetchDcTree: async (clsfSystmNm: string) => { const { dcTree } = get(); try { const result = await getDcData("/api/v1/clsf?clsfSystmNm=" + clsfSystmNm); if (result && JSON.stringify(result) !== JSON.stringify(dcTree)) set({ dcTree: result }); } catch (error) { console.error('Failed to fetch DC tree:', error); } }, fetchDcFiles: async (clsfSystmNm: string) => { const getDcFiles = async (clsfSystmSn: string): Promise => { if (!clsfSystmSn) { console.error("clsfSystmSn is required to get files."); return []; } const queryString = 'clsfSystmSn=' + clsfSystmSn; const result = await getDcData(`/api/v1/file${queryString ? `?${queryString}` : ''}`); return result; }; const { dcFiles } = get(); try { const result = await getDcFiles(clsfSystmNm); if (result && JSON.stringify(result) !== JSON.stringify(dcFiles)) set({ dcFiles: result }); } catch (error) { console.error('Failed to fetch DC files:', error); } } }));