import { create } from 'zustand' import type { CommCode } from '@/types/CommCode' import type { SuitableIds } from '@/types/Suitable' interface SuitableState { /* 초기 데이터 로드 개수*/ itemPerPage: number /* 공통코드 */ suitableCommCode: Map /* 공통코드 설정 */ setSuitableCommCode: (headCode: string, commCode: CommCode[]) => void /* 검색 카테고리 */ searchCategory: string /* 검색 카테고리 설정 */ setSearchCategory: (category: string) => void /* 검색 카테고리 초기화 */ clearSearchCategory: () => void /* 검색 키워드 */ searchKeyword: string /* 검색 키워드 설정 */ setSearchKeyword: (value: string) => void /* 검색 키워드 초기화 */ clearSearchKeyword: () => void /* 선택된 아이템 리스트 */ selectedItems: Map> /* 선택 아이템 추가 */ addSelectedItem: (mainId: number, detailId?: number, detailIds?: Set) => void /* 선택 아이템 전체 추가 */ addAllSelectedItem: (suitableIds: SuitableIds[]) => void /* 선택 아이템 제거 */ removeSelectedItem: (mainId: number, detailId?: number) => void /* 선택 아이템 모두 제거 */ clearSelectedItems: () => void } export const useSuitableStore = create((set) => ({ itemPerPage: 100 as number, suitableCommCode: new Map() as Map, searchCategory: '' as string, searchKeyword: '' as string, selectedItems: new Map() as Map>, /* 공통코드 설정 */ setSuitableCommCode: (headCode: string, commCode: CommCode[]) => set((state) => ({ suitableCommCode: new Map(state.suitableCommCode).set(headCode, commCode), })), /* 검색 카테고리 설정 */ setSearchCategory: (category: string) => set({ searchCategory: category }), /* 검색 카테고리 초기화 */ clearSearchCategory: () => set({ searchCategory: '' }), /* 검색 키워드 설정 */ setSearchKeyword: (value: string) => set({ searchKeyword: value }), /* 검색 키워드 초기화 */ clearSearchKeyword: () => set({ searchKeyword: '' }), /* 선택 아이템 추가 */ addSelectedItem: (mainId: number, detailId?: number, detailIds?: Set) => { if (detailId) { /* 디테일(하위) 아이템 추가 */ set((state) => { const detailSet = state.selectedItems.get(mainId) || new Set() detailSet.add(detailId) state.selectedItems.set(mainId, detailSet) return { selectedItems: state.selectedItems } }) } else { /* 메인(상위) 아이템 추가 */ set((state) => { state.selectedItems.set(mainId, detailIds || new Set()) return { selectedItems: state.selectedItems } }) } }, /* 선택 아이템 전체 추가 */ addAllSelectedItem: (suitableIds: SuitableIds[]) => { set(() => { const newSelectedItems = new Map() suitableIds.forEach((suitableId) => { newSelectedItems.set(suitableId.id, new Set(suitableId.detailId?.split(',').map(Number))) }) return { selectedItems: newSelectedItems } }) }, /* 선택 아이템 제거 */ removeSelectedItem: (mainId: number, detailId?: number) => { set((state) => { const newSelectedItems = new Map(state.selectedItems) if (!detailId) { /* 메인(상위) 아이템 제거 */ newSelectedItems.delete(mainId) return { selectedItems: newSelectedItems } } /* 디테일(하위) 아이템 제거 */ const detailSet = state.selectedItems.get(mainId) || new Set() detailSet.delete(detailId) /* 디테일(하위)하위 아이템이 모두 제거되면 메인 아이템도 제거 */ detailSet.size === 0 ? newSelectedItems.delete(mainId) : newSelectedItems.set(mainId, detailSet) return { selectedItems: newSelectedItems } }) }, /* 선택 아이템 모두 제거 */ clearSelectedItems: () => set({ selectedItems: new Map() as Map> }), }))