import { useParams } from 'common' import { RefreshCw, Search, X } from 'lucide-react' import { useRouter } from 'next/router' import { parseAsBoolean, parseAsString, useQueryState } from 'nuqs' import { useMemo, useState } from 'react' import DataGrid, { Row } from 'react-data-grid' import { Button, cn, LoadingLine } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { CreateQueueSheet } from './CreateQueueSheet' import { formatQueueColumns, prepareQueuesForDataGrid } from './Queues.utils' import AlertError from '@/components/ui/AlertError' import { useQueuesQuery } from '@/data/database-queues/database-queues-query' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const QueuesTab = () => { const router = useRouter() const { ref } = useParams() const { data: project } = useSelectedProjectQuery() const [searchQuery, setSearchQuery] = useQueryState('search', parseAsString.withDefault('')) const [search, setSearch] = useState(searchQuery) const [createQueueSheetShown, setCreateQueueSheetShown] = useQueryState( 'new', parseAsBoolean.withDefault(false).withOptions({ history: 'push', clearOnDefault: true }) ) const { data: queues, error, isPending: isLoading, isError, isRefetching, refetch, } = useQueuesQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) // Filter queues based on search query const filteredQueues = useMemo(() => { if (!queues) return [] if (!searchQuery) return queues return queues.filter((queue) => queue.queue_name.toLowerCase().includes(searchQuery.toLowerCase()) ) }, [queues, searchQuery]) // Prepare queues for DataGrid const queueData = useMemo(() => prepareQueuesForDataGrid(filteredQueues), [filteredQueues]) // Get columns configuration const columns = useMemo(() => formatQueueColumns(), []) return ( <>
} value={search ?? ''} onChange={(e) => setSearch(e.target.value)} onKeyDown={(e) => { if (e.code === 'Enter' || e.code === 'NumpadEnter') setSearchQuery(search.trim()) }} actions={[ search && (
row.id} rowClass={() => { return cn( 'cursor-pointer', '[&>.rdg-cell]:border-box [&>.rdg-cell]:outline-hidden [&>.rdg-cell]:shadow-none', '[&>.rdg-cell:first-child>div]:ml-8' ) }} renderers={{ renderRow(_, props) { return ( { const { queue_name } = props.row const url = `/project/${ref}/integrations/queues/queues/${queue_name}` router.push(url) }} /> ) }, }} /> {/* Render 0 rows state outside of the grid */} {queueData.length === 0 ? ( isLoading ? (
) : isError ? (
) : (

{!!searchQuery ? 'No queues found' : 'No queues created yet'}

{!!searchQuery ? 'There are currently no queues based on the search applied' : 'There are currently no queues created yet in your project'}

) ) : null}
{`Total: ${queueData.length} queues`}
{ setCreateQueueSheetShown(false) }} /> ) }