import { useState, useEffect } from 'react' import { GitBranch, X } from 'lucide-react' import { treesApi } from '@/api/trees' import { toast } from '@/lib/toast' import { cn } from '@/lib/utils' import { useNavigate } from 'react-router-dom' import { Button } from '@/components/ui/Button' interface ForkModalProps { treeId: string treeName: string onClose: () => void } export function ForkModal({ treeId, treeName, onClose }: ForkModalProps) { const navigate = useNavigate() const [name, setName] = useState(`Copy of ${treeName}`) const [forkReason, setForkReason] = useState('') const [isSubmitting, setIsSubmitting] = useState(false) const [error, setError] = useState(null) useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose() } document.addEventListener('keydown', handleKeyDown) return () => document.removeEventListener('keydown', handleKeyDown) }, [onClose]) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!name.trim()) return setIsSubmitting(true) setError(null) try { await treesApi.fork(treeId, { name: name.trim(), fork_reason: forkReason.trim() || undefined, }) toast.success('Flow forked successfully') onClose() navigate('/my-trees') } catch (err) { console.error('Failed to fork flow:', err) setError('Failed to fork flow. Please try again.') } finally { setIsSubmitting(false) } } return (
e.stopPropagation()} > {/* Header */}

Fork Flow

{/* Body */}
setName(e.target.value)} required autoFocus maxLength={255} className={cn( 'w-full rounded-lg border border-border bg-card px-3 py-2 text-sm text-foreground', 'placeholder:text-muted-foreground focus:border-primary focus:outline-hidden focus:ring-1 focus:ring-primary/20' )} />