import { useState, useEffect } from 'react' import Layout from '@/components/layout/Layout' import { Card, EmptyState, Btn, Tag, showToast } from '@/components/ui' import { FormFieldList } from '@/components/forms/FieldRenderer' import { useApp } from '@/lib/context' export default function FillPage() { const { user } = useApp() const [forms, setForms] = useState([]) const [loading, setLoading] = useState(true) const [selected, setSelected] = useState(null) const [answers, setAnswers] = useState>({}) const [submitting, setSubmitting] = useState(false) const [submitted, setSubmitted] = useState(false) useEffect(() => { loadForms() }, []) async function loadForms() { setLoading(true) const res = await fetch('/api/forms?status=ACTIVE') if (res.ok) { const { data } = await res.json() setForms(data || []) } setLoading(false) } function selectForm(form: any) { setSelected(form) setAnswers({}) setSubmitted(false) } async function submitForm() { const required = selected.fields.filter((f: any) => f.required) for (const f of required) { if (!answers[f.id]) { showToast(`"${f.label}" is required`, 'error'); return } } setSubmitting(true) const res = await fetch('/api/submissions', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ formId: selected.id, data: answers }), }) setSubmitting(false) if (res.ok) { const { submissionCount } = await res.json() setSubmitted(true) showToast(`Submitted — you are contributor #${submissionCount}`) } else { showToast('Submission failed', 'error') } } function setAnswer(fieldId: string, value: any) { setAnswers(a => ({ ...a, [fieldId]: value })) } return ( {!selected ? ( <>

First build forms

Select a form to fill out — your data helps set quality standards

{loading ? (
Loading…
) : forms.length === 0 ? ( ) : (
{forms.map((form: any) => (
selectForm(form)} style={{ background: 'white', border: '0.5px solid #eee', borderRadius: '12px', padding: '16px', cursor: 'pointer', transition: 'border-color 0.1s' }}>
Active
{form.name}
{form.product &&
{form.product}
}
{form.fields?.length || 0} fields · {form._count?.submissions || 0} submissions so far
Fill out →
))}
)} ) : submitted ? (
Submitted
Your data has been recorded and will contribute to setting quality standards for {selected.product || selected.name}.
{ setSubmitted(false); setAnswers({}) }}>Fill again setSelected(null)}>Back to forms
) : (

{selected.name}

{selected.product &&
{selected.product}
}
Fill in each field from your direct observation. Your submission is anonymous to QC — it's just your data point.
a.order - b.order)} values={answers} onChange={setAnswer} />
{ setAnswers({}); }}>Clear {submitting ? 'Submitting…' : 'Submit build data'}
)}
) }