// @ts-nocheck [Joshen] Temporarily silencing the TS checks here but please eventually remove // it's cause the API types are conflicting a bit - API types have probably been updated for the UI here // but the UI hasn't been updated yet to fit the new API types import { Activity, ChevronLeft, ExternalLink, Search, X } from 'lucide-react' import Link from 'next/link' import { useEffect, useState } from 'react' import { toast } from 'sonner' import { useParams } from 'common' import Table from 'components/to-be-cleaned/Table' import AlertError from 'components/ui/AlertError' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { useReplicationPipelineByIdQuery } from 'data/replication/pipeline-by-id-query' import { useReplicationPipelineReplicationStatusQuery } from 'data/replication/pipeline-replication-status-query' import { useReplicationPipelineStatusQuery } from 'data/replication/pipeline-status-query' import { useStartPipelineMutation } from 'data/replication/start-pipeline-mutation' import { useStopPipelineMutation } from 'data/replication/stop-pipeline-mutation' import { PipelineStatusRequestStatus, usePipelineRequestStatus, } from 'state/replication-pipeline-request-status' import { Badge, Button, cn } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns' import { Input } from 'ui-patterns/DataInputs/Input' import { ErroredTableDetails } from './ErroredTableDetails' import { getStatusName, PIPELINE_ERROR_MESSAGES } from './Pipeline.utils' import { PipelineStatus } from './PipelineStatus' import { STATUS_REFRESH_FREQUENCY_MS } from './Replication.constants' import { TableState } from './ReplicationPipelineStatus.types' import { getDisabledStateConfig, getStatusConfig } from './ReplicationPipelineStatus.utils' /** * Component for displaying replication pipeline status and table replication details. * Supports both legacy 'error' state and new 'errored' state with retry policies. */ export const ReplicationPipelineStatus = () => { const { ref: projectRef, pipelineId: _pipelineId } = useParams() const [filterString, setFilterString] = useState('') const pipelineId = Number(_pipelineId) const { getRequestStatus, updatePipelineStatus, setRequestStatus } = usePipelineRequestStatus() const requestStatus = getRequestStatus(pipelineId) const { data: pipeline, error: pipelineError, isLoading: isPipelineLoading, isError: isPipelineError, } = useReplicationPipelineByIdQuery({ projectRef, pipelineId, }) const { data: pipelineStatusData, error: pipelineStatusError, isLoading: isPipelineStatusLoading, isError: isPipelineStatusError, isSuccess: isPipelineStatusSuccess, } = useReplicationPipelineStatusQuery( { projectRef, pipelineId }, { enabled: !!pipelineId, refetchInterval: STATUS_REFRESH_FREQUENCY_MS, } ) const { data: replicationStatusData, error: statusError, isLoading: isStatusLoading, isError: isStatusError, } = useReplicationPipelineReplicationStatusQuery( { projectRef, pipelineId }, { enabled: !!pipelineId, refetchInterval: STATUS_REFRESH_FREQUENCY_MS, } ) const { mutateAsync: startPipeline, isLoading: isStartingPipeline } = useStartPipelineMutation() const { mutateAsync: stopPipeline, isLoading: isStoppingPipeline } = useStopPipelineMutation() const destinationName = pipeline?.destination_name const statusName = getStatusName(pipelineStatusData?.status) const config = getDisabledStateConfig({ requestStatus, statusName }) const tableStatuses = replicationStatusData?.table_statuses || [] const filteredTableStatuses = filterString.length === 0 ? tableStatuses : tableStatuses.filter((table: TableState) => table.table_name.toLowerCase().includes(filterString.toLowerCase()) ) const isPipelineRunning = statusName === 'started' const hasTableData = tableStatuses.length > 0 const isEnablingDisabling = requestStatus === PipelineStatusRequestStatus.EnableRequested || requestStatus === PipelineStatusRequestStatus.DisableRequested const showDisabledState = !isPipelineRunning || isEnablingDisabling const onTogglePipeline = async () => { if (!projectRef) { return console.error('Project ref is required') } if (!pipeline) { return toast.error(PIPELINE_ERROR_MESSAGES.NO_PIPELINE_FOUND) } try { if (statusName === 'stopped') { await startPipeline({ projectRef, pipelineId: pipeline.id }) setRequestStatus(pipeline.id, PipelineStatusRequestStatus.EnableRequested) } else if (statusName === 'started') { await stopPipeline({ projectRef, pipelineId: pipeline.id }) setRequestStatus(pipeline.id, PipelineStatusRequestStatus.DisableRequested) } } catch (error) { toast.error(PIPELINE_ERROR_MESSAGES.ENABLE_DESTINATION) } } useEffect(() => { updatePipelineStatus(pipelineId, statusName) }, [pipelineId, statusName, updatePipelineStatus]) return (

{destinationName || 'Pipeline'}

setFilterString(e.target.value)} actions={ filterString.length > 0 ? [ setFilterString('')} />, ] : undefined } />
{(isPipelineLoading || isStatusLoading) && } {isPipelineError && ( )} {isStatusError && ( )} {hasTableData && (
{showDisabledState && (
{config.icon}

{config.title}

{config.message}

)}
Table, Status, Details, ]} body={ <> {filteredTableStatuses.length === 0 && hasTableData && (

No results found

Your search for "{filterString}" did not return any results

)} {filteredTableStatuses.map((table: TableState, index: number) => { const statusConfig = getStatusConfig(table.state) return (

{table.table_name}

} tooltip={{ content: { side: 'bottom', text: 'Open in Table Editor' }, }} >
{showDisabledState ? ( Not Available ) : ( statusConfig.badge )} {showDisabledState ? (

Status unavailable while pipeline is {config.badge.toLowerCase()}

) : (
{statusConfig.description}
{'lag' in table.state && (
Lag: {table.state.lag}ms
)} {table.state.name === 'error' && ( )}
)}
) })} } /> )} {!isStatusLoading && tableStatuses.length === 0 && (

{showDisabledState ? 'Pipeline Not Running' : 'No table status information'}

{showDisabledState ? `The replication pipeline is currently ${statusName || 'not active'}. Table status information is not available while the pipeline is in this state.` : `This pipeline doesn't have any table replication status data available yet. The status will appear here once replication begins.`}

Data refreshes automatically every 2 seconds

)} ) }