import { Loader2 } from 'lucide-react' import { MouseEvent, useState } from 'react' import { Button, cn, HoverCard, HoverCardContent, HoverCardTrigger, Separator, WarningIcon, } from 'ui' import { CodeBlock } from 'ui-patterns/CodeBlock' import { useIndexInvalidation } from '../hooks/useIndexInvalidation' import { QueryPanelScoreSection } from '../QueryPanel' import { createIndexes } from './index-advisor.utils' import { IndexImprovementText } from './IndexImprovementText' import { GetIndexAdvisorResultResponse } from '@/data/database/retrieve-index-advisor-result-query' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface IndexSuggestionIconProps { indexAdvisorResult: GetIndexAdvisorResultResponse onClickIcon?: () => void } export const IndexSuggestionIcon = ({ indexAdvisorResult, onClickIcon, }: IndexSuggestionIconProps) => { const { data: project } = useSelectedProjectQuery() const [isCreatingIndex, setIsCreatingIndex] = useState(false) const [isHoverCardOpen, setIsHoverCardOpen] = useState(false) const invalidateQueries = useIndexInvalidation() const handleCreateIndex = async (e: MouseEvent) => { e.stopPropagation() setIsCreatingIndex(true) try { await createIndexes({ projectRef: project?.ref, connectionString: project?.connectionString, indexStatements: indexAdvisorResult.index_statements, onSuccess: () => { // Handle UI-specific logic if (onClickIcon) { onClickIcon() setIsHoverCardOpen(false) } }, }) // Only invalidate queries if index creation was successful invalidateQueries() } catch (error) { // Error is already handled by createIndexes with a toast notification // But we could add component-specific error handling here if needed console.error('Failed to create index:', error) setIsCreatingIndex(false) } finally { // Reset the loading state after a short delay to show feedback setTimeout(() => setIsCreatingIndex(false), 1000) } } if (!indexAdvisorResult?.index_statements?.length) return null return (
{ if (onClickIcon && !isCreatingIndex) { e.stopPropagation() onClickIcon() } }} className="cursor-pointer" > {isCreatingIndex ? ( ) : ( )}
code]:m-0 [&>code>span]:flex [&>code>span]:flex-wrap' )} />
) }