import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { useRouter } from 'next/router' import { cn } from 'ui' import { CodeBlock } from 'ui-patterns/CodeBlock' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { buildDirectPostgresConnectionUri, buildLogicalBackupShellScript, DB_PASSWORD_PLACEHOLDER, } from './LogicalBackupCliInstructions.utils' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import { InlineLink } from '@/components/ui/InlineLink' import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { DOCS_URL } from '@/lib/constants' export type LogicalBackupCliInstructionsProps = { enabled?: boolean className?: string showResetPassword?: boolean note?: string } export const LogicalBackupCliInstructions = ({ enabled = true, className, showResetPassword = true, note, }: LogicalBackupCliInstructionsProps) => { const router = useRouter() const { ref } = useParams() const { data: project } = useSelectedProjectQuery() const { can: canResetDbPassword } = useAsyncCheckPermissions( PermissionAction.UPDATE, 'projects', { resource: { project_id: project?.id, }, } ) const { data: settings, isSuccess, isError, } = useProjectSettingsV2Query({ projectRef: ref }, { enabled: enabled && Boolean(ref) }) const connectionUri = isSuccess && settings ? buildDirectPostgresConnectionUri({ db_user: settings.db_user, db_host: settings.db_host, db_port: settings.db_port, db_name: settings.db_name, }) : null const shellScript = connectionUri ? buildLogicalBackupShellScript(connectionUri) : '' const resetPasswordHref = ref ? `/project/${ref}/database/settings#database-password` : '#' const resetDisabled = !canResetDbPassword return (
Use your direct connection string — replace {DB_PASSWORD_PLACEHOLDER} with your database
password.{' '}
Any reserved character in your password must be percent-encoded in the URL (e.g.{' '}
@ → %40, : → %3A,{' '}
/ → %2F, # → %23).
Encode % as %25 first.
{note}
} {isError && (
Could not load connection details. Open{' '}