import { useState } from 'react' import { Plus, Code, List } from 'lucide-react' import { cn } from '@/lib/utils' import { ParameterCard } from './ParameterCard' import type { ScriptParameter, ScriptParametersSchema } from '@/types' interface Props { schema: ScriptParametersSchema onChange: (schema: ScriptParametersSchema) => void disabled?: boolean } function newParameter(order: number): ScriptParameter { return { key: '', label: '', type: 'text', required: true, placeholder: null, group: null, order, help_text: null, options: null, default: null, validation: null, sensitive: false, } } export function ParameterSchemaBuilder({ schema, onChange, disabled }: Props) { const [mode, setMode] = useState<'visual' | 'json'>('visual') const [jsonText, setJsonText] = useState('') const [jsonError, setJsonError] = useState(null) const parameters = schema.parameters ?? [] const updateParams = (params: ScriptParameter[]) => { onChange({ parameters: params }) } const handleParamChange = (index: number, updated: ScriptParameter) => { const next = [...parameters] next[index] = updated updateParams(next) } const handleRemove = (index: number) => { updateParams(parameters.filter((_, i) => i !== index)) } const handleMoveUp = (index: number) => { if (index === 0) return const next = [...parameters] ;[next[index - 1], next[index]] = [next[index], next[index - 1]] next.forEach((p, i) => { p.order = i + 1 }) updateParams(next) } const handleMoveDown = (index: number) => { if (index === parameters.length - 1) return const next = [...parameters] ;[next[index], next[index + 1]] = [next[index + 1], next[index]] next.forEach((p, i) => { p.order = i + 1 }) updateParams(next) } const handleAdd = () => { updateParams([...parameters, newParameter(parameters.length + 1)]) } const switchToJson = () => { setJsonText(JSON.stringify(schema, null, 2)) setJsonError(null) setMode('json') } const switchToVisual = () => { try { const parsed = JSON.parse(jsonText) if (!parsed.parameters || !Array.isArray(parsed.parameters)) { setJsonError('JSON must have a "parameters" array') return } onChange(parsed as ScriptParametersSchema) setJsonError(null) setMode('visual') } catch (e) { setJsonError(`Invalid JSON: ${(e as Error).message}`) } } return (
{/* Mode toggle */}
{mode === 'visual' ? ( <> {parameters.length === 0 ? (

No parameters defined. Add one to create dynamic form fields.

) : (
{parameters.map((param, i) => ( ))}
)} ) : ( <>