All files / src/store atomUp.js

0% Statements 0/20
0% Branches 0/4
0% Functions 0/7
0% Lines 0/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45                                                                                         
import { atom, atomFamily, selector } from 'recoil';
 
// id 값 관리를 위한 Atom
export const idsAtom = atom({
  key: 'idsAtom',
  default: []
});
 
// 개별 Todo 항목을 별도의 Atom으로 관리하기
export const todoAtom = atomFamily({
  key: 'todoAtom',
  default: null
});
 
// 할 일 항목을 목록으로 묶어 조작할 수 있는 선택기
export const todoListSelector = selector({
  key: 'todoListSelector',
  // 현재 할 일 목록 가져오기
  get: ({ get }) => {
    const ids = get(idsAtom);
    return ids.map(id => get(todoAtom(id)));
  },
  // 할 일 목록에 추가 / 완료 / 삭제 작업
  set: ({ set, reset }, { type, id, newItem }) => {
    switch (type) {
      // 새로운 Todo 항목(todoAtom)을 생성한다.
      case 'add' :
       set(todoAtom(newItem.id), newItem);
       set(idsAtom, ids => [...ids, newItem.id]);
       break;
      // 기존 Todo 항목(id가 todoAtom인 Todo 항목)의 isDone 속성을 true로 설정한다.
      case 'done' :
        set(todoAtom(id), todo => ({ ...todo, isDone: true }));
        break;
      // 기존 Todo 항목(id인 todoAtom) 삭제 및
      // id군(idsAtom)에서 해당 id 값을 삭제한다.
      case 'remove' :
        reset(todoAtom(id));
        set(idsAtom, ids => ids.filter(e => e !== id));
        break;
      default :
        throw new Error('Type is invalid.');
    }
  }
});