import React, { useState } from 'react'; import { X, Plus, Trash2, GripVertical, Save } from 'lucide-react'; import { toast } from 'react-toastify'; import workflowService, { Workflow, WorkflowStep } from '../services/workflowService'; interface WorkflowBuilderProps { workflow?: Workflow | null; onClose: () => void; onSuccess: () => void; } const WorkflowBuilder: React.FC = ({ workflow, onClose, onSuccess }) => { const [formData, setFormData] = useState({ name: workflow?.name || '', description: workflow?.description || '', workflow_type: workflow?.workflow_type || 'custom', trigger: workflow?.trigger || 'manual', sla_hours: workflow?.sla_hours?.toString() || '', trigger_config: workflow?.trigger_config || {}, }); const [steps, setSteps] = useState(workflow?.steps || []); const [loading, setLoading] = useState(false); const addStep = () => { setSteps([ ...steps, { title: '', description: '', task_type: 'general', priority: 'medium', estimated_duration_minutes: 30, }, ]); }; const updateStep = (index: number, field: keyof WorkflowStep, value: string | number) => { const newSteps = [...steps]; newSteps[index] = { ...newSteps[index], [field]: value }; setSteps(newSteps); }; const removeStep = (index: number) => { setSteps(steps.filter((_, i) => i !== index)); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.name.trim()) { toast.error('Workflow name is required'); return; } if (steps.length === 0) { toast.error('At least one step is required'); return; } if (steps.some(step => !step.title.trim())) { toast.error('All steps must have a title'); return; } try { setLoading(true); if (workflow) { await workflowService.updateWorkflow(workflow.id, { name: formData.name, description: formData.description || undefined, steps: steps, trigger_config: formData.trigger_config, sla_hours: formData.sla_hours ? parseInt(formData.sla_hours) : undefined, }); toast.success('Workflow updated successfully'); } else { await workflowService.createWorkflow({ name: formData.name, description: formData.description || undefined, workflow_type: formData.workflow_type as 'pre_arrival' | 'room_preparation' | 'maintenance' | 'guest_communication' | 'follow_up' | 'custom', trigger: formData.trigger as 'manual' | 'scheduled' | 'check_in' | 'check_out' | 'booking_created' | 'booking_confirmed' | 'maintenance_request' | 'guest_message', steps: steps, trigger_config: formData.trigger_config, sla_hours: formData.sla_hours ? parseInt(formData.sla_hours) : undefined, }); toast.success('Workflow created successfully'); } onSuccess(); } catch (error: unknown) { toast.error(getUserFriendlyError(error) || 'Failed to save workflow'); } finally { setLoading(false); } }; return (

{workflow ? 'Edit Workflow' : 'Create Workflow'}

{/* Basic Information */}

Basic Information

setFormData({ ...formData, name: e.target.value })} className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500" required />