Files
frontend/apps/sn/app/store/useReportTabStore.ts
T

67 lines
2.3 KiB
TypeScript

/**
* 📄 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<useReportTabStoreType>((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/dc/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<ReportDataFile[]> => {
if (!clsfSystmSn) {
console.error("clsfSystmSn is required to get files.");
return [];
}
const queryString = 'clsfSystmSn=' + clsfSystmSn;
const result = await getDcData(`/api/v1/dc/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);
}
}
}));