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 (
Supabase Vault is a Postgres extension for managing secrets and encryption inside your database without leaking any sensitive information.
Vault is not available for this project yet.
Do reach out to us if you're interested!