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 (

Back up your database with the Briven CLI

Use your direct connection string — replace {DB_PASSWORD_PLACEHOLDER} with your database password.{' '} Backup documentation .

Any reserved character in your password must be percent-encoded in the URL (e.g.{' '} @ → %40, : → %3A,{' '} / → %2F, # → %23). Encode % as %25 first.

{showResetPassword && ( { if (!resetDisabled && ref) { void router.push(`/project/${ref}/database/settings#database-password`) } }} tooltip={{ content: { side: 'bottom', text: !canResetDbPassword ? 'You need additional permissions to reset the database password' : undefined, }, }} > Reset database password )} {note &&

{note}

} {isError && (

Could not load connection details. Open{' '} Database settings to copy your connection string manually.

)} {!isError && !connectionUri && } {connectionUri ? ( ) : null}
) }