[React-Query] Login

Hyukยท2023๋…„ 3์›” 28์ผ

reactQuery

๋ชฉ๋ก ๋ณด๊ธฐ
6/6

๐Ÿ“ react qyery๋ฅผ ์ด์šฉํ•œ ๋กœ๊ทธ์ธ ๋ฐ ๋กœ๊ทธ์•„์›ƒ

์˜ˆ์‹œ - react qyery๋ฅผ ์ด์šฉํ•œ ๋กœ๊ทธ์ธ

๐Ÿ“Œ axios (request ์„ค์ • ๋ณด๊ธฐ)

๐Ÿ“Œ PrivateRoute

import React from 'react'
import {useLocation} from 'react-router'
import {Navigate, Outlet} from 'react-router-dom'
import useQuery from 'react-query path'

// ๋กœ๊ทธ์ธ ์—†์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€ URL
export const publicPage = ['/', '/exam']
export const danamicPage = ['/exam/detail'] // /exam/detail/15

function PrivateRoutes() {
  const {user} = useAuthsQuery.useAuth()
  const {pathname, search} = useLocation()
  const from = pathname + search
  const danamicPath = pathname.replace(/\/[\d]+/g, '')

  const isPublicPage = publicPage.includes(pathname)
  const isDynamicPage = danamicPage.includes(danamicPath)

  if (user || isPublicPage || isDynamicPage) {
    return <Outlet />
  }

    return <Navigate to="/login" replace state={{from}} />
}

export default PrivateRoutes

๐Ÿ“Œ PublicRoute

import React from 'react'
import {Navigate, useLocation} from 'react-router'
import {Outlet} from 'react-router-dom'
import useQuery from 'react-query path'

function PublicRoute() {
  const location = useLocation()
  const redirectPath = location.state?.from || '/'
  const {user} = useAuthsQuery.useAuth()

  return user ? <Navigate to={redirectPath} replace /> : <Outlet />
}

export default PublicRoute

๐Ÿ“Œ login

const {signIn} = useAuthsQuery.useAuth()

const formik = useFormik({
  initialValues: {
    email: '',
    password: ''
  },
  validationSchema,
  onSubmit: async ({email, password}) => {
    signIn(email, password)
  }
})

๐Ÿ“Œ logout

const {user, signOut} = useAuthsQuery.useAuth()

const onClickSignout = useCallback(() => signOut(), [])

๐Ÿ“Œ register

const {signUp} = useAuthsQuery.useAuth()

const formik = useFormik({
  initialValues,
  validationSchema,
  onSubmit: async ({email, password, phoneNumber}) => {
    signUp(email, password, phoneNumber)
  }
})

๐Ÿ“Œ react Query

import {useQuery, useQueryClient} from 'react-query'
import {useNavigate} from 'react-router'
import {useToast} from '/toast'
import {publicPage} from '/PrivateRoute'
import {deleteAuth, getAuth, postAuth, postRegister} from '/api/auth'
import {queryKeys} from 'react-query/constants'
import {clearStoredUser, getStoredUser, setStoredUser} from 'react-query/storage'
import {onlyNumberRegExr} from '/reg'

function useAuth() {
  const queryClient = useQueryClient()
  const toast = useToast()
  const navigate = useNavigate()
  const home = publicPage.includes(location.pathname)

  const {data: user} = useQuery([queryKeys.user], () => getAuth(), {
    initialData: getStoredUser,
    refetchOnWindowFocus: !home,
    refetchOnReconnect: !home,
    retry: false,
    onSuccess: (received) => {
      if (received) {
        setStoredUser(true)
      } else {
        clearUser()
      }
    },
    onError: (err) => {
      if (err?.status === 404) {
          clearUser()
    }
    }
  })

  // ๋กœ๊ทธ์ธ
  async function signIn(email, password) {
    try {
      await postAuth({
        email,
        password
      }).then(() => {
        toast.success('๋กœ๊ทธ์ธ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.')
        updateUser(true)
      })
    } catch (e) {
      toast.error('๋กœ๊ทธ์ธ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.')
    }
  }

  // ํšŒ์›๊ฐ€์ž…
  async function signUp(email, password, phone) {
    try {
      await postRegister({
        email,
        phone,
        password
      })

      navigate('/login')
      toast.success('ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต.')
    } catch (e) {
      toast.error('ํšŒ์›๊ฐ€์ž…์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.')
    }
  }

  // ๋กœ๊ทธ์•„์›ƒ
  async function signOut() {
    try {
      await deleteAuth()
      clearUser()
    } catch (e) {
      toast.error('๋กœ๊ทธ์•„์›ƒ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.')
    }
  }

  function updateUser(value) {
    queryClient.setQueryData(queryKeys.user, value)
  }

  function clearUser() {
    queryClient.setQueryData(queryKeys.user, null)
    clearStoredUser()
  }

  return {user, signIn, signUp, signOut}
}

export default {useAuth}

๐Ÿ“Œ storage

const USER_KEY = 'userId'

// helper to get user from localstorage
export function getStoredUser() {
  const storedUser = localStorage.getItem(USER_KEY)
  return storedUser ? storedUser : null
}

export function setStoredUser(value) {
  localStorage.setItem(USER_KEY, value)
}

export function clearStoredUser() {
  localStorage.removeItem(USER_KEY)
}

๐Ÿ‘‰ react query ์˜ต์…˜

queryClient.removeQueries() - ๋ชจ๋“  ์บ์‰ฌ ์ œ๊ฑฐ

profile
frontEnd Developer

0๊ฐœ์˜ ๋Œ“๊ธ€