import { useState, useCallback } from 'react' import { Sparkles, ChevronUp, ChevronDown, AlertTriangle } from 'lucide-react' import { cn } from '@/lib/utils' import { networkDiagramsApi } from '@/api' import type { AIGenerateResponse } from '@/types' interface AIAssistPanelProps { onGenerate: (result: AIGenerateResponse, mode: 'replace' | 'merge') => void getExistingBounds: () => { minX: number; maxX: number; minY: number; maxY: number } | null hasNodes: boolean } export function AIAssistPanel({ onGenerate, getExistingBounds, hasNodes }: AIAssistPanelProps) { const [expanded, setExpanded] = useState(false) const [description, setDescription] = useState('') const [mode, setMode] = useState<'replace' | 'merge'>('replace') const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const [replaceConfirm, setReplaceConfirm] = useState(false) const handleGenerate = useCallback(async () => { if (!description.trim()) return setLoading(true) setError(null) setReplaceConfirm(false) try { const result = await networkDiagramsApi.aiGenerate({ description: description.trim(), mode, existingBounds: mode === 'merge' ? getExistingBounds() : null, }) onGenerate(result, mode) setDescription('') setExpanded(false) } catch (err: unknown) { const msg = err instanceof Error ? err.message : 'Generation failed. Please try again.' setError(msg) } finally { setLoading(false) } }, [description, mode, onGenerate, getExistingBounds]) // Reset confirm state when mode changes or panel collapses const handleModeChange = (newMode: 'replace' | 'merge') => { setMode(newMode) setReplaceConfirm(false) } const needsReplaceConfirm = mode === 'replace' && hasNodes if (!expanded) { return (
) } return (
AI Generate
{needsReplaceConfirm && (

This will replace your current diagram. Save first if needed.

)}