"use client"; import { useRef, useState } from "react"; import { useRouter } from "next/navigation"; import { ArrowLeft, FileJson, LayoutGrid, Save } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { PipelineCanvas } from "@/components/canvas/pipeline-canvas"; import { api } from "@/lib/api"; import type { PipelineDefinition } from "@/lib/pipeline-graph"; import Link from "next/link"; const STARTER: PipelineDefinition = { name: "", nodes: [ { id: "1", name: "Trigger", type: "flow-nodes-base.trigger", typeVersion: 1, parameters: {}, position: [0, 0], }, ], connections: {}, }; type Tab = "canvas" | "json"; export default function NewPipelinePage() { const router = useRouter(); const [name, setName] = useState(""); const [tab, setTab] = useState("canvas"); const [error, setError] = useState(null); const [saving, setSaving] = useState(false); const defRef = useRef(STARTER); const [jsonDraft, setJsonDraft] = useState(JSON.stringify(STARTER, null, 2)); function switchTab(next: Tab) { if (next === "json") { setJsonDraft(JSON.stringify({ ...defRef.current, name }, null, 2)); setTab(next); return; } try { const parsed = JSON.parse(jsonDraft) as PipelineDefinition; defRef.current = parsed; if (parsed.name) setName(parsed.name); setError(null); } catch (e) { setError(`JSON parse failed: ${(e as Error).message}`); return; } setTab(next); } async function onSave() { setSaving(true); setError(null); try { const toSave: PipelineDefinition = tab === "json" ? JSON.parse(jsonDraft) : defRef.current; const { id } = await api.createFlow({ name, definition: { ...toSave, name }, }); router.push(`/flows/view/?id=${encodeURIComponent(id)}`); } catch (e) { setError(e instanceof Error ? e.message : "save failed"); } finally { setSaving(false); } } return (
{error && (
{error}
)}
{tab === "canvas" ? ( { defRef.current = d; }} fullBleed /> ) : (