import { useParams } from 'common' import { useMemo } from 'react' import { toast } from 'sonner' import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from 'ui' import { PipelineStatusName } from './Replication.constants' import { RestartCostEstimate } from './RestartCostEstimate' import { ReplicationPipelineTableStatus } from '@/data/replication/pipeline-replication-status-query' import { useRollbackTablesMutation } from '@/data/replication/rollback-tables-mutation' interface BatchRestartDialogProps { open: boolean onOpenChange: (open: boolean) => void mode: 'all' | 'errored' tables: ReplicationPipelineTableStatus[] sourceId?: number publicationName?: string pipelineStatusName?: PipelineStatusName onRestartStart?: (tableIds: number[]) => void onRestartComplete?: (tableIds: number[]) => void } export const BatchRestartDialog = ({ open, onOpenChange, mode, tables, sourceId, publicationName, pipelineStatusName, onRestartStart, onRestartComplete, }: BatchRestartDialogProps) => { const { ref: projectRef, pipelineId: _pipelineId } = useParams() const pipelineId = Number(_pipelineId) const affectedTables = useMemo(() => { if (mode === 'all') { return tables } else { return tables.filter( (t) => t.state.name === 'error' && 'retry_policy' in t.state && t.state.retry_policy?.policy === 'manual_retry' ) } }, [mode, tables]) const affectedTableIds = useMemo( () => affectedTables.map((table) => table.table_id), [affectedTables] ) const affectedTableNames = useMemo( () => affectedTables.map((table) => table.table_name), [affectedTables] ) const { mutateAsync: rollbackTables, isPending: isResetting } = useRollbackTablesMutation({ onSuccess: (data) => { const count = data.tables.length toast.success( `Restarting replication for ${count} table${count > 1 ? 's' : ''}. Pipeline will restart automatically.` ) }, onSettled: () => { onRestartComplete?.(affectedTableIds) onOpenChange(false) }, onError: (error) => { toast.error(`Failed to restart replication: ${error.message}`) }, }) const handleReset = async () => { if (!projectRef) return toast.error('Project ref is required') onRestartStart?.(affectedTableIds) try { await rollbackTables({ projectRef, pipelineId, target: mode === 'all' ? { type: 'all_tables' } : { type: 'all_errored_tables' }, rollbackType: 'full', pipelineStatusName, }) } catch (error) {} } const dialogContent = mode === 'all' ? { title: 'Restart all tables', description: (
This will restart replication for all {affectedTables.length} table {affectedTables.length === 1 ? '' : 's'} in this pipeline from scratch:
This will restart replication for{' '} all {affectedTables.length} failed tables from scratch: