Files
egovframe-msa-edu/frontend/portal/src/hooks/useUser.ts
2021-10-21 09:03:17 +09:00

50 lines
1.2 KiB
TypeScript

import { useEffect } from 'react'
import useSWR from 'swr'
import axios from 'axios'
import { AUTH_USER_ID } from '@constants/env'
import { loginSerivce } from '@service'
import { userAtom } from '@stores'
import { useSetRecoilState } from 'recoil'
export default function useUser() {
const { data, error, mutate } = useSWR(
`/user-service/api/v1/users`,
async (url: string) => {
let userId = axios.defaults.headers.common[AUTH_USER_ID]
if (!userId) {
await loginSerivce.silentRefresh()
}
userId = axios.defaults.headers.common[AUTH_USER_ID]
if (userId) {
return axios.get(`${url}/${userId}`).then(res => res.data)
} else {
throw new Error('No User')
}
},
{
shouldRetryOnError: false,
},
)
const setUser = useSetRecoilState(userAtom)
useEffect(() => {
if (data) {
setUser(data)
}
}, [data])
const loading = !data && !error
const isLogin = !Boolean(error) && Boolean(data)
const loggedOut =
error && (error.response?.status === 401 || error.response?.status === 403)
return {
user: data,
loading,
isLogin,
error,
mutate,
loggedOut,
}
}