import { useState, useRef, useEffect } from 'react'; import { motion, AnimatePresence } from 'motion/react'; import { useI18n } from '@/lib/hooks/use-i18n'; import { ArrowRight, ShieldCheck, LoaderCircle } from 'lucide-react'; interface AccessCodeModalProps { open: boolean; onSuccess: () => void; } export function AccessCodeModal({ open, onSuccess }: AccessCodeModalProps) { const { t } = useI18n(); const [code, setCode] = useState(''); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); const [success, setSuccess] = useState(false); const inputRef = useRef(null); useEffect(() => { if (open && inputRef.current) { inputRef.current.focus(); } }, [open]); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (!code || loading) return; setError(''); setLoading(true); try { const res = await fetch('/api/access-code/verify', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ code }), }); if (res.ok) { setSuccess(true); setTimeout(onSuccess, 600); } else { setError(t('accessCode.error')); setCode(''); inputRef.current?.focus(); } } catch { setError(t('accessCode.error')); } finally { setLoading(false); } } return ( {open && ( {/* Background — subtle mesh gradient */}
{/* Subtle noise texture */}
{/* Content card */}
{/* Icon */} {/* Title */} {t('accessCode.title')} OpenMAIC {/* Form */}
{ setCode(e.target.value); if (error) setError(''); }} className={` w-full rounded-xl border bg-background/60 px-4 py-3 pr-12 text-sm outline-none transition-all duration-200 placeholder:text-muted-foreground/50 focus:border-primary/40 focus:ring-2 focus:ring-primary/10 ${error ? 'border-destructive/50 focus:border-destructive/50 focus:ring-destructive/10' : 'border-border/60'} `} disabled={loading || success} autoComplete="off" />
{/* Error message */} {error && ( {error} )}
)} ); }