import { atom, atomFamily, DefaultValue, selectorFamily } from 'recoil' /** * 조회조건 상태관리 * key를 기준으로 메뉴별로 사용 */ export type conditionValue = { [key: string]: string | number } export const conditionAtom = atomFamily({ key: 'conditionAtom', default: undefined, }) export const fieldIdsAtom = atom({ key: 'fieldIdsAtom', default: [], }) export const conditionSelector = selectorFamily({ key: 'conditionSelector', get: id => ({ get }) => get(conditionAtom(id)), set: id => ({ set, get }, newValue) => { set(conditionAtom(id), newValue) const ids = get(fieldIdsAtom) if (!ids.includes(id)) { set(fieldIdsAtom, prev => [...prev, id]) } }, }) export const conditionStateSelector = selectorFamily< Record, string[] >({ key: 'conditionStateSelector', get: ids => ({ get }) => { return ids.reduce>((result, id) => { const value = get(conditionAtom(id)) return { ...result, [id]: value, } }, {}) }, set: ids => ({ get, set, reset }, newValue) => { if (newValue instanceof DefaultValue) { reset(fieldIdsAtom) const ids = get(fieldIdsAtom) ids.forEach(id => reset(conditionAtom(id))) } else { set(fieldIdsAtom, Object.keys(newValue)) ids.forEach(id => { set(conditionAtom(id), newValue[id]) }) } }, })