import { useCallback, useEffect, useState } from "react" import { motion } from "framer-motion" import { ArrowsClockwise, Gear, X } from "@phosphor-icons/react" import type { AutomationTrigger, WorkflowPipelineRecord, WorkflowStatus } from "@shared/types" import { ActionButton, Select } from "../ui" import { ACCENT, LINE, triggerConfig, safeJsonStringify } from "./automation-config" interface WorkflowFormState { name: string; description: string; triggerType: AutomationTrigger; triggerConfigJson: string; status: WorkflowStatus; stepsJson: string } const defaultWorkflowForm: WorkflowFormState = { name: "", description: "", triggerType: "task_created", triggerConfigJson: "{}", status: "draft", stepsJson: "[]" } function workflowToFormState(wf: WorkflowPipelineRecord): WorkflowFormState { return { name: wf.name, description: wf.description, triggerType: wf.triggerType, triggerConfigJson: safeJsonStringify(wf.triggerConfigJson), status: wf.status, stepsJson: safeJsonStringify(wf.stepsJson) } } export function WorkflowFormModal({ open, editingWorkflow, companyId, onClose, onSaved }: { open: boolean; editingWorkflow: WorkflowPipelineRecord | null; companyId: string; onClose: () => void; onSaved: () => void }) { const isEditing = editingWorkflow !== null; const [form, setForm] = useState(defaultWorkflowForm); const [saving, setSaving] = useState(false); const [error, setError] = useState(null) useEffect(() => { if (open) { setForm(editingWorkflow ? workflowToFormState(editingWorkflow) : defaultWorkflowForm); setError(null) } }, [open, editingWorkflow]) const updateField = useCallback((key: K, value: WorkflowFormState[K]) => { setForm((p) => ({ ...p, [key]: value })) }, []) const handleSave = useCallback(async () => { if (!form.name.trim()) { setError("Workflow name is required"); return } try { JSON.parse(form.triggerConfigJson) } catch { setError("Trigger config must be valid JSON"); return } try { JSON.parse(form.stepsJson) } catch { setError("Steps must be valid JSON array"); return } setSaving(true); setError(null) try { const result = await window.agentCompany.saveWorkflow({ id: editingWorkflow?.id ?? null, companyId, name: form.name.trim(), description: form.description.trim(), triggerType: form.triggerType, triggerConfigJson: form.triggerConfigJson, status: form.status, stepsJson: form.stepsJson }); if (!result.ok) { setError(result.error.message); return }; onSaved(); onClose() } catch (err) { setError(err instanceof Error ? err.message : "Failed to save workflow") } finally { setSaving(false) } }, [form, editingWorkflow, companyId, onSaved, onClose]) if (!open) return null const triggerOptions = Object.entries(triggerConfig).map(([key, c]) => ({ value: key, label: c.label })) const statusOptions = [{ value: "draft", label: "Draft" }, { value: "active", label: "Active" }, { value: "paused", label: "Paused" }] return ( e.stopPropagation()}>

{isEditing ? "Edit Workflow" : "New Workflow"}

{error ?
{error}
: null}
updateField("name", e.target.value)} placeholder="e.g., Bug Fix Pipeline" className="focus-ring w-full rounded-[8px] border bg-[color:var(--panel)] px-3.5 py-2.5 text-[14px] text-[color:var(--text)] placeholder:text-[color:var(--muted)]" style={{ borderColor: LINE }} />