QueueCells.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import dayjs from 'dayjs'
  2. import { Check, Loader2, X } from 'lucide-react'
  3. import { pgmqQueueTable } from './Queues.utils'
  4. import { useQueuesMetricsQuery } from '@/data/database-queues/database-queues-metrics-query'
  5. import { PostgresQueue } from '@/data/database-queues/database-queues-query'
  6. import { useTablesQuery } from '@/data/tables/tables-query'
  7. import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
  8. import { DATETIME_FORMAT } from '@/lib/constants'
  9. export interface QueueWithMetrics extends PostgresQueue {
  10. id: string // Add unique id for DataGrid
  11. }
  12. interface QueueCellProps {
  13. queue: QueueWithMetrics
  14. }
  15. export const QueueNameCell = ({ queue }: QueueCellProps) => (
  16. <div className="flex items-center">
  17. <span className="truncate" title={queue.queue_name}>
  18. {queue.queue_name}
  19. </span>
  20. </div>
  21. )
  22. export const QueueTypeCell = ({ queue }: QueueCellProps) => {
  23. const type = queue.is_partitioned ? 'Partitioned' : queue.is_unlogged ? 'Unlogged' : 'Basic'
  24. return (
  25. <div className="flex items-center">
  26. <span className="truncate" title={type.toLowerCase()}>
  27. {type}
  28. </span>
  29. </div>
  30. )
  31. }
  32. export const QueueRLSCell = ({ queue }: QueueCellProps) => {
  33. const { data: selectedProject } = useSelectedProjectQuery()
  34. const { data: queueTables } = useTablesQuery({
  35. projectRef: selectedProject?.ref,
  36. connectionString: selectedProject?.connectionString,
  37. schema: 'pgmq',
  38. })
  39. const queueTable = queueTables?.find((x) => x.name === pgmqQueueTable(queue.queue_name))
  40. const isRlsEnabled = !!queueTable?.rls_enabled
  41. return (
  42. <div className="flex items-center">
  43. {isRlsEnabled ? <Check size={14} className="text-brand" /> : <X size={14} />}
  44. </div>
  45. )
  46. }
  47. export const QueueCreatedAtCell = ({ queue }: QueueCellProps) => (
  48. <div className="flex items-center">
  49. <span title={queue.created_at}>{dayjs(queue.created_at).format(DATETIME_FORMAT)}</span>
  50. </div>
  51. )
  52. export const QueueSizeCell = ({ queue }: QueueCellProps) => {
  53. const { data: selectedProject } = useSelectedProjectQuery()
  54. const { data: metrics, isPending: isLoading } = useQueuesMetricsQuery(
  55. {
  56. queueName: queue.queue_name,
  57. projectRef: selectedProject?.ref,
  58. connectionString: selectedProject?.connectionString,
  59. },
  60. {
  61. staleTime: 30 * 1000, // 30 seconds
  62. }
  63. )
  64. return (
  65. <div className="flex items-center">
  66. {isLoading ? (
  67. <Loader2 className="animate-spin" size={16} />
  68. ) : (
  69. <span>
  70. {metrics?.queue_length} {metrics?.method === 'estimated' ? '(Approximate)' : null}
  71. </span>
  72. )}
  73. </div>
  74. )
  75. }