import { AlertCircle } from 'lucide-react' import { parseAsString, useQueryState } from 'nuqs' import { useEffect } from 'react' import { useParams } from 'common' import { ScaffoldSection } from 'components/layouts/Scaffold' import { DatabaseSelector } from 'components/ui/DatabaseSelector' import { useCustomDomainsQuery } from 'data/custom-domains/custom-domains-query' import { useLoadBalancersQuery } from 'data/read-replicas/load-balancers-query' import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { PROJECT_STATUS } from 'lib/constants' import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { Alert_Shadcn_, AlertTitle_Shadcn_, Badge, Card, CardContent, CardHeader } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import { FormLayout } from 'ui-patterns/form/Layout/FormLayout' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { PostgrestConfig } from './PostgrestConfig' export const ServiceList = () => { const { data: project, isPending: isLoading } = useSelectedProjectQuery() const { ref: projectRef } = useParams() const state = useDatabaseSelectorStateSnapshot() const [querySource, setQuerySource] = useQueryState('source', parseAsString) const { data: customDomainData } = useCustomDomainsQuery({ projectRef }) const { data: databases, isError, isPending: isLoadingDatabases, } = useReadReplicasQuery({ projectRef }) const { data: loadBalancers } = useLoadBalancersQuery({ projectRef }) useEffect(() => { if (querySource && querySource !== state.selectedDatabaseId) { state.setSelectedDatabaseId(querySource) } }, [querySource, state, projectRef]) // Get the API service const isCustomDomainActive = customDomainData?.customDomain?.status === 'active' const selectedDatabase = databases?.find((db) => db.identifier === state.selectedDatabaseId) const loadBalancerSelected = state.selectedDatabaseId === 'load-balancer' const replicaSelected = selectedDatabase?.identifier !== projectRef const endpoint = isCustomDomainActive && state.selectedDatabaseId === projectRef ? `https://${customDomainData.customDomain.hostname}` : loadBalancerSelected ? loadBalancers?.[0].endpoint ?? '' : selectedDatabase?.restUrl return ( {!isLoading && project?.status !== PROJECT_STATUS.ACTIVE_HEALTHY ? ( API settings are unavailable as the project is not active ) : ( <> Project URL 0 ? [{ id: 'load-balancer', name: 'API Load Balancer' }] : [] } onSelectId={() => { setQuerySource(null) }} /> {isLoading || isLoadingDatabases ? (
) : isError ? ( Failed to retrieve project URL ) : (

URL

Custom domain active ) : ( 'URL' ) } description={ loadBalancerSelected ? 'RESTful endpoint for querying and managing your databases through your load balancer' : replicaSelected ? 'RESTful endpoint for querying your read replica' : 'RESTful endpoint for querying and managing your database' } className="[&>div]:xl:w-1/2 [&>div>div]:w-full" >
)}
)}
) }