import { Edit, MoreVertical, Pause, Play, Trash } from 'lucide-react' import { toast } from 'sonner' import { useParams } from 'common' import AlertError from 'components/ui/AlertError' import { Pipeline } from 'data/replication/pipelines-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 { ResponseError } from 'types' import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from 'ui' import ShimmeringLoader from 'ui-patterns/ShimmeringLoader' import { PIPELINE_DISABLE_ALLOWED_FROM, PIPELINE_ENABLE_ALLOWED_FROM, PIPELINE_ERROR_MESSAGES, getStatusName, } from './Pipeline.utils' import { PipelineStatusName } from './PipelineStatus' interface RowMenuProps { pipeline: Pipeline | undefined pipelineStatus: any error: ResponseError | null isLoading: boolean isError: boolean onEditClick: () => void onDeleteClick: () => void } export const RowMenu = ({ pipeline, pipelineStatus, error, isLoading, isError, onEditClick, onDeleteClick, }: RowMenuProps) => { const { ref: projectRef } = useParams() const statusName = getStatusName(pipelineStatus) const pipelineEnabled = statusName !== PipelineStatusName.STOPPED const { mutateAsync: startPipeline } = useStartPipelineMutation() const { mutateAsync: stopPipeline } = useStopPipelineMutation() const { setRequestStatus: setGlobalRequestStatus } = usePipelineRequestStatus() const onEnablePipeline = async () => { if (!projectRef) { return console.error('Project ref is required') } if (!pipeline) { return toast.error(PIPELINE_ERROR_MESSAGES.NO_PIPELINE_FOUND) } try { // Only show 'enabling' when transitioning from allowed states if (PIPELINE_ENABLE_ALLOWED_FROM.includes(statusName as any)) { setGlobalRequestStatus(pipeline.id, PipelineStatusRequestStatus.StartRequested, statusName) } await startPipeline({ projectRef, pipelineId: pipeline.id }) } catch (error) { setGlobalRequestStatus(pipeline.id, PipelineStatusRequestStatus.None) toast.error(PIPELINE_ERROR_MESSAGES.ENABLE_DESTINATION) } } const onDisablePipeline = async () => { if (!projectRef) { console.error('Project ref is required') return } if (!pipeline) { toast.error(PIPELINE_ERROR_MESSAGES.NO_PIPELINE_FOUND) return } try { // Only show 'disabling' when transitioning from allowed states if (PIPELINE_DISABLE_ALLOWED_FROM.includes(statusName as any)) { setGlobalRequestStatus(pipeline.id, PipelineStatusRequestStatus.StopRequested, statusName) } await stopPipeline({ projectRef, pipelineId: pipeline.id }) } catch (error) { setGlobalRequestStatus(pipeline.id, PipelineStatusRequestStatus.None) toast.error(PIPELINE_ERROR_MESSAGES.DISABLE_DESTINATION) } } return (
{isLoading && } {isError && ( )}
) }