import { useState } from 'react' import { toast } from 'sonner' import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, Button, } from 'ui' import { getIndexAdvisorExtensions } from './index-advisor.utils' import { useDatabaseExtensionEnableMutation } from '@/data/database-extensions/database-extension-enable-mutation' import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { useTrack } from '@/lib/telemetry/track' export const EnableIndexAdvisorButton = () => { const track = useTrack() const [isDialogOpen, setIsDialogOpen] = useState(false) return ( <> ) } export const EnableIndexAdvisorDialog = ({ open, setOpen, }: { open: boolean setOpen: (value: boolean) => void }) => { const track = useTrack() const { data: project } = useSelectedProjectQuery() const { data: extensions } = useDatabaseExtensionsQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) const { hypopg, indexAdvisor } = getIndexAdvisorExtensions(extensions) const { mutateAsync: enableExtension, isPending: isEnablingExtension } = useDatabaseExtensionEnableMutation() const onEnableIndexAdvisor = async () => { if (project === undefined) return toast.error('Project is required') try { // Enable hypopg extension if not already installed if (hypopg?.installed_version === null) { await enableExtension({ projectRef: project?.ref, connectionString: project?.connectionString, name: hypopg.name, schema: hypopg?.schema ?? 'extensions', version: hypopg.default_version, }) } // Enable index_advisor extension if not already installed if (indexAdvisor?.installed_version === null) { await enableExtension({ projectRef: project?.ref, connectionString: project?.connectionString, name: indexAdvisor.name, schema: indexAdvisor?.schema ?? 'extensions', version: indexAdvisor.default_version, }) } toast.success('Successfully enabled Index Advisor!') setOpen(false) } catch (error: any) { toast.error(`Failed to enable Index Advisor: ${error.message}`) } } return ( setOpen(!open)}> Enable Index Advisor

The Index Advisor recommends indexes to improve query performance on your tables based on your actual query patterns.

Enable this will install the index_advisor{' '} and hypopg Postgres extensions so Index Advisor can analyse queries and suggest performance-improving indexes.

Cancel { e.preventDefault() onEnableIndexAdvisor() track('index_advisor_enable_button_clicked', { origin: 'dialog' }) }} disabled={isEnablingExtension} > {isEnablingExtension ? 'Enabling...' : 'Enable'}
) }