TIL | 0506 각 경우에 따른 localStorage 저장

🚀·2022년 5월 7일
1

TODO

☑️ 로그인하고 로컬스토리지에 저장하기

로그인페이지를 맡게 되었다. UI는 굉장히 단순했기 때문에 금방 끝낼수 있었지만 각 경우의 수에 따라 로컬스토리지에 저장하는 것에 시간을 많이 쓴 것 같다.

먼저 우리팀은 유저의 닉네임을 받아서 로그인을 하기로 했다. 만약 유저가 닉네임을 입력시에 그 유저의 id가 없다면, 새로운 유저이기 때문에 빈 데이터구조를 만들어주어야 하고, 만약 로컬스토리지 안에 유저의 id가 있다면 기존의 유저이기 때문의 그 유저의 id를 메인페이지로 전달해서 TODO를 불러와야 한다.

위의 설명을 보면 두 가지의 경우이지만 아예 localStorage가 완전히 비어있을 경우까지 고려해야했다. 안그러면 데이터 구조를 map을 돌릴때 에러가 나기 때문에..

따라서 이렇게 작성했다.

  const onClickLoginBtn = () => {
    const item = JSON.parse(localStorage.getItem('todo'))
    const newUser = {
      ...BASIC_DATA,
      userNickName: userName,
      id: `${new Date().getMilliseconds()}${userName}`,
      isLogined: true,
    }

    try {
      // 로컬스토리지가 완전히 비었을 때 (가장 최초의 회원)
      if (item === null) {
        localStorage.setItem('todo', JSON.stringify([newUser]))
        navigate('/', { state: { userId: `${new Date().getMilliseconds()}${userName}`, isNewUser: true } })
      } 
      // localStorage에 유저의 이름이 있을 때 (기존 회원)
      else if (item.map((el) => el.userNickName).includes(userName)) {
        const loginUser = item.find((el) => el.userNickName === userName)
        navigate('/', { state: { userId: loginUser.id, isNewUser: false } })
      } 
      // localStorage에 유저의 이름이 없을 때 (신규 회원)
      else {
        localStorage.setItem('todo', JSON.stringify([...item, newUser]))
        navigate('/', { state: { userId: `${new Date().getMilliseconds()}${userName}`, isNewUser: true } })
      }
    } catch (e) {
      console.log(e)
    }
  }

가독성이 매우 안좋은 것 같은데 어떻게 리팩토링을 해야할까...

0개의 댓글