import * as Tooltip from '@radix-ui/react-tooltip' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useTheme } from 'next-themes' import Link from 'next/link' import { useState } from 'react' import { toast } from 'sonner' import { useParams } from 'common' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { useDatabaseExtensionEnableMutation } from 'data/database-extensions/database-extension-enable-mutation' import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { BASE_PATH } from 'lib/constants' import { Button } from 'ui' import { ExternalLink } from 'lucide-react' const WrappersDisabledState = () => { const { ref } = useParams() const { resolvedTheme } = useTheme() const { project } = useProjectContext() const { data } = useDatabaseExtensionsQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) const wrappersExtension = (data ?? []).find((ext) => ext.name === 'wrappers') const vaultExtension = (data ?? []).find((ext) => ext.name === 'supabase_vault') const isNotAvailable = wrappersExtension === undefined || vaultExtension === undefined const [isEnabling, setIsEnabling] = useState(false) const canToggleWrappers = useCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'extensions' ) const { mutateAsync: enableExtension } = useDatabaseExtensionEnableMutation({ onError: () => {} }) const onEnableWrappers = async () => { if (wrappersExtension === undefined || vaultExtension === undefined) return if (project === undefined) return console.error('Project is required') let hasError = false try { setIsEnabling(true) await Promise.all([ enableExtension({ projectRef: project.ref, connectionString: project.connectionString, schema: wrappersExtension.schema ?? 'extensions', name: wrappersExtension.name, version: wrappersExtension.default_version, cascade: true, }), enableExtension({ projectRef: project.ref, connectionString: project.connectionString, schema: vaultExtension.schema ?? 'vault', name: vaultExtension.name, version: vaultExtension.default_version, cascade: true, }), ]) } catch (error: any) { if (!error.message.includes('already exists')) { hasError = true toast.error(`Failed to enable Wrappers: ${error.message}`) } } finally { setIsEnabling(false) if (!hasError) toast.success('Wrappers are now enabled!') } } return (

Supabase Wrappers

Supabase Wrappers is a framework for building Postgres Foreign Data Wrappers (FDW) which connect Postgres to external systems. Query your data warehouse or third-party APIs directly from your database.

{isNotAvailable ? (

Wrappers is not available for this project yet.

Do reach out to us if you're interested!

) : (
{!canToggleWrappers && (
You need additional permissions to enable Wrappers for this project
)}
)}
) } export default WrappersDisabledState