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 { executeSql } from 'data/sql/execute-sql-query' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { BASE_PATH } from 'lib/constants' import { Button } from 'ui' import { ExternalLink } from 'lucide-react' const VaultToggle = () => { const { ref } = useParams() const { resolvedTheme } = useTheme() const { project } = useProjectContext() const [isEnabling, setIsEnabling] = useState(false) const canToggleVault = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'extensions') const { data } = useDatabaseExtensionsQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) const vaultExtension = (data ?? []).find((ext) => ext.name === 'supabase_vault') const isNotAvailable = vaultExtension === undefined const { mutate: enableExtension } = useDatabaseExtensionEnableMutation({ onSuccess: () => { toast.success(`Vault is now enabled for your project!`) }, onError: (error) => { toast.error(`Failed to enable Vault for your project: ${error.message}`) setIsEnabling(false) }, }) const onEnableVault = async () => { if (vaultExtension === undefined) return if (project === undefined) return console.error('Project is required') setIsEnabling(true) try { await executeSql({ projectRef: project.ref, connectionString: project.connectionString, sql: `create schema if not exists ${vaultExtension.schema ?? 'vault'};`, }) } catch (createSchemaError: any) { setIsEnabling(false) return toast.error(`Failed to create schema: ${createSchemaError.message}`) } enableExtension({ projectRef: project.ref, connectionString: project.connectionString, schema: vaultExtension.schema ?? 'vault', name: vaultExtension.name, version: vaultExtension.default_version, cascade: true, }) } return (

Enable Vault today

Supabase Vault is a Postgres extension for managing secrets and encryption inside your database without leaking any sensitive information.

{isNotAvailable ? (

Vault is not available for this project yet.

Do reach out to us if you're interested!

) : (
{!canToggleVault && (
You need additional permissions to enable Vault for this project
)}
)}
) } export default VaultToggle