| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- import { useParams } from 'common'
- import { CriticalIcon } from 'ui'
- import { isValidRetryPolicy } from './ReplicationPipelineStatus/ReplicationPipelineStatus.utils'
- import { RetryCountdown } from './RetryCountdown'
- import { InlineLink } from '@/components/ui/InlineLink'
- import { ReplicationPipelineTableStatus } from '@/data/replication/pipeline-replication-status-query'
- interface ErroredTableDetailsProps {
- table: ReplicationPipelineTableStatus
- }
- export const ErroredTableDetails = ({ table }: ErroredTableDetailsProps) => {
- const { ref: projectRef } = useParams()
- const state = table.state as Extract<ReplicationPipelineTableStatus['state'], { name: 'error' }>
- const tableName = table.table_name
- const retryPolicy = state.retry_policy.policy
- if (!isValidRetryPolicy(state.retry_policy)) {
- return (
- <div
- role="region"
- className="flex flex-col gap-y-3"
- aria-label={`Error details for table ${tableName}`}
- >
- {state.solution && <div className="text-xs text-foreground-light">{state.solution}</div>}
- <div className="text-xs text-foreground-lighter">Invalid retry policy configuration</div>
- </div>
- )
- }
- return (
- <div role="region" aria-label={`Error details for table ${tableName}`}>
- {retryPolicy === 'no_retry' ? (
- <div className="flex flex-col gap-y-3">
- <p className="text-xs text-foreground-lighter">
- This error requires manual intervention from our{' '}
- <InlineLink
- className="text-foreground-lighter hover:text-foreground"
- href={`/support?projectRef=${projectRef}&category=dashboard_bug&subject=Database%20replication%20error&error=${encodeURIComponent(state.reason ?? '')}`}
- >
- support
- </InlineLink>
- . Alternatively, you may also recreate the pipeline. Use the table actions menu on the
- right to view the full error details.
- </p>
- </div>
- ) : retryPolicy === 'manual_retry' ? (
- <div className="flex flex-col gap-y-3">
- <div className="rounded-md border border-destructive-400 bg-destructive-100 px-3 py-3 space-y-2">
- <div className="flex items-start gap-x-2">
- <CriticalIcon />
- <div className="flex-1 text-xs text-destructive-900">
- <p className="font-semibold mb-1">Action required to continue replication</p>
- <p className="text-foreground-light">
- {state.solution}
- {state.solution && !/[.!?]$/.test(state.solution.trim()) && '.'}
- </p>
- <p className="text-foreground-light mt-2">
- Restart table replication from the table actions menu on the right. The pipeline
- will restart automatically.
- </p>
- </div>
- </div>
- </div>
- </div>
- ) : retryPolicy === 'timed_retry' ? (
- <div className="flex flex-col text-foreground-lighter gap-y-3">
- <p className="text-xs">
- Replication will retry automatically. The pipeline will restart to apply the retry.
- </p>
- <RetryCountdown nextRetryTime={state.retry_policy.next_retry} />
- </div>
- ) : null}
- </div>
- )
- }
|