118 lines
4.0 KiB
TypeScript
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>> }),
|
|
}))
|