import { useState, type ReactElement } from 'react'; import type { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next'; import { useRouter } from 'next/router'; import Link from 'next/link'; import Image from 'next/image'; import { useSession, getCsrfToken, signIn, SessionProvider } from 'next-auth/react'; import { useTranslation, Trans } from 'next-i18next'; import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { errorToast, successToast } from '@components/Toaster'; import { ButtonOutline } from '@components/ButtonOutline'; import Loading from '@components/Loading'; import { Login as SSOLogin } from '@boxyhq/react-ui/sso'; import { adminPortalSSODefaults } from '@lib/env'; const Login = ({ csrfToken, tenant, product, isEmailPasswordEnabled, isMagicLinkEnabled, }: InferGetServerSidePropsType) => { const { t } = useTranslation('common'); const router = useRouter(); const { status } = useSession(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [loading, setLoading] = useState(false); const [authMethod, setAuthMethod] = useState('credentials'); let { callbackUrl } = router.query as { callbackUrl: string }; callbackUrl = callbackUrl || '/admin/sso-connection'; if (status === 'loading') { return ; } if (status === 'authenticated') { router.push(callbackUrl); return; } const onSSOSubmit = async ({ ssoIdentifier }) => { await signIn('boxyhq-saml', undefined, { client_id: ssoIdentifier }); }; // Handle login with email and password const onEmailPasswordLogin = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); setAuthMethod('credentials'); const response = await signIn('credentials', { email, password, redirect: false, callbackUrl, }); setLoading(false); if (!response) { return; } const { error } = response; if (error) { errorToast(error); } }; // Handle login with magic link const onMagicLinkLogin = async (e: React.FormEvent) => { e.preventDefault(); if (!email) { errorToast(t('email_required')); return; } setLoading(true); setAuthMethod('email'); const response = await signIn('email', { email, csrfToken, redirect: false, }); setLoading(false); if (!response) { return; } const { error } = response; if (error) { errorToast(error); } else { successToast(t('login_success_toast')); } }; return ( <>
BoxyHQ logo

{t('boxyhq_admin_portal')}

{t('boxyhq_tagline')}

{(isEmailPasswordEnabled || isMagicLinkEnabled) && (
{isEmailPasswordEnabled && ( <> {t('sign_in')} )}
)} {/* No login methods enabled */} {!isEmailPasswordEnabled && !isMagicLinkEnabled && (
{t('documentation')} ), }} />
)}
{isMagicLinkEnabled && ( {t('send_magic_link')} )}
{t('bui-wku-heading')}
); }; Login.getLayout = function getLayout(page: ReactElement) { return {page}; }; export const getServerSideProps = async (context: GetServerSidePropsContext) => { const { locale }: GetServerSidePropsContext = context; const isMagicLinkEnabled = process.env.NEXTAUTH_ACL ? true : false; const isEmailPasswordEnabled = process.env.NEXTAUTH_ADMIN_CREDENTIALS ? true : false; const { tenant, product } = adminPortalSSODefaults; return { props: { csrfToken: await getCsrfToken(context), tenant, product, isMagicLinkEnabled, isEmailPasswordEnabled, ...(locale ? await serverSideTranslations(locale, ['common']) : {}), }, }; }; export default Login;