QueuePage.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { useParams } from 'common'
  2. import dayjs from 'dayjs'
  3. import Link from 'next/link'
  4. import { useRouter } from 'next/router'
  5. import {
  6. BreadcrumbItem,
  7. BreadcrumbLink,
  8. BreadcrumbList,
  9. BreadcrumbPage,
  10. BreadcrumbSeparator,
  11. } from 'ui'
  12. import {
  13. PageHeader,
  14. PageHeaderBreadcrumb,
  15. PageHeaderDescription,
  16. PageHeaderMeta,
  17. PageHeaderSummary,
  18. PageHeaderTitle,
  19. } from 'ui-patterns/PageHeader'
  20. import { QueueTab } from './QueueTab'
  21. import { useQueuesQuery } from '@/data/database-queues/database-queues-query'
  22. import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
  23. import { DATETIME_FORMAT } from '@/lib/constants'
  24. export const QueuePage = () => {
  25. const router = useRouter()
  26. const { ref, id, pageId, childId } = useParams()
  27. const childLabel = router?.query?.['child-label'] as string
  28. const { data: project } = useSelectedProjectQuery()
  29. const { data: queues } = useQueuesQuery({
  30. projectRef: project?.ref,
  31. connectionString: project?.connectionString,
  32. })
  33. // pgmq is case-insensitive when storing queue names — compare lowercased to be safe
  34. const currentQueue = queues?.find(
  35. (queue) => queue.queue_name.toLowerCase() === childId?.toLowerCase()
  36. )
  37. const pageTitle = childLabel || childId || 'Queue'
  38. const getQueueType = (queue: typeof currentQueue) => {
  39. if (!queue) return 'Unknown'
  40. return queue.is_partitioned ? 'Partitioned' : queue.is_unlogged ? 'Unlogged' : 'Basic'
  41. }
  42. const pageSubtitle = currentQueue
  43. ? `${getQueueType(currentQueue)} queue created on ${dayjs(currentQueue.created_at).format(DATETIME_FORMAT)}`
  44. : undefined
  45. return (
  46. <>
  47. <PageHeader size="full" className="pb-6">
  48. <PageHeaderBreadcrumb>
  49. <BreadcrumbList>
  50. <BreadcrumbItem>
  51. <BreadcrumbLink asChild>
  52. <Link href={`/project/${ref}/integrations`}>Integrations</Link>
  53. </BreadcrumbLink>
  54. </BreadcrumbItem>
  55. <BreadcrumbSeparator />
  56. <BreadcrumbItem>
  57. <BreadcrumbLink asChild>
  58. <Link
  59. href={
  60. pageId
  61. ? `/project/${ref}/integrations/${id}/${pageId}`
  62. : `/project/${ref}/integrations/${id}`
  63. }
  64. >
  65. Queues
  66. </Link>
  67. </BreadcrumbLink>
  68. </BreadcrumbItem>
  69. <BreadcrumbSeparator />
  70. <BreadcrumbItem>
  71. <BreadcrumbPage>{childId}</BreadcrumbPage>
  72. </BreadcrumbItem>
  73. </BreadcrumbList>
  74. </PageHeaderBreadcrumb>
  75. <PageHeaderMeta>
  76. <PageHeaderSummary>
  77. <PageHeaderTitle>{pageTitle}</PageHeaderTitle>
  78. {pageSubtitle && <PageHeaderDescription>{pageSubtitle}</PageHeaderDescription>}
  79. </PageHeaderSummary>
  80. </PageHeaderMeta>
  81. </PageHeader>
  82. <QueueTab />
  83. </>
  84. )
  85. }