import { useParams } from 'common' import { AnalyticsBucket, BigQuery, Database } from 'icons' import { PropsWithChildren, useMemo } from 'react' import { Handle, Position } from 'reactflow' import { AWS_REGIONS } from 'shared-data' import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { getStatusName } from '../Pipeline.utils' import { getStatusLabel } from '../ReadReplicas/ReadReplicas.utils' import { STATUS_REFRESH_FREQUENCY_MS } from '../Replication.constants' import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' import { formatDatabaseID } from '@/data/read-replicas/replicas.utils' import { useReplicationDestinationsQuery } from '@/data/replication/destinations-query' import { useReplicationPipelineStatusQuery } from '@/data/replication/pipeline-status-query' import { useReplicationPipelinesQuery } from '@/data/replication/pipelines-query' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { BASE_PATH } from '@/lib/constants' export const NODE_WIDTH = 480 const NodeContainer = ({ className, children }: PropsWithChildren<{ className?: string }>) => { return (
{children}
) } export const PrimaryDatabaseNode = () => { const { ref: projectRef } = useParams() const { data: project } = useSelectedProjectQuery() const { data: databases = [] } = useReadReplicasQuery({ projectRef }) const hasReadReplicas = databases.some((x) => x.identifier !== projectRef) const { data: destinationsData } = useReplicationDestinationsQuery({ projectRef }) const hasDestinations = (destinationsData?.destinations ?? []).length > 0 const region = Object.values(AWS_REGIONS).find((x) => x.code === project?.region) const hasReplication = hasReadReplicas || hasDestinations return (

Primary Database

{region?.displayName}

{region?.code}

{!!project && ( region icon )} {hasReplication && }
) } export const ReplicationNode = ({ id }: { id: string }) => { const { ref: projectRef } = useParams() const { data: destinationsData } = useReplicationDestinationsQuery({ projectRef }) const destination = (destinationsData?.destinations ?? []).find((x) => x.id.toString() === id) const { data: pipelinesData } = useReplicationPipelinesQuery({ projectRef, }) const pipeline = (pipelinesData?.pipelines ?? []).find((x) => x.destination_id.toString() === id) const { data: pipelineStatusData } = useReplicationPipelineStatusQuery( { projectRef, pipelineId: pipeline?.id }, { refetchInterval: STATUS_REFRESH_FREQUENCY_MS } ) const statusName = getStatusName(pipelineStatusData?.status) const config = destination?.config ?? {} const type = 'big_query' in config ? 'BigQuery' : 'iceberg' in config ? 'Analytics Bucket' : undefined return ( {type === 'BigQuery' ? ( ) : type === 'Analytics Bucket' ? ( ) : null}

{type}

{statusName}

{destination?.name}

ID: {destination?.id}

) } export const ReadReplicaNode = ({ id }: { id: string }) => { const { ref: projectRef } = useParams() const { data: databases = [] } = useReadReplicasQuery({ projectRef }) const database = databases.find((x) => x.identifier === id) const region = Object.values(AWS_REGIONS).find((x) => x.code === database?.region) const formattedId = formatDatabaseID(database?.identifier ?? '') const statusLabel = useMemo( () => getStatusLabel({ status: database?.status }), [database?.status] ) return (

Read Replica

{statusLabel}

{region?.displayName}

ID: {formattedId} • {region?.code}
) }