**
들어가기
1. front에서 모든 page에서 공통적으로 자주 사용하게 될, useUser hook을 만든다.
로그인된 사람의 정보를 확인하는 hook,
export function cls(...classnames: string[]) {
return classnames.join(' ')
}
front에서 A ? B : C
에서 UI에서 A는 공통적으로 들어가고, 조건에 따라 B, C가 적용되는
tailwindCss 적용되는 hook
loggedInUser를 확인하는 hook
useSWR을 이용함.
import { useRouter } from 'next/router'
import { useEffect, useState } from 'react'
import useSWR from 'swr' ///useSWR import하는 부분
export default function useUser() {
const { data, error } = useSWR('/api/users/me')
///api주소로 fetch해서 data와 error를 받아옴
///argument로 url과 fetcher 함수 두개를 받아야 되는데,
///fetcher 함수는 모든 useSWR에 공통적으로 사용되어서 pages/_app.tsx에 널어줌.
const router = useRouter()
useEffect(() => {
if (data && !data.ok) {
router.replace('/enter')
}
}, [data, router])
///router를 이용해서 data가 있지만, ok가 없으면 login 페이지로 보냄.
///[data, router]부분 명심해서 봐 둘것.
return { user: data?.profile, isLoading: !data && !error }
///useSWR을 이용해서 받은 data를 user에 담아서return 시킴.
///isLoading이라는 prop도 같이 보내줌.
----->여기서부터는 useSWR을 사용하지 않을 경우 처리방식!!
// const [user, setUser] = useState()
// useEffect(() => {
// fetch('/api/users/me')
// .then((response) => response.json())
// .then((data) => {
// if (!data.ok) {
// return router.replace('/enter')
// }
// setUser(data.profile)
// })
// }, [router])
}
import '../styles/globals.css'
import type { AppProps } from 'next/app'
import { SWRConfig } from 'swr' ///swr로부터 SWRCONFIG를 import함.
function MyApp({ Component, pageProps }: AppProps) {
return (
///맨 상단에 SWRConfig로 묶어주고, value에 fetcher함수를 넣어줌.
///fetcher함수는 아래 모양으로 일정함.
<SWRConfig
value={{
refreshInterval:2000, ///2초마다 refresh하게 하는 option
fetcher: (url: string) =>
fetch(url).then((response) => response.json()),
}}
>
<div className="w-full max-w-lg mx-auto">
<Component {...pageProps} />
</div>
</SWRConfig>
)
}
export default MyApp
notice!!!
useSWR은 진짜 좋은 component이기 떄문에, 잘 봐두자!!!!