'use client' import { type KeyboardEvent, useState } from 'react' import { cn, Input, Label } from '@sim/emcn' import { createLogger } from '@sim/logger' import { useRouter } from 'next/navigation' import { ApiClientError } from '@/lib/api/client/errors' import { requestJson } from '@/lib/api/client/request' import { chatSSOContract } from '@/lib/api/contracts/chats' import { quickValidateEmail } from '@/lib/messaging/email/validation' import { AuthSubmitButton } from '@/app/(auth)/components' const logger = createLogger('SSOAuth') interface SSOAuthProps { identifier: string } const validateEmailField = (emailValue: string): string[] => { const errors: string[] = [] if (!emailValue || !emailValue.trim()) { errors.push('Email is required.') return errors } const validation = quickValidateEmail(emailValue.trim().toLowerCase()) if (!validation.isValid) { errors.push(validation.reason || 'Please enter a valid email address.') } return errors } export default function SSOAuth({ identifier }: SSOAuthProps) { const router = useRouter() const [email, setEmail] = useState('') const [emailErrors, setEmailErrors] = useState([]) const [showEmailValidationError, setShowEmailValidationError] = useState(false) const [isLoading, setIsLoading] = useState(false) const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Enter') { e.preventDefault() handleAuthenticate() } } const handleEmailChange = (e: React.ChangeEvent) => { const newEmail = e.target.value setEmail(newEmail) setShowEmailValidationError(false) setEmailErrors([]) } const handleAuthenticate = async () => { const emailValidationErrors = validateEmailField(email) setEmailErrors(emailValidationErrors) setShowEmailValidationError(emailValidationErrors.length > 0) if (emailValidationErrors.length > 0) { return } setIsLoading(true) try { const { eligible } = await requestJson(chatSSOContract, { params: { identifier }, body: { email }, }) if (!eligible) { setEmailErrors(['Email not authorized for this chat']) setShowEmailValidationError(true) setIsLoading(false) return } const callbackUrl = `/chat/${identifier}` const ssoUrl = `/sso?email=${encodeURIComponent(email)}&callbackUrl=${encodeURIComponent(callbackUrl)}` router.push(ssoUrl) } catch (error) { if (error instanceof ApiClientError) { setEmailErrors([error.message || 'Email not authorized for this chat']) setShowEmailValidationError(true) setIsLoading(false) return } logger.error('SSO authentication error:', error) setEmailErrors(['An error occurred during authentication']) setShowEmailValidationError(true) setIsLoading(false) } } return (

SSO Authentication

This chat requires SSO authentication

{ e.preventDefault() handleAuthenticate() }} className='mt-8 w-full max-w-[410px] space-y-6' >
0 && 'border-[var(--text-error)] focus:border-[var(--text-error)]' )} /> {showEmailValidationError && emailErrors.length > 0 && (
{emailErrors.map((error) => (

{error}

))}
)}
Continue with SSO
) }