50 lines
1.2 KiB
TypeScript
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,
|
|
}
|
|
}
|