'use client'; import React, { useState } from 'react'; import { EXAMPLE_WORKFLOWS } from '../../lib/exampleWorkflows'; import { WorkflowNodeType, WorkflowStep } from './WorkflowTypes'; interface WorkflowBuilderProps { onGenerate: (workflowSteps: string[]) => void; isRunning: boolean; onWorkflowSelect: (workflowId: string | null) => void; onWorkflowChange: () => void; } const STEP_TYPES = [ { value: 'input', label: 'Input', icon: '📥' }, { value: 'task', label: 'Task', icon: '⚙️' }, { value: 'decision', label: 'Decision', icon: '🔀' }, { value: 'automation', label: 'Automation', icon: '🤖' }, { value: 'approval', label: 'Approval', icon: '✅' }, { value: 'output', label: 'Output', icon: '📤' }, { value: 'api', label: 'API', icon: '🔌' }, { value: 'queue', label: 'Queue', icon: '📬' }, { value: 'llm', label: 'LLM', icon: '🧠' }, { value: 'human_review', label: 'Human Review', icon: '👤', }, { value: 'notification', label: 'Notification', icon: '🔔', }, ]; const DEFAULT_STEPS: WorkflowStep[] = [ { id: '1', type: 'input', label: '', }, { id: '2', type: 'task', label: '', }, { id: '3', type: 'decision', label: '', }, ]; export default function WorkflowBuilder({ onGenerate, isRunning, onWorkflowSelect, onWorkflowChange, }: WorkflowBuilderProps) { const [selectedExample, setSelectedExample] = useState(''); const [workflowSteps, setWorkflowSteps] = useState(DEFAULT_STEPS); const placeholders = [ 'Step 1: What triggers your workflow?', 'Step 2: What happens next?', 'Step 3: Who approves or decides?', ]; const handleExampleChange = ( e: React.ChangeEvent ) => { const workflowId = e.target.value; setSelectedExample(workflowId); // reset old results onWorkflowChange(); if (!workflowId) { onWorkflowSelect(null); setWorkflowSteps(DEFAULT_STEPS); return; } onWorkflowSelect(workflowId); const selectedWorkflow = EXAMPLE_WORKFLOWS.find( (workflow) => workflow.id === workflowId ); if (selectedWorkflow) { setWorkflowSteps( selectedWorkflow.before.map( (step) => ({ id: step.id, type: step.type, label: step.label, }) ) ); } }; const clearExampleWorkflow = () => { setSelectedExample(''); // reset old results onWorkflowChange(); onWorkflowSelect(null); setWorkflowSteps(DEFAULT_STEPS); }; const updateStepLabel = ( id: string, value: string ) => { onWorkflowChange(); setWorkflowSteps((prev) => prev.map((step) => step.id === id ? { ...step, label: value, } : step ) ); }; const updateStepType = ( id: string, type: WorkflowNodeType ) => { onWorkflowChange(); setWorkflowSteps((prev) => prev.map((step) => step.id === id ? { ...step, type, } : step ) ); }; const addWorkflowStep = () => { onWorkflowChange(); setWorkflowSteps((prev) => [ ...prev, { id: Date.now().toString(), type: 'task', label: '', }, ]); }; const removeStep = (id: string) => { if (workflowSteps.length <= 1) return; onWorkflowChange(); setWorkflowSteps((prev) => prev.filter( (step) => step.id !== id ) ); }; const handleGenerate = () => { const cleanedSteps = workflowSteps .map((step) => step.label.trim()) .filter(Boolean); if (cleanedSteps.length === 0) { alert( 'Please add at least one workflow step' ); return; } onGenerate(cleanedSteps); }; return (
Map Your Current Workflow

Add your messy operational process — approvals, spreadsheets, manual handoffs, broken workflows, or disconnected systems. SystemForge will redesign it into a scalable production-grade AI workflow.

{/* Example Workflow Dropdown */}
{selectedExample && ( )}
{/* Workflow Steps */}
{workflowSteps.map( (step, index) => (
{/* Step Number */}
{String( index + 1 ).padStart( 2, '0' )}
{/* Step Type */} {/* Step Input */} updateStepLabel( step.id, e .target .value ) } placeholder={ placeholders[ index ] || `Step ${index + 1}` } style={{ flex: 1, padding: '18px 20px', borderRadius: '12px', background: '#050816', color: '#fff', border: '1px solid rgba(255,255,255,0.08)', fontSize: '18px', outline: 'none', }} /> {/* Remove Button */}
) )}
{/* Add Step */}
{/* Generate Button */}
); }