"use client" import React, { useCallback, useSyncExternalStore } from 'react' import type { FormState, FormField } from '@/lib/state/formStore' import { useTranslations } from 'next-intl' type Store = { getState: () => FormState subscribe: (listener: () => void) => () => void } export default function FormBuilderPanel({ store }: { store: Store }) { const t = useTranslations() const state = useSyncExternalStore(store.subscribe, store.getState, store.getState) const onAddText = useCallback(() => { const idx = state.fields.length + 1 const name = `field${idx}` store.getState().addField({ type: 'text', name, label: `Text ${idx}`, required: false }) }, [state.fields.length, store]) const nextName = () => `field${state.fields.length + 1}` const onAddEmail = () => store.getState().addField({ type: 'email', name: nextName(), label: 'Email', required: false }) const onAddTel = () => store.getState().addField({ type: 'tel', name: nextName(), label: 'Tel', required: false }) const onAddDate = () => store.getState().addField({ type: 'date', name: nextName(), label: 'Date', required: false }) const onAddTextarea = () => store.getState().addField({ type: 'textarea', name: nextName(), label: 'Message', required: false }) const onAddCheckbox = () => store.getState().addField({ type: 'checkbox', name: nextName(), label: 'Agree', required: false }) const onAddSelect = () => store.getState().addField({ type: 'select', name: nextName(), label: 'Select', required: false, options: [] }) const onAddRadio = () => store.getState().addField({ type: 'radio', name: nextName(), label: 'Radio', required: false, options: [] }) const onChangeAction = (e: React.ChangeEvent) => { store.getState().setActionUrl(e.target.value) } const onChangeHp = (e: React.ChangeEvent) => { store.getState().setSpam({ honeypotFieldName: e.target.value }) } const onChangeTs = (e: React.ChangeEvent) => { const v = parseInt(e.target.value || '0', 10) store.getState().setSpam({ minSubmitSeconds: Number.isNaN(v) ? 0 : v }) } const onChangeLabel = (i: number, e: React.ChangeEvent) => { store.getState().updateField(i, { label: e.target.value }) } const onToggleRequired = (i: number) => { const cur = store.getState().fields[i]?.required ?? false store.getState().updateField(i, { required: !cur }) } const onDown = (i: number) => { if (i < state.fields.length - 1) { store.getState().moveField(i, i + 1) } } const onRemove = (i: number) => { store.getState().removeField(i) } return (
    {state.fields.map((f: FormField, i: number) => (
  • {f.type} - {f.name}
    {(f.type === 'text' || f.type === 'email' || f.type === 'tel' || f.type === 'date' || f.type === 'textarea') && (
    )} {(f.type === 'select' || f.type === 'radio') && ( )}
  • ))}
) }