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 { useDeleteDestinationPipelineMutation } from 'data/replication/delete-destination-pipeline-mutation' import { useReplicationPipelineStatusQuery } from 'data/replication/pipeline-status-query' import { Pipeline } from 'data/replication/pipelines-query' import { useStopPipelineMutation } from 'data/replication/stop-pipeline-mutation' import { PipelineStatusRequestStatus, usePipelineRequestStatus, } from 'state/replication-pipeline-request-status' import { ResponseError } from 'types' import { Button } from 'ui' import ShimmeringLoader from 'ui-patterns/ShimmeringLoader' import DeleteDestination from './DeleteDestination' import DestinationPanel from './DestinationPanel' import { getStatusName, PIPELINE_ERROR_MESSAGES } from './Pipeline.utils' import { PipelineStatus, PipelineStatusName } from './PipelineStatus' import { STATUS_REFRESH_FREQUENCY_MS } from './Replication.constants' import { RowMenu } from './RowMenu' interface DestinationRowProps { sourceId: number | undefined destinationId: number destinationName: string type: string pipeline: Pipeline | undefined error: ResponseError | null isLoading: boolean isError: boolean isSuccess: boolean } export const DestinationRow = ({ sourceId, destinationId, destinationName, type, pipeline, error: pipelineError, isLoading: isPipelineLoading, isError: isPipelineError, isSuccess: isPipelineSuccess, }: DestinationRowProps) => { const { ref: projectRef } = useParams() const [showDeleteDestinationForm, setShowDeleteDestinationForm] = useState(false) const [showEditDestinationPanel, setShowEditDestinationPanel] = useState(false) const { data: pipelineStatusData, error: pipelineStatusError, isLoading: isPipelineStatusLoading, isError: isPipelineStatusError, isSuccess: isPipelineStatusSuccess, } = useReplicationPipelineStatusQuery( { projectRef, pipelineId: pipeline?.id, }, { refetchInterval: STATUS_REFRESH_FREQUENCY_MS } ) const { getRequestStatus, updatePipelineStatus } = usePipelineRequestStatus() const requestStatus = pipeline?.id ? getRequestStatus(pipeline.id) : PipelineStatusRequestStatus.None const { mutateAsync: stopPipeline } = useStopPipelineMutation() const { mutateAsync: deleteDestinationPipeline } = useDeleteDestinationPipelineMutation({}) const pipelineStatus = pipelineStatusData?.status const statusName = getStatusName(pipelineStatus) const onDeleteClick = async () => { if (!projectRef) { return console.error('Project ref is required') } if (!pipeline) { return toast.error(PIPELINE_ERROR_MESSAGES.NO_PIPELINE_FOUND) } try { await stopPipeline({ projectRef, pipelineId: pipeline.id }) await deleteDestinationPipeline({ projectRef, destinationId: destinationId, pipelineId: pipeline.id, }) } catch (error) { toast.error(PIPELINE_ERROR_MESSAGES.DELETE_DESTINATION) } } useEffect(() => { if (pipeline?.id) { updatePipelineStatus(pipeline.id, statusName) } }, [pipeline?.id, statusName, updatePipelineStatus]) return ( <> {isPipelineError && ( )} {isPipelineSuccess && ( {isPipelineLoading ? : destinationName} {isPipelineLoading ? : type} {isPipelineLoading || !pipeline ? ( ) : ( )} {isPipelineLoading || !pipeline ? ( ) : ( pipeline.config.publication_name )}
setShowDeleteDestinationForm(true)} onEditClick={() => setShowEditDestinationPanel(true)} />
)} setShowEditDestinationPanel(false)} sourceId={sourceId} existingDestination={{ sourceId, destinationId: destinationId, pipelineId: pipeline?.id, enabled: statusName === PipelineStatusName.STARTED, }} /> ) }