'use client'; import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; import { api } from '@/lib/api'; import { authClient, signIn } from '@/lib/auth-client'; import type { SsoProviderDiscovery } from '@/lib/sso'; import { SsoProviderButtons } from '@/components/auth/sso-provider-buttons'; export default function LoginPage(): React.ReactElement { const router = useRouter(); const [error, setError] = useState(null); const [loading, setLoading] = useState(false); const [ssoProviders, setSsoProviders] = useState([]); const [ssoLoadingProviderId, setSsoLoadingProviderId] = useState< SsoProviderDiscovery['id'] | null >(null); useEffect(() => { api('/api/sso/providers') .catch(() => [] as SsoProviderDiscovery[]) .then((providers) => setSsoProviders(providers.filter((provider) => provider.configured))); }, []); async function handleSubmit(e: React.FormEvent): Promise { e.preventDefault(); setError(null); setLoading(true); const form = new FormData(e.currentTarget); const email = form.get('email') as string; const password = form.get('password') as string; const result = await signIn.email({ email, password }); if (result.error) { setError(result.error.message ?? 'Sign in failed'); setLoading(false); return; } router.push('/chat'); } async function handleSsoSignIn(providerId: SsoProviderDiscovery['id']): Promise { setError(null); setSsoLoadingProviderId(providerId); try { const result = await authClient.signIn.oauth2({ providerId, callbackURL: '/chat', newUserCallbackURL: '/chat', }); if (result.error) { setError(result.error.message ?? `Sign in with ${providerId} failed`); setSsoLoadingProviderId(null); } } catch (err: unknown) { setError(err instanceof Error ? err.message : `Sign in with ${providerId} failed`); setSsoLoadingProviderId(null); } } return (

Sign in

Sign in to your Mosaic account

{error && (
{error}
)}
{ void handleSsoSignIn(providerId); }} />

Don't have an account?{' '} Sign up

); }