import { AlertTriangle, Loader2 } from 'lucide-react' import { useParams } from 'common' import { DotPing } from 'components/ui/DotPing' import { InlineLink } from 'components/ui/InlineLink' import { ReplicationPipelineStatusData } from 'data/replication/pipeline-status-query' import { PipelineStatusRequestStatus } from 'state/replication-pipeline-request-status' import type { ResponseError } from 'types' import { cn, Tooltip, TooltipContent, TooltipTrigger, WarningIcon } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { getPipelineStateMessages } from './Pipeline.utils' import { PipelineStatusName } from './Replication.constants' interface PipelineStatusProps { pipelineStatus: ReplicationPipelineStatusData['status'] | undefined error: ResponseError | null isLoading: boolean isError: boolean isSuccess: boolean requestStatus?: PipelineStatusRequestStatus pipelineId?: number } export const PipelineStatus = ({ pipelineStatus, error, isLoading, isError, isSuccess, requestStatus, pipelineId, }: PipelineStatusProps) => { const { ref } = useParams() // Map backend statuses to UX-friendly display const getStatusConfig = () => { const statusName = pipelineStatus && typeof pipelineStatus === 'object' && 'name' in pipelineStatus ? pipelineStatus.name : undefined // Get consistent tooltip message using the same logic as other components const stateMessages = getPipelineStateMessages(requestStatus, statusName) // Show optimistic request state while backend still reports steady states if (requestStatus === PipelineStatusRequestStatus.RestartRequested) { return { label: 'Restarting', dot: , color: 'text-warning', tooltip: stateMessages.message, } } if (requestStatus === PipelineStatusRequestStatus.StartRequested) { return { label: 'Starting', dot: , color: 'text-warning', tooltip: stateMessages.message, } } if (requestStatus === PipelineStatusRequestStatus.StopRequested) { return { label: 'Stopping', dot: , color: 'text-warning', tooltip: stateMessages.message, } } if (pipelineStatus && typeof pipelineStatus === 'object' && 'name' in pipelineStatus) { switch (pipelineStatus.name) { case PipelineStatusName.FAILED: return { label: 'Failed', dot: , color: 'text-destructive-600', tooltip: stateMessages.message, } case PipelineStatusName.STARTING: return { label: 'Starting', dot: , color: 'text-warning', tooltip: stateMessages.message, } case PipelineStatusName.STARTED: return { label: 'Running', dot: , color: 'text-brand-600', tooltip: stateMessages.message, } case PipelineStatusName.STOPPED: return { label: 'Stopped', dot:
, color: 'text-foreground-light', tooltip: stateMessages.message, } case PipelineStatusName.STOPPING: return { label: 'Stopping', dot: , color: 'text-warning', tooltip: stateMessages.message, } case PipelineStatusName.UNKNOWN: return { label: 'Unknown', dot:
, color: 'text-warning', tooltip: stateMessages.message, } default: return { label: 'Unknown', dot:
, color: 'text-destructive-600', tooltip: stateMessages.message, } } } // Fallback for undefined or invalid status return { label: 'Unknown', dot:
, color: 'text-destructive-600', tooltip: 'Pipeline status is unclear - check logs for details', } } const statusConfig = getStatusConfig() const pipelineLogsUrl = pipelineId ? `/project/${ref}/logs/replication-logs?f=${encodeURIComponent( JSON.stringify({ pipeline_id: pipelineId }) )}` : `/project/${ref}/logs/replication-logs` return ( <> {isLoading && } {isError && ( Unable to retrieve status: {error?.message} )} {isSuccess && (
{statusConfig.dot} {statusConfig.label}
{statusConfig.tooltip} {['unknown', 'failed'].includes(pipelineStatus?.name ?? '') && ( <> {' '} Check the logs for more information. )}
)} ) }