mirror of
https://github.com/supabase/supabase.git
synced 2026-10-07 02:15:05 +03:00
## Context Main fix is to adjust the new home page + connect dialog (and connect sheet) to render the project's custom domain if available <img width="471" height="255" alt="image" src="https://github.com/user-attachments/assets/3a208b2e-bdeb-43f5-a2e7-3495881dbaaa" /> <img width="1065" height="233" alt="image" src="https://github.com/user-attachments/assets/2a7b8f81-8c0b-4803-bf0a-fc16a2f1e0e1" /> ## Changes involved - Created a `useProjectApiUrl` hook that will return the API URL depending if custom domains is available, otherwise default to default project API URL - Refactored all the other places that were manually deriving the project's endpoint - Storage Explorer -> copy URL - Edge Functions - Integrations -> Data API + API Docs - Auth Providers -> Callback URL - Also updated the copy CTA for the addons page - Instead of just "Change xxx", make it a bit more actionable - For add ons with binary states (Custom domains, IPv4) - If not enabled yet, "Enable xxx", otherwise "Toggle xxx" - For PITR - If not enabled yet, "Enable PITR", otherwise "Change recovery duration" - Also added "Edit custom domain" CTA if enabled <img width="1144" height="518" alt="image" src="https://github.com/user-attachments/assets/4f152ea5-0cc7-412c-95e8-ad5bb37c19c3" /> ## To test - [ ] Verify that for a project with custom domain set up, all the affected UI mentioned in the above section look correct
72 lines
2.0 KiB
TypeScript
72 lines
2.0 KiB
TypeScript
import type { ProjectJsonSchemaPaths } from '@/data/docs/project-json-schema-query'
|
|
import type { LoadBalancer } from '@/data/read-replicas/load-balancers-query'
|
|
import type { Database } from '@/data/read-replicas/replicas-query'
|
|
import { snakeToCamel } from '@/lib/helpers'
|
|
|
|
/**
|
|
* Resolves the API endpoint URL based on the selected database, custom domain
|
|
* status, and load balancer configuration.
|
|
*/
|
|
export function getApiEndpoint({
|
|
selectedDatabaseId,
|
|
projectRef,
|
|
resolvedEndpoint,
|
|
loadBalancers,
|
|
selectedDatabase,
|
|
}: {
|
|
selectedDatabaseId: string | undefined
|
|
projectRef: string | undefined
|
|
resolvedEndpoint: string | undefined
|
|
loadBalancers: Array<LoadBalancer> | undefined
|
|
selectedDatabase: Database | undefined
|
|
}): string {
|
|
const loadBalancerSelected = selectedDatabaseId === 'load-balancer'
|
|
|
|
if (selectedDatabaseId === projectRef && !!resolvedEndpoint) {
|
|
return resolvedEndpoint
|
|
}
|
|
|
|
if (loadBalancerSelected) {
|
|
return loadBalancers?.[0]?.endpoint ?? ''
|
|
}
|
|
|
|
return selectedDatabase?.restUrl ?? ''
|
|
}
|
|
|
|
export type EnrichedEntity = { id: string; displayName: string; camelCase: string }
|
|
export type EntityMap = Record<string, EnrichedEntity>
|
|
|
|
/**
|
|
* Partitions JSON schema paths into resource and RPC entity maps.
|
|
*/
|
|
export function buildEntityMaps(paths: ProjectJsonSchemaPaths | undefined): {
|
|
resources: EntityMap
|
|
rpcs: EntityMap
|
|
} {
|
|
const RPC_PREFIX = 'rpc/'
|
|
|
|
return Object.keys(paths ?? {}).reduce<{ resources: EntityMap; rpcs: EntityMap }>(
|
|
(acc, name) => {
|
|
const trimmedName = name.slice(1)
|
|
if (!trimmedName.length) return acc
|
|
|
|
const isRpc = trimmedName.startsWith(RPC_PREFIX)
|
|
const id = isRpc ? trimmedName.slice(RPC_PREFIX.length) : trimmedName
|
|
const enriched: EnrichedEntity = {
|
|
id,
|
|
displayName: id.replace(/_/g, ' '),
|
|
camelCase: snakeToCamel(id),
|
|
}
|
|
|
|
if (isRpc) {
|
|
acc.rpcs[id] = enriched
|
|
} else {
|
|
acc.resources[id] = enriched
|
|
}
|
|
|
|
return acc
|
|
},
|
|
{ resources: {}, rpcs: {} }
|
|
)
|
|
}
|