'use client'; import { useState } from "react"; import { useRouter } from "next/navigation"; import ErrorMessage from "./ErrorMessage"; import { BACKEND_ADDRESS } from "@/app/resources/ResourcesPaths"; import { Trans } from 'react-i18next'; import BigBlueButton from "./BigBlueButton"; import { useTranslation } from 'react-i18next'; export default function SubmitForm() { const { t } = useTranslation(); const router = useRouter(); const [requiredVisible, setRequiredVisible] = useState(false); const [email, setEmail] = useState(''); const [displayName, setDisplayName] = useState(''); const [file, setFile] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const [submitStatus, setSubmitStatus] = useState(null); // 'success' | 'error' const [errorMessage, setErrorMessage] = useState(''); const [submissionId, setSubmissionId] = useState(null); const handleFileChange = (e) => { setFile(e.target.files[0]); }; const submitResults = async () => { if (!email || !displayName || !file) { setRequiredVisible(true); return; } if (!file.name.toLowerCase().endsWith('.zip')) { alert(t('submit_zipAlert')); return; } setRequiredVisible(false); setIsSubmitting(true); const formData = new FormData(); formData.append('email', email); formData.append('display_name', displayName); formData.append('predictions_zip', file); try { const res = await fetch(`${BACKEND_ADDRESS}/submit`, { method: "POST", body: formData, }); if (!res.ok) { const err = await res.json().catch(() => null); throw new Error(err?.detail || `HTTP ${res.status}`); } const json = await res.json(); const id = json.submission_id; setSubmissionId(id); localStorage.setItem('last_result_file', `${id}.json`); localStorage.setItem('just_submitted', 'true'); setSubmitStatus('success'); } catch (err) { setErrorMessage(err.message); setSubmitStatus('error'); } finally { setIsSubmitting(false); } }; const renderModal = () => { if (submitStatus === 'success') { return (

{t('submit_successTitle')}

{t('submit_successMessage')}

router.push(`/results/${submissionId}`)} > {t('submit_checkResults')}
); } if (submitStatus === 'error') { return (

{t('submit_errorTitle')}

Submission error: {{ errorMessage }}

); } return null; }; return (

{t('submit_formTitle')}

setEmail(e.target.value)} className="border border-gray-300 p-3 rounded-md w-full focus:ring-2 focus:ring-blue-500" />
setDisplayName(e.target.value)} className="border border-gray-300 p-3 rounded-md w-full focus:ring-2 focus:ring-blue-500" />
⚠️ Email, display name & ZIP are required. {renderModal()}
); }