"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { Play, Loader2 } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Form } from "@/components/ui/form"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { buildVariableSchemaFromList } from "@/lib/validation/variable-schema"; import type { ClientScript } from "@/lib/config/serialize"; import { FieldRenderer } from "./field-renderer"; function emptyValueFor(variable: ClientScript["variables"][number]): unknown { if (variable.type === "boolean") return false; if (variable.type === "multiselect") return []; return ""; } function defaultValuesFor(script: ClientScript): Record { const values: Record = {}; for (const variable of script.variables) { values[variable.name] = variable.default ?? emptyValueFor(variable); } return values; } export function DynamicForm({ script }: { script: ClientScript }) { const router = useRouter(); const [submitError, setSubmitError] = useState(null); const schema = buildVariableSchemaFromList(script.variables); const form = useForm({ resolver: zodResolver(schema), defaultValues: defaultValuesFor(script), }); async function onSubmit(values: Record) { setSubmitError(null); const response = await fetch(`/api/scripts/${script.id}/runs`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ variables: values }), }); if (!response.ok) { const data = await response.json().catch(() => ({})); setSubmitError(data.error ?? "Failed to start run"); return; } const data = await response.json(); toast.success(`${script.name} started`); router.push(`/runs/${data.runId}`); } return (
{submitError && ( {submitError} )} {script.variables.length === 0 && (

This script takes no parameters.

)} {script.variables.map((variable) => ( ))} ); }