import { ChevronDown } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { useState } from 'react' import { useParams } from 'common' 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 { Badge, Button, Checkbox_Shadcn_, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, Label_Shadcn_, Separator, } from 'ui' import { DropdownMenuRadioGroup, DropdownMenuRadioItem, } from 'ui/src/components/shadcn/ui/dropdown-menu' interface UsePoolerCheckboxInterface { id: string checked: boolean poolingMode: 'transaction' | 'session' ipv4AddonAdded: boolean onCheckedChange: (value: boolean) => void onSelectPoolingMode: (mode: 'transaction' | 'session') => void } export const UsePoolerCheckbox = ({ id, checked, poolingMode = 'transaction', ipv4AddonAdded, onCheckedChange, onSelectPoolingMode, }: UsePoolerCheckboxInterface) => { const router = useRouter() const [open, setOpen] = useState(false) const { ref: projectRef } = useParams() 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 poolingConfiguration = data?.find((x) => x.identifier === state.selectedDatabaseId) const resolvesToIpV6 = settings?.project.db_ip_addr_config === 'ipv6' const onSelectOption = (value: 'session' | 'transaction') => { onSelectPoolingMode(value) setOpen(false) } return (
onCheckedChange(!checked)} />
Display connection pooler {checked && ( <>
{isLoading && } {isSuccess && (
onSelectOption(value as 'session' | 'transaction') } > Session mode {poolingConfiguration?.pool_mode === 'transaction' && ( Transaction mode )} {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 || ipv4AddonAdded ? 'Resolves to IPv4' : resolvesToIpV6 ? 'Resolves to IPv6' : 'Will resolve to IPv6'} )} {pgBouncerStatus?.active && ( PgBouncer pending removal )}
) }