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

221 lines
6.5 KiB
TypeScript

/**
* 📄 useSearchModalStore
* 검색 모달 Zustand 스토어
*
* - 검색 모달 열기/닫기 및 탭 전환 상태 관리
* - 기본정보 및 유지관리 정보 탭 데이터 필터링 및 조회
* - 테이블 데이터 및 페이지네이션 상태 관리
* - 지역(시도/시군구) 및 날짜 범위 필터링 기능
* - 로딩 상태 및 리셋 플래그 관리
* - Zustand를 통한 중앙 집중식 상태 관리
* - 데이터 변경 감지 및 불필요한 재렌더링 방지
*/
import { create } from "zustand";
export const SEARCH_MODAL_DEFAULT_BASIC_TYPE = "tb_ms_swage_ppl";
export const SEARCH_MODAL_DEFAULT_WORK_TYPE = "['200', '201', '204']";
// 날짜 조합 함수
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<SearchModalState>((set) => ({
isSearchModalOpen: false,
activeTab: "basic",
basicType: SEARCH_MODAL_DEFAULT_BASIC_TYPE,
workType: SEARCH_MODAL_DEFAULT_WORK_TYPE,
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",
ctpvName: "",
sggCd: "0",
sggName: "",
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;