onsitesurvey/src/store/useSuitableStore.ts

118 lines
4.0 KiB
TypeScript

import { create } from 'zustand'
import type { CommCode } from '@/types/CommCode'
import type { SuitableIds } from '@/types/Suitable'
interface SuitableState {
/* 초기 데이터 로드 개수*/
itemPerPage: number
/* 공통코드 */
suitableCommCode: Map<string, CommCode[]>
/* 공통코드 설정 */
setSuitableCommCode: (headCode: string, commCode: CommCode[]) => void
/* 검색 카테고리 */
searchCategory: string
/* 검색 카테고리 설정 */
setSearchCategory: (category: string) => void
/* 검색 카테고리 초기화 */
clearSearchCategory: () => void
/* 검색 키워드 */
searchKeyword: string
/* 검색 키워드 설정 */
setSearchKeyword: (value: string) => void
/* 검색 키워드 초기화 */
clearSearchKeyword: () => void
/* 선택된 아이템 리스트 */
selectedItems: Map<number, Set<number>>
/* 선택 아이템 추가 */
addSelectedItem: (mainId: number, detailId?: number, detailIds?: Set<number>) => void
/* 선택 아이템 전체 추가 */
addAllSelectedItem: (suitableIds: SuitableIds[]) => void
/* 선택 아이템 제거 */
removeSelectedItem: (mainId: number, detailId?: number) => void
/* 선택 아이템 모두 제거 */
clearSelectedItems: () => void
}
export const useSuitableStore = create<SuitableState>((set) => ({
itemPerPage: 100 as number,
suitableCommCode: new Map() as Map<string, CommCode[]>,
searchCategory: '' as string,
searchKeyword: '' as string,
selectedItems: new Map() as Map<number, Set<number>>,
/* 공통코드 설정 */
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<number>) => {
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<number, Set<number>> }),
}))