import { create } from "zustand"; // 날짜 조합 함수 const getDateString = ( year: string, month: string, day: string, defaultDate: string, ) => { if (!year && !month && !day) return defaultDate; const y = year || defaultDate.slice(0, 4); const m = month || defaultDate.slice(4, 6); const d = day || defaultDate.slice(6, 8); return `${y}${m}${d}`; }; // 오늘 날짜 계산 const today = new Date(); const todayYear = today.getFullYear().toString(); const todayMonth = (today.getMonth() + 1).toString().padStart(2, "0"); const todayDate = today.getDate().toString().padStart(2, "0"); export interface SearchModalState { // 모달 열림 상태 isSearchModalOpen: boolean; // 탭 관련 activeTab: string; basicType: string; workType: string; // 최초 렌더 방지 플래그 showTable: boolean; // 테이블 데이터 tableData: any[]; detailTableData: any[]; tableCount: number; detailTableCount: number; // 페이지네이션 curPage: number; detailCurPage: number; // 로딩 상태 isLoading: boolean; isDetailLoading: boolean; // 리셋 플래그 isResetPage: boolean; isResetDetailPage: boolean; isResetSelection: boolean; isResetDetailSelection: boolean; // 사업 ID detailBizId: number; // 지역 필터 ctpvCd: string; ctpvName: string; sggCd: string; sggName: string; // 범위 필터 start1: string; start2: string; end1: string; end2: string; // 변수 필터 var1: string; var2: string; // 연도 필터 yearFilter: { start: string; end: string }; // 날짜 관련 today: Date; todayYear: string; todayMonth: string; todayDate: string; // setters setIsSearchModalOpen: (open: boolean) => void; setActiveTab: (tab: string) => void; setBasicType: (type: string) => void; setWorkType: (type: string) => void; setShowTable: (show: boolean) => void; setTableData: (data: any[]) => void; setDetailTableData: (data: any[]) => void; setTableCount: (count: number) => void; setDetailTableCount: (count: number) => void; setCurPage: (page: number) => void; setDetailCurPage: (page: number) => void; setIsLoading: (loading: boolean) => void; setIsDetailLoading: (loading: boolean) => void; setIsResetPage: (reset: boolean) => void; setIsResetDetailPage: (reset: boolean) => void; setIsResetSelection: (reset: boolean) => void; setIsResetDetailSelection: (reset: boolean) => void; setDetailBizId: (id: number) => void; setCtpvCd: (cd: string) => void; setCtpvName: (name: string) => void; setSggCd: (cd: string) => void; setSggName: (name: string) => void; setStart1: (val: string) => void; setStart2: (val: string) => void; setEnd1: (val: string) => void; setEnd2: (val: string) => void; setVar1: (val: string) => void; setVar2: (val: string) => void; setYearFilter: (filter: { start: string; end: string }) => void; getDateString: (year: string, month: string, day: string, defaultDate: string) => string; resetFilters: () => void; // 초기화 액션 } const useSearchModalStore = create((set) => ({ isSearchModalOpen: false, activeTab: "basic", basicType: "tb_ms_swage_ppl", workType: "['200', '201', '204']", showTable: false, tableData: [], detailTableData: [], tableCount: 0, detailTableCount: 0, curPage: 1, detailCurPage: 1, isLoading: false, isDetailLoading: false, isResetPage: false, isResetDetailPage: false, isResetSelection: false, isResetDetailSelection: false, detailBizId: 0, ctpvCd: "0", ctpvName: "", sggCd: "0", sggName: "", start1: "", start2: "", end1: "", end2: "", var1: "", var2: "", yearFilter: { start: "", end: "" }, today, todayYear, todayMonth, todayDate, setIsSearchModalOpen: (isSearchModalOpen) => set({ isSearchModalOpen }), setActiveTab: (tab) => set({ activeTab: tab }), setBasicType: (type) => set({ basicType: type }), setWorkType: (type) => set({ workType: type }), setShowTable: (show) => set({ showTable: show }), setTableData: (data) => set({ tableData: data }), setDetailTableData: (data) => set({ detailTableData: data }), setTableCount: (count) => set({ tableCount: count }), setDetailTableCount: (count) => set({ detailTableCount: count }), setCurPage: (page) => set({ curPage: page }), setDetailCurPage: (page) => set({ detailCurPage: page }), setIsLoading: (loading) => set({ isLoading: loading }), setIsDetailLoading: (loading) => set({ isDetailLoading: loading }), setIsResetPage: (reset) => set({ isResetPage: reset }), setIsResetDetailPage: (reset) => set({ isResetDetailPage: reset }), setIsResetSelection: (reset) => set({ isResetSelection: reset }), setIsResetDetailSelection: (reset) => set({ isResetDetailSelection: reset }), setDetailBizId: (id) => set({ detailBizId: id }), setCtpvCd: (cd) => set({ ctpvCd: cd }), setCtpvName: (name) => set({ ctpvName: name }), setSggCd: (cd) => set({ sggCd: cd }), setSggName: (name) => set({ sggName: name }), setStart1: (val) => set({ start1: val }), setStart2: (val) => set({ start2: val }), setEnd1: (val) => set({ end1: val }), setEnd2: (val) => set({ end2: val }), setVar1: (val) => set({ var1: val }), setVar2: (val) => set({ var2: val }), setYearFilter: (filter) => set({ yearFilter: filter }), getDateString: getDateString, // 초기화 액션 resetFilters: () => set({ showTable: false, start1: "", start2: "", end1: "", end2: "", var1: "", var2: "", ctpvCd: "0", sggCd: "0", yearFilter: { start: "", end: "" }, tableData: [], detailTableData: [], tableCount: 0, detailTableCount: 0, curPage: 1, detailCurPage: 1, isResetPage: true, isResetDetailPage: true, isResetSelection: true, isResetDetailSelection: true, detailBizId: 0, }), })); export default useSearchModalStore;