import { track } from '@shared/lib/track'; import { Button, Modal, Notice, Spinner, TextareaControl, TextControl, ToggleControl, } from '@wordpress/components'; import { useEffect, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { loadWpFormsField, saveWpFormsField } from '../../lib/api'; import { useCmdEnterSave } from '../../lib/cmd-enter-save'; import { friendlyMessage } from '../../lib/errors'; import { QE_MODAL_BODY_OPEN_CLASS } from '../../lib/modal-root'; import { pushUndo } from '../../state/undo'; import { ModalCloseButton } from './ModalCloseButton'; export const WPFormsFieldModal = ({ formId, fieldId, onAfterSave }) => { const [data, setData] = useState(null); const [loadError, setLoadError] = useState(null); const [label, setLabel] = useState(''); const [placeholder, setPlaceholder] = useState(''); const [description, setDescription] = useState(''); const [required, setRequired] = useState(false); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); useEffect(() => { loadWpFormsField({ formId, fieldId }) .then((res) => { setData(res); setLabel(String(res.label || '')); setPlaceholder(String(res.placeholder || '')); setDescription(String(res.description || '')); setRequired(!!res.required); }) .catch((err) => setLoadError(friendlyMessage(err))); }, [formId, fieldId]); // `name` is composite (its sub-labels stand in for placeholder). const supportsPlaceholder = data?.type !== 'name' && data?.type !== 'select' && data?.type !== 'checkbox' && data?.type !== 'radio'; const handleSave = async () => { if (saving || !data) return; const changes = {}; const beforeChanges = {}; if (label !== (data.label || '')) { changes.label = label; beforeChanges.label = data.label || ''; } if (placeholder !== (data.placeholder || '')) { changes.placeholder = placeholder; beforeChanges.placeholder = data.placeholder || ''; } if (description !== (data.description || '')) { changes.description = description; beforeChanges.description = data.description || ''; } if (required !== !!data.required) { changes.required = required; beforeChanges.required = !!data.required; } if (Object.keys(changes).length === 0) { onAfterSave(false); return; } setSaving(true); setError(null); try { await saveWpFormsField({ formId, fieldId, changes }); pushUndo({ kind: 'wpforms-field', wpformsReplay: true, formId, fieldId, changes: beforeChanges, }); track('save', { kind: 'wpforms_field', type: data.type }); onAfterSave(true); } catch (err) { track('save_failed', { kind: 'wpforms_field', type: data?.type }); setError(friendlyMessage(err)); setSaving(false); } }; useCmdEnterSave(handleSave, !!data && !saving); return ( onAfterSave(false)} isDismissible={false} headerActions={ onAfterSave(false)} />} className="extendify-quick-edit-modal extendify-quick-edit-modal-wpforms" overlayClassName="extendify-quick-edit" bodyOpenClassName={QE_MODAL_BODY_OPEN_CLASS} size="medium" > {loadError ? ( {loadError} ) : null} {error ? ( {error} ) : null} {!data && !loadError ? : null} {data ? ( <> {supportsPlaceholder ? ( ) : null} ) : null}
); };