import { useParams } from 'common' import { Database as DatabaseIcon } from 'icons' import { Loader2, Minus, MoreVertical, RotateCcw, Trash } from 'lucide-react' import Link from 'next/link' import { useMemo, useState } from 'react' import { AWS_REGIONS } from 'shared-data' import { Badge, Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, TableCell, TableRow, Tooltip, TooltipContent, TooltipTrigger, } from 'ui' import { ShimmeringLoader } from 'ui-patterns' import { getIsInTransition, getStatusLabel } from './ReadReplicas.utils' import { DropReplicaConfirmationModal } from '@/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DropReplicaConfirmationModal' import { REPLICA_STATUS } from '@/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.constants' import { RestartReplicaConfirmationModal } from '@/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/RestartReplicaConfirmationModal' import { useReplicationLagQuery } from '@/data/read-replicas/replica-lag-query' import { type Database } from '@/data/read-replicas/replicas-query' import { formatDatabaseID } from '@/data/read-replicas/replicas.utils' interface ReadReplicaRow { replica: Database onUpdateReplica: () => void } export const ReadReplicaRow = ({ replica, onUpdateReplica }: ReadReplicaRow) => { const { ref } = useParams() const { identifier, region, status } = replica const formattedId = formatDatabaseID(identifier ?? '') const { data: lagDuration, isPending: isLoadingLag, isError: isErrorLag, } = useReplicationLagQuery( { id: identifier, projectRef: ref, connectionString: replica.connectionString, }, { enabled: status === REPLICA_STATUS.ACTIVE_HEALTHY } ) const [showConfirmRestart, setShowConfirmRestart] = useState(false) const [showConfirmDrop, setShowConfirmDrop] = useState(false) const regionMeta = Object.values(AWS_REGIONS).find((x) => x.code === region) const isInTransition = useMemo(() => getIsInTransition({ status }), [status]) const statusLabel = useMemo(() => getStatusLabel({ status }), [status]) return ( <> Read Replica (ID: {formattedId}) {regionMeta?.displayName} {regionMeta?.code} {statusLabel} {isInTransition && } {isErrorLag || status !== REPLICA_STATUS.ACTIVE_HEALTHY ? ( ) : isLoadingLag ? ( ) : ( {lagDuration}s )} View replication } className="w-7" /> setShowConfirmRestart(true)} > Restart replica setShowConfirmDrop(true)} > Drop replica onUpdateReplica()} onCancel={() => setShowConfirmDrop(false)} /> onUpdateReplica()} onCancel={() => setShowConfirmRestart(false)} /> > ) }
Read Replica (ID: {formattedId})
{regionMeta?.displayName}
{lagDuration}s