import { Code, Eye, HelpCircle } from 'lucide-react' import { Button, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { buildExplainPrompt } from './ExplainVisualizer.ai' import type { QueryPlanRow } from './ExplainVisualizer.types' import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown' import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export interface ExplainSummary { totalTime: number hasSeqScan: boolean hasIndexScan: boolean } export interface ExplainHeaderProps { mode: 'visual' | 'raw' onToggleMode: () => void summary?: ExplainSummary id?: string rows?: readonly QueryPlanRow[] } export function ExplainHeader({ mode, onToggleMode, summary, id, rows }: ExplainHeaderProps) { const isVisual = mode === 'visual' const snapV2 = useSqlEditorV2StateSnapshot() const { openSidebar } = useSidebarManagerSnapshot() const aiSnap = useAiAssistantStateSnapshot() const getPromptData = () => { if (!id) return null const snippet = snapV2.snippets[id]?.snippet if (!snippet?.content?.unchecked_sql) return null return buildExplainPrompt({ sql: snippet.content.unchecked_sql, explainPlanRows: (rows as QueryPlanRow[]) ?? [], }) } const handleExplainWithAI = () => { const promptData = getPromptData() if (!promptData) return openSidebar(SIDEBAR_KEYS.AI_ASSISTANT) aiSnap.newChat({ sqlSnippets: [ { label: 'Query', content: promptData.query, }, ], initialMessage: promptData.prompt, }) } const buildPromptForCopy = () => { const promptData = getPromptData() if (!promptData) return '' // Combine SQL and prompt into a single copyable text return `${promptData.prompt}\n\nSQL Query:\n\`\`\`sql\n${promptData.query}\n\`\`\`` } const hasSummaryStats = isVisual && summary && (summary.totalTime > 0 || (summary.hasSeqScan && !summary.hasIndexScan)) return (
Start at the bottom where data is read from tables, then follow upward as each step processes the results.
{isVisual && ( <>