Files
modeling-app/src/Auth.tsx

37 lines
1.0 KiB
TypeScript
Raw Normal View History

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'
import Loading from './components/Loading'
import { paths } from './Router'
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) => ({
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
useEffect(() => {
if (
(isTauri() && !token) ||
(!isTauri() && !isLoading && !(user && 'id' in user))
) {
navigate(paths.SIGN_IN)
}
}, [user, token, navigate, isLoading])
return isLoading ? <Loading /> : <>{children}</>
}