PipelineStatus.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { useParams } from 'common'
  2. import { Loader2 } from 'lucide-react'
  3. import { Badge, Tooltip, TooltipContent, TooltipTrigger } from 'ui'
  4. import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader'
  5. import { getPipelineDisplayState, getStatusName } from './Pipeline.utils'
  6. import { PipelineStatusName } from './Replication.constants'
  7. import { InlineLink } from '@/components/ui/InlineLink'
  8. import { ReplicationPipelineStatusData } from '@/data/replication/pipeline-status-query'
  9. import { PipelineStatusRequestStatus } from '@/state/replication-pipeline-request-status'
  10. import type { ResponseError } from '@/types'
  11. interface PipelineStatusProps {
  12. pipelineStatus: ReplicationPipelineStatusData['status'] | undefined
  13. error: ResponseError | null
  14. isLoading: boolean
  15. isError: boolean
  16. isSuccess: boolean
  17. requestStatus?: PipelineStatusRequestStatus
  18. pipelineId?: number
  19. }
  20. export const PipelineStatus = ({
  21. pipelineStatus,
  22. error,
  23. isLoading,
  24. isError,
  25. isSuccess,
  26. requestStatus,
  27. pipelineId,
  28. }: PipelineStatusProps) => {
  29. const { ref } = useParams()
  30. const statusName = getStatusName(pipelineStatus)
  31. const displayState = getPipelineDisplayState(requestStatus, statusName)
  32. const { type, message, label } = displayState
  33. const pipelineLogsUrl = pipelineId
  34. ? `/project/${ref}/logs/replication-logs?f=${encodeURIComponent(
  35. JSON.stringify({ pipeline_id: pipelineId })
  36. )}`
  37. : `/project/${ref}/logs/replication-logs`
  38. const showLogsCTA = [PipelineStatusName.UNKNOWN, PipelineStatusName.FAILED].includes(
  39. statusName as PipelineStatusName
  40. )
  41. return (
  42. <>
  43. {isLoading && <ShimmeringLoader />}
  44. {isError && (
  45. <Tooltip>
  46. <TooltipTrigger>
  47. <Badge variant="default">Unknown</Badge>
  48. </TooltipTrigger>
  49. <TooltipContent side="bottom" className="w-64 text-center">
  50. Unable to retrieve status: {error?.message}
  51. </TooltipContent>
  52. </Tooltip>
  53. )}
  54. {isSuccess && (
  55. <Tooltip>
  56. <TooltipTrigger asChild>
  57. <div className="flex items-center gap-x-2">
  58. <Badge
  59. variant={
  60. type === 'failure' ? 'destructive' : type === 'success' ? 'success' : 'default'
  61. }
  62. >
  63. {label}
  64. </Badge>
  65. {type === 'loading' && <Loader2 className="animate-spin w-3 h-3" />}
  66. </div>
  67. </TooltipTrigger>
  68. <TooltipContent side="bottom">
  69. {message}{' '}
  70. {showLogsCTA && (
  71. <>
  72. Check the <InlineLink href={pipelineLogsUrl}>logs</InlineLink> for more information.
  73. </>
  74. )}
  75. </TooltipContent>
  76. </Tooltip>
  77. )}
  78. </>
  79. )
  80. }