'use client'; import { useState, useRef, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { CheckCircle, AlertCircle, Play, Loader2 } from 'lucide-react'; import Editor, { OnMount } from '@monaco-editor/react'; import { workflowApi } from '@/lib/api/workflows'; import { ValidationResult } from '@/types/workflow'; import { useTheme } from 'next-themes'; interface DSLEditorProps { initialValue?: string; onChange?: (value: string) => void; readOnly?: boolean; } export function DSLEditor({ initialValue = '', onChange, readOnly = false }: DSLEditorProps) { const [dsl, setDsl] = useState(initialValue); const [validationResult, setValidationResult] = useState(null); const [isValidating, setIsValidating] = useState(false); const editorRef = useRef(null); const { theme } = useTheme(); // Update internal state if initialValue changes (e.g. loaded from API) useEffect(() => { setDsl(initialValue); }, [initialValue]); const handleEditorChange = (value: string | undefined) => { const newValue = value || ''; setDsl(newValue); onChange?.(newValue); // Clear previous validation result on edit to avoid stale state if (validationResult) { setValidationResult(null); } }; const handleEditorDidMount: OnMount = (editor) => { editorRef.current = editor; }; const validateDSL = async () => { setIsValidating(true); try { const result = await workflowApi.validateDSL(dsl); setValidationResult(result); } catch (error) { console.error("Validation error:", error); setValidationResult({ valid: false, errors: ['Validation failed due to server error'] }); } finally { setIsValidating(false); } }; interface TestResult { success: boolean; message: string; } const [testResult, setTestResult] = useState(null); const [isTesting, setIsTesting] = useState(false); const testWorkflow = async () => { setIsTesting(true); setTestResult(null); try { // Mock test execution await new Promise(resolve => setTimeout(resolve, 1000)); setTestResult({ success: true, message: "Workflow simulation completed successfully." }); } catch { setTestResult({ success: false, message: "Workflow simulation failed." }); } finally { setIsTesting(false); } }; return (

Workflow DSL

{validationResult && ( {validationResult.valid ? ( ) : ( )} {validationResult.valid ? ( DSL is valid and ready to deploy. ) : (

Validation Errors:

    {validationResult.errors?.map((error: string, i: number) => (
  • {error}
  • ))}
)}
)} {testResult && ( {testResult.success ? : } {testResult.message} )}
); }