"use client" import { useEffect, useRef, useState, lazy, Suspense } from 'react' import dynamic from 'next/dynamic' import FormField from '@/components/FormField' import SubmitButton from '@/components/SubmitButton' import StatusMessage from '@/components/StatusMessage' import type { RackHeightsPayload } from '@/types/rackHeights' import { required } from '@/utils/validation' import { useLanguage } from '@/context/LanguageContext' import { t } from '@/utils/translations' const Checkmark = dynamic(() => import('react-checkmark').then(mod => ({ default: mod.Checkmark })), { ssr: false }) type Props = { memberNumber: string birthDate: string onSuccess: () => void } export default function RackHeightsForm({ memberNumber, birthDate, onSuccess }: Props) { const { language } = useLanguage() const [squatRackHeight, setSquatRackHeight] = useState('') const [squatRackInOut, setSquatRackInOut] = useState('') const [benchRackHeight, setBenchRackHeight] = useState('') const [benchRackSafety, setBenchRackSafety] = useState('') const [benchRackFootBlocks, setBenchRackFootBlocks] = useState<'NONE' | '5cm' | '10cm' | '20cm' | '30cm'>('NONE') const [loading, setLoading] = useState(false) const [status, setStatus] = useState<{ type: 'idle' | 'success' | 'error'; msg: string | null }>({ type: 'idle', msg: null }) const [submitted, setSubmitted] = useState(false) const firstFieldRef = useRef(null) const errorMessages = { validation_error: t('error_validation', language), network_error: t('error_network', language), api_error: t('error_api', language) } useEffect(() => { firstFieldRef.current?.focus() }, []) async function onSubmit(e: React.FormEvent) { e.preventDefault() setStatus({ type: 'idle', msg: null }) if (!required(squatRackHeight) || !required(benchRackHeight) || !required(benchRackFootBlocks)) { setStatus({ type: 'error', msg: errorMessages.validation_error }) return } setLoading(true) try { await new Promise(resolve => setTimeout(resolve, 1500)) const payload: RackHeightsPayload = { memberNumber, birthDate, squatRackHeight, squatRackInOut, benchRackHeight, benchRackSafety, benchRackFootBlocks } const res = await fetch('/api/submit', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }) if (!res.ok) { const data = await res.json().catch(() => ({})) const msg = data?.message || errorMessages.api_error setStatus({ type: 'error', msg }) return } setStatus({ type: 'success', msg: t('submission_success', language) }) setSubmitted(true) } catch { setStatus({ type: 'error', msg: errorMessages.network_error }) } finally { setLoading(false) } } function handleNewSubmission() { setSubmitted(false) setStatus({ type: 'idle', msg: null }) setSquatRackHeight('') setSquatRackInOut('') setBenchRackHeight('') setBenchRackSafety('') setBenchRackFootBlocks('NONE') onSuccess() } return (
{submitted ? (

{t('heights_submitted_title', language)}

{t('heights_submitted_text', language)}

) : (

{t('step_2_heights', language)}

setSquatRackHeight(e.target.value)} className="w-full rounded-lg border-2 border-gray-300 px-4 py-3 text-base outline-none transition-colors focus-visible:ring-2 focus-visible:ring-[#006600]/30" required />
setBenchRackHeight(e.target.value)} className="w-full rounded-lg border-2 border-gray-300 px-4 py-3 text-base outline-none transition-colors focus-visible:ring-2 focus-visible:ring-[#006600]/30" required />
{t('submit_heights', language)}
)}
) }