2023-03-06 18:18:01 +11:00
|
|
|
import useSWR from 'swr'
|
|
|
|
import fetcher from './lib/fetcher'
|
|
|
|
import withBaseUrl from './lib/withBaseURL'
|
2023-07-27 18:59:40 -04:00
|
|
|
import { User, useStore } from './useStore'
|
|
|
|
import { useNavigate } from 'react-router-dom'
|
|
|
|
import { useEffect } from 'react'
|
|
|
|
import { isTauri } from './lib/isTauri'
|
2023-08-09 15:41:41 -04:00
|
|
|
import Loading from './components/Loading'
|
2023-08-10 13:30:32 -04:00
|
|
|
import { paths } from './Router'
|
2023-07-13 07:22:08 -04:00
|
|
|
|
2023-07-27 18:59:40 -04:00
|
|
|
// Wrapper around protected routes, used in src/Router.tsx
|
|
|
|
export const Auth = ({ children }: React.PropsWithChildren) => {
|
|
|
|
const { data: user, isLoading } = useSWR<
|
|
|
|
User | Partial<{ error_code: string }>
|
|
|
|
>(withBaseUrl('/user'), fetcher)
|
|
|
|
const { token, setUser } = useStore((s) => ({
|
2023-07-25 10:40:26 -04:00
|
|
|
token: s.token,
|
2023-07-27 18:59:40 -04:00
|
|
|
setUser: s.setUser,
|
2023-07-11 20:34:09 +10:00
|
|
|
}))
|
2023-07-27 18:59:40 -04:00
|
|
|
const navigate = useNavigate()
|
2023-07-11 20:34:09 +10:00
|
|
|
|
2023-07-27 18:59:40 -04:00
|
|
|
useEffect(() => {
|
|
|
|
if (user && 'id' in user) setUser(user)
|
|
|
|
}, [user, setUser])
|
2023-07-11 20:34:09 +10:00
|
|
|
|
2023-08-08 09:06:14 +10:00
|
|
|
useEffect(() => {
|
|
|
|
if (
|
|
|
|
(isTauri() && !token) ||
|
|
|
|
(!isTauri() && !isLoading && !(user && 'id' in user))
|
|
|
|
) {
|
2023-08-10 13:30:32 -04:00
|
|
|
navigate(paths.SIGN_IN)
|
2023-08-08 09:06:14 +10:00
|
|
|
}
|
|
|
|
}, [user, token, navigate, isLoading])
|
2023-03-06 18:18:01 +11:00
|
|
|
|
2023-08-09 15:41:41 -04:00
|
|
|
return isLoading ? <Loading /> : <>{children}</>
|
2023-03-06 18:18:01 +11:00
|
|
|
}
|