import { PermissionAction } from '@supabase/shared-types/out/constants' import { Label } from '@ui/components/shadcn/ui/label' import { getConnectionStrings } from 'components/interfaces/Connect/DatabaseSettings.utils' import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { pluckObjectFields } from 'lib/helpers' import { Plug } from 'lucide-react' import { parseAsBoolean, useQueryState } from 'nuqs' import { useMemo, useState, type ReactNode } from 'react' import { Button, HoverCard, HoverCardContent, HoverCardTrigger } from 'ui' import { ShimmeringLoader } from 'ui-patterns' import { Input } from 'ui-patterns/DataInputs/Input' import { useProjectApiUrl } from '@/data/config/project-endpoint-query' const DB_FIELDS = ['db_host', 'db_name', 'db_port', 'db_user'] as const const EMPTY_CONNECTION_INFO = { db_user: '', db_host: '', db_port: '', db_name: '', } const DetailRow = ({ label, children }: { label: string; children: ReactNode }) => { return (
{children}
) } interface ProjectConnectionHoverCardProps { projectRef?: string } export const ProjectConnectionHoverCard = ({ projectRef }: ProjectConnectionHoverCardProps) => { const [open, setOpen] = useState(false) const [, setShowConnect] = useQueryState('showConnect', parseAsBoolean.withDefault(false)) const { isLoading: isLoadingPermissions, can: canReadAPIKeys } = useAsyncCheckPermissions( PermissionAction.READ, 'service_api_keys' ) const { data: projectUrl, isPending: isLoadingApiUrl } = useProjectApiUrl({ projectRef }) const { data: apiKeys, isLoading: isLoadingKeys } = useAPIKeysQuery( { projectRef }, { enabled: open && canReadAPIKeys } ) const { publishableKey } = canReadAPIKeys ? getKeys(apiKeys) : { publishableKey: null } const { data: databases, isLoading: isLoadingDatabases } = useReadReplicasQuery( { projectRef }, { enabled: open && !!projectRef } ) const primaryDatabase = databases?.find((db) => db.identifier === projectRef) const directConnectionString = useMemo(() => { if ( !primaryDatabase?.db_host || !primaryDatabase?.db_name || !primaryDatabase?.db_user || !primaryDatabase?.db_port ) { return '' } const connectionInfo = pluckObjectFields(primaryDatabase, [...DB_FIELDS]) return getConnectionStrings({ connectionInfo: { ...EMPTY_CONNECTION_INFO, ...connectionInfo }, metadata: { projectRef }, }).direct.uri }, [primaryDatabase, projectRef]) return (

Data API

{isLoadingPermissions || isLoadingKeys ? (
Loading publishable key...
) : canReadAPIKeys ? ( ) : (
You don't have permission to view API keys.
)}

Database

{isLoadingDatabases ? (
Loading connection string...
) : ( )}
) }