import { useSession, getCsrfToken, getProviders } from 'next-auth/client' import LoadingIcon from './loading.svg?include' import InlineSvg from '@hashicorp/react-inline-svg' import styles from './auth-gate.module.css' import Button from '@hashicorp/react-button' import { useEffect, useState } from 'react' import { useRouter } from 'next/router' import SigninErrorPage from 'components/signin-error-page' export default function AuthGate({ children }) { const [session, loading] = useSession() const { query } = useRouter() if (query?.error === 'oAuthCallback') return if (loading) return return session ? ( <>{children} ) : (
) } function SignInForm() { const [token, setToken] = useState(null) useEffect(() => { async function getToken() { const t = await getCsrfToken() if (t) { setToken(t) } } getToken() }, [token]) return token ? (
) : null } function Form({ callbackUrl, token }) { const authProviders = useAuthProviders() return (
{authProviders && Object.keys(authProviders).map((ap) => (
) } export function useAuthProviders() { const [authProviders, setAuthProviders] = useState([]) async function getProviderList() { const providers = await getProviders() if (providers) { setAuthProviders(providers) } } useEffect(() => { if (typeof window !== 'undefined') { getProviderList() } }, []) return authProviders }