import { useParams } from 'common' import { useRouter } from 'next/router' import { useState } from 'react' import { Badge, Button, Checkbox_Shadcn_, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, IconCheck, IconChevronDown, Separator, } from 'ui' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import ShimmeringLoader from 'components/ui/ShimmeringLoader' import { usePgBouncerStatus } from 'data/config/pgbouncer-enabled-query' import { useProjectSettingsQuery } from 'data/config/project-settings-query' import { usePoolingConfigurationQuery } from 'data/database/pooling-configuration-query' import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { useDatabaseSettingsStateSnapshot } from 'state/database-settings' import Link from 'next/link' interface UsePoolerCheckboxInterface { id: string checked: boolean poolingMode: 'transaction' | 'session' | 'statement' onCheckedChange: (value: boolean) => void onSelectPoolingMode: (mode: 'transaction' | 'session') => void } export const UsePoolerCheckbox = ({ id, checked, poolingMode = 'transaction', onCheckedChange, onSelectPoolingMode, }: UsePoolerCheckboxInterface) => { const router = useRouter() const [open, setOpen] = useState(false) const { ref: projectRef } = useParams() const { project } = useProjectContext() const snap = useDatabaseSettingsStateSnapshot() const state = useDatabaseSelectorStateSnapshot() const { data, isLoading, isSuccess } = usePoolingConfigurationQuery({ projectRef }) const { data: settings, isSuccess: isSuccessSettings } = useProjectSettingsQuery({ projectRef }) const { data: pgBouncerStatus } = usePgBouncerStatus({ projectRef: projectRef }) const isDatabaseSettingsPage = router.pathname.endsWith('/settings/database') const readReplicasEnabled = project?.is_read_replicas_enabled const poolingConfiguration = readReplicasEnabled ? data?.find((x) => x.identifier === state.selectedDatabaseId) : data?.find((x) => x.database_type === 'PRIMARY') const resolvesToIpV6 = settings?.project.db_ip_addr_config === 'ipv6' const onSelectOption = (value: 'session' | 'transaction') => { onSelectPoolingMode(value) setOpen(false) } return ( <>
onCheckedChange(!checked)} />
{checked && ( <>
{isLoading && } {isSuccess && (
onSelectOption('session')} > Session mode {poolingMode === 'session' && } {poolingConfiguration?.pool_mode === 'transaction' && ( onSelectOption('transaction')} > Transaction mode {poolingMode === 'transaction' && ( )} )} {poolingConfiguration?.pool_mode === 'session' && ( <>

To use transaction mode, change the pool mode in the{' '} {isDatabaseSettingsPage ? ( { const el = document.getElementById('connection-pooler') if (el) { setOpen(false) el.scrollIntoView({ behavior: 'smooth', block: 'center', }) } }} > pooling configuration settings ) : ( pooling configuration settings )}{' '} to use transaction mode first.

You can then connect to session mode on port 5432 and transaction mode on port 6543.

)} { setOpen(false) snap.setShowPoolingModeHelper(true) }} > How to choose pooling modes?
)}
)}
{isSuccess && checked && Supavisor} {isSuccessSettings && ( {checked ? 'Resolves to IPv4' : resolvesToIpV6 ? 'Resolves to IPv6' : 'Will resolve to IPv6'} )} {pgBouncerStatus?.active && ( PgBouncer pending removal )}
) }