# 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.');
        }
      }
    });