import { ident, safeSql } from '@supabase/pg-meta' import { toast } from 'sonner' import { Button, Card, CardContent, cn, Dialog, DialogContent, DialogFooter, DialogHeader, DialogSection, DialogSectionSeparator, DialogTitle, } from 'ui' import { Admonition } from 'ui-patterns/Admonition' import { CodeBlock } from 'ui-patterns/CodeBlock' import { DialogDisclosure, DialogDisclosureContent, DialogDisclosureTrigger, } from 'ui-patterns/DialogDisclosure' import { DocsButton } from '@/components/ui/DocsButton' import { useDatabaseExtensionEnableMutation } from '@/data/database-extensions/database-extension-enable-mutation' import { type DatabaseExtension } from '@/data/database-extensions/database-extensions-query' import { useIsOrioleDb, useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { DOCS_URL } from '@/lib/constants' const orioleExtCallOuts = ['vector', 'postgis'] interface EnableExtensionModalProps { visible: boolean extension: DatabaseExtension onCancel: () => void } export const EnableExtensionModal = ({ visible, extension, onCancel, }: EnableExtensionModalProps) => { const isOrioleDb = useIsOrioleDb() const { data: project } = useSelectedProjectQuery() // [Joshen] Hard-coding pg_cron here as this is enforced on our end (Not via pg_available_extension_versions) const defaultSchema = extension.name === 'pg_cron' ? 'pg_catalog' : extension.default_version_schema const hasFixedSchema = defaultSchema != null const { mutate: enableExtension, isPending: isEnabling } = useDatabaseExtensionEnableMutation({ onSuccess: () => { toast.success(`Extension "${extension.name}" is now enabled`) onCancel() }, onError: (error) => { toast.error(`Failed to enable ${extension.name}: ${error.message}`) }, }) const onConfirmEnable = async () => { if (project === undefined) return console.error('Project is required') enableExtension({ projectRef: project.ref, connectionString: project?.connectionString, schema: defaultSchema ?? 'extensions', name: extension.name, version: extension.default_version, cascade: true, }) } return ( { if (!open) onCancel() }} > Enable {extension.name} {isOrioleDb && orioleExtCallOuts.includes(extension.name) && ( {extension.name} cannot be accelerated by indexes on tables that are using the OrioleDB access method )}

{hasFixedSchema ? 'This extension must be installed in the schema below.' : 'This extension will be installed in the schema below.'}

Extension

{extension.name}

Schema

{defaultSchema ?? 'extensions'}
{!hasFixedSchema && ( <> Install in a different schema

We recommend using the extensions{' '} schema to keep extension objects separate from your own tables.

To use another schema, run the following in the SQL Editor. Replace{' '} target_schema with an existing schema name.

)}
) }