import { useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { Modal } from '@/components/common/Modal' import { useAIFlowBuilderStore } from '@/store/aiFlowBuilderStore' import { treesApi } from '@/api/trees' import { toast } from '@/lib/toast' import { WizardStepIndicator } from './WizardStepIndicator' import { FoundationForm } from './FoundationForm' import { BranchSelector } from './BranchSelector' import { BranchDetailView } from './BranchDetailView' import { TreePreviewCard } from './TreePreviewCard' import { GeneratingAnimation } from './GeneratingAnimation' interface AIFlowBuilderModalProps { isOpen: boolean onClose: () => void } export function AIFlowBuilderModal({ isOpen, onClose }: AIFlowBuilderModalProps) { const navigate = useNavigate() const { phase, metadata, assembledTree, loadQuota, scaffold, reset, } = useAIFlowBuilderStore() // Load quota when modal opens useEffect(() => { if (isOpen) { loadQuota() } }, [isOpen, loadQuota]) // Auto-trigger scaffold after conversation starts useEffect(() => { if (phase === 'scaffolding' && !useAIFlowBuilderStore.getState().suggestedBranches.length) { scaffold() } }, [phase, scaffold]) const handleClose = () => { reset() onClose() } const handleOpenInEditor = async () => { if (!assembledTree) return try { const tree = await treesApi.create({ name: assembledTree.suggested_name, description: assembledTree.suggested_description, tree_structure: assembledTree.tree_structure, tree_type: metadata.flow_type, }) handleClose() const editorPath = metadata.flow_type === 'procedural' ? `/flows/${tree.id}/edit` : `/trees/${tree.id}/edit` navigate(editorPath) } catch { toast.error('Failed to create flow. Please try again.') } } const getTitle = () => { switch (phase) { case 'foundation': return 'Build with AI' case 'scaffolding': case 'generating': return 'AI Scaffold' case 'detailing': return 'Branch Detail' case 'reviewing': return 'Review & Assemble' case 'error': return 'AI Flow Builder' default: return 'Build with AI' } } return ( } > {phase === 'foundation' && } {phase === 'scaffolding' && } {phase === 'generating' && } {phase === 'detailing' && } {phase === 'reviewing' && ( )} {phase === 'error' && } ) } function ErrorView() { const { error, reset, setPhase } = useAIFlowBuilderStore() return (
{error || 'An unexpected error occurred.'}
) }