import { useEffect } from 'react' import { useParams, useNavigate } from 'react-router-dom' import { Save, ArrowLeft, ListOrdered } from 'lucide-react' import { treesApi } from '@/api/trees' import { useProceduralEditorStore } from '@/store/proceduralEditorStore' import { IntakeFormBuilder } from '@/components/procedural-editor/IntakeFormBuilder' import { StepList } from '@/components/procedural-editor/StepList' import { TagInput } from '@/components/common/TagInput' import { toast } from '@/lib/toast' export function ProceduralEditorPage() { const { id } = useParams<{ id: string }>() const navigate = useNavigate() const isEditMode = !!id const { treeId, name, description, tags, isPublic, isDirty, isSaving, isLoading, initNew, loadTree, reset, setName, setDescription, setTags, setIsPublic, setIsSaving, markSaved, getTreeForSave, } = useProceduralEditorStore() // Load tree or init new useEffect(() => { if (isEditMode && id) { loadExistingTree(id) } else { initNew() } return () => { reset() } }, [id]) const loadExistingTree = async (treeId: string) => { try { const tree = await treesApi.get(treeId) if (tree.tree_type !== 'procedural') { toast.error('This tree is not a procedural flow') navigate('/my-trees') return } loadTree(tree) } catch { toast.error('Failed to load procedure') navigate('/my-trees') } } const handleSave = async (saveStatus?: 'draft' | 'published') => { if (!name.trim()) { toast.error('Please enter a name for the procedure') return } setIsSaving(true) try { const payload = getTreeForSave() if (saveStatus) { payload.status = saveStatus } if (isEditMode && treeId) { await treesApi.update(treeId, payload) markSaved() toast.success('Procedure saved') } else { const created = await treesApi.create(payload) markSaved() toast.success('Procedure created') navigate(`/flows/${created.id}/edit`, { replace: true }) } } catch (err: unknown) { const message = err && typeof err === 'object' && 'response' in err ? (err as { response?: { data?: { detail?: string | { message?: string } } } }).response?.data?.detail : null const errorText = typeof message === 'string' ? message : typeof message === 'object' && message?.message ? message.message : 'Failed to save procedure' toast.error(errorText) } finally { setIsSaving(false) } } if (isLoading) { return (