import { JwtSecretUpdateError, JwtSecretUpdateStatus } from '@supabase/shared-types/out/events' import { useQueryClient } from '@tanstack/react-query' import { useEffect, useRef } from 'react' import toast from 'react-hot-toast' import { useParams } from 'common' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import DatabaseSelector from 'components/ui/DatabaseSelector' import Panel from 'components/ui/Panel' import { DisplayApiSettings } from 'components/ui/ProjectSettings' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { useJwtSecretUpdatingStatusQuery } from 'data/config/jwt-secret-updating-status-query' import { configKeys } from 'data/config/keys' import { useProjectApiQuery } from 'data/config/project-api-query' 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 { PROJECT_STATUS } from 'lib/constants' import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { Badge, IconAlertCircle, Input } from 'ui' import { JWT_SECRET_UPDATE_ERROR_MESSAGES } from './API.constants' import JWTSettings from './JWTSettings' import PostgrestConfig from './PostgrestConfig' const ServiceList = () => { const client = useQueryClient() const { project, isLoading } = useProjectContext() const { ref: projectRef, source } = useParams() const state = useDatabaseSelectorStateSnapshot() const showReadReplicasUI = project?.is_read_replicas_enabled const { data: settings, isError } = useProjectApiQuery({ projectRef, }) const { data: customDomainData } = useCustomDomainsQuery({ projectRef }) const { data: databases } = useReadReplicasQuery({ projectRef }) const { data: loadBalancers } = useLoadBalancersQuery({ projectRef }) const { data } = useJwtSecretUpdatingStatusQuery({ projectRef }) const jwtSecretUpdateStatus = data?.jwtSecretUpdateStatus const jwtSecretUpdateError = data?.jwtSecretUpdateError const previousJwtSecretUpdateStatus = useRef() const { Failed, Updated, Updating } = JwtSecretUpdateStatus const jwtSecretUpdateErrorMessage = JWT_SECRET_UPDATE_ERROR_MESSAGES[jwtSecretUpdateError as JwtSecretUpdateError] // Get the API service const isCustomDomainActive = customDomainData?.customDomain?.status === 'active' const apiService = settings?.autoApiService const apiUrl = `${apiService?.protocol ?? 'https'}://${apiService?.endpoint ?? '-'}` const selectedDatabase = databases?.find((db) => db.identifier === state.selectedDatabaseId) const loadBalancerSelected = state.selectedDatabaseId === 'load-balancer' const replicaSelected = selectedDatabase?.identifier !== projectRef const primaryEndpoint = isCustomDomainActive ? `https://${customDomainData.customDomain.hostname}` : apiUrl const endpoint = !showReadReplicasUI ? primaryEndpoint : isCustomDomainActive && state.selectedDatabaseId === projectRef ? `https://${customDomainData.customDomain.hostname}` : loadBalancerSelected ? loadBalancers?.[0].endpoint ?? '' : selectedDatabase?.restUrl useEffect(() => { if (previousJwtSecretUpdateStatus.current === Updating) { switch (jwtSecretUpdateStatus) { case Updated: client.invalidateQueries(configKeys.api(projectRef)) client.invalidateQueries(configKeys.settings(projectRef)) client.invalidateQueries(configKeys.postgrest(projectRef)) toast.success('Successfully updated JWT secret') break case Failed: toast.error(`JWT secret update failed: ${jwtSecretUpdateErrorMessage}`) break } } previousJwtSecretUpdateStatus.current = jwtSecretUpdateStatus }, [jwtSecretUpdateStatus]) useEffect(() => { if (showReadReplicasUI && source !== undefined) { state.setSelectedDatabaseId('load-balancer') } }, [source]) return (

API Settings

{isLoading ? ( ) : project?.status !== PROJECT_STATUS.ACTIVE_HEALTHY ? (

API Settings

API settings are unavailable as the project is not active

) : ( <>
Project URL
{showReadReplicasUI && ( 0 ? [{ id: 'load-balancer', name: 'API Load Balancer' }] : [] } /> )}
} > {isError ? (

Failed to retrieve project URL

) : (

URL

Custom domain active ) : ( 'URL' ) } readOnly disabled className="input-mono" value={endpoint} descriptionText={ loadBalancerSelected ? 'A RESTful endpoint for querying and managing your databases through your load balancer' : replicaSelected && showReadReplicasUI ? 'A RESTful endpoint for querying your read replica' : 'A RESTful endpoint for querying and managing your database' } layout="horizontal" /> )}
)} ) } export default ServiceList