import { useRef } from 'react' import { Table, TableBody } from 'ui' import { LoadMoreRow } from './BucketsTable.LoadMoreRow' import type { BucketsTablePaginationProps } from './BucketsTable.types' import { BucketTableHeader, BucketTableRow } from './BucketTable' import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { VirtualizedTable, VirtualizedTableBody } from '@/components/ui/VirtualizedTable' import { Bucket } from '@/data/storage/buckets-query' type BucketsTableProps = { buckets: Bucket[] projectRef: string filterString: string formattedGlobalUploadLimit: string pagination: BucketsTablePaginationProps } // [Joshen] To investigate: There's a lot of duplicate logic + components between // this FilesBuckets/BucketsTable and BucketsPickerDialog/BucketsTable. Check separately // if they can be cleaned up and consolidated. The latter should take precedence as it aims to // reduce footprint on the giant StorageExplorerState. export const BucketsTable = (props: BucketsTableProps) => { // [Joshen] To investigate: Can't we just default to virtualized? // Do we need to dynamically decide whether to use a virtualized or unvirtualized one? const isVirtualized = props.buckets.length > 50 return isVirtualized ? ( ) : ( ) } const BucketsTableUnvirtualized = ({ buckets, projectRef, filterString, formattedGlobalUploadLimit, pagination: { hasMore = false, isLoadingMore = false, onLoadMore }, }: BucketsTableProps) => { const showSearchEmptyState = buckets.length === 0 && filterString.length > 0 return ( 0} /> {showSearchEmptyState ? ( ) : ( buckets.map((bucket) => ( )) )}
) } const BucketsTableVirtualized = ({ buckets, projectRef, filterString, formattedGlobalUploadLimit, pagination: { hasMore = false, isLoadingMore = false, onLoadMore }, }: BucketsTableProps) => { const showSearchEmptyState = buckets.length === 0 && filterString.length > 0 const scrollContainerRef = useRef(null) return ( 59} getItemKey={(bucket) => bucket.id} scrollContainerRef={scrollContainerRef} > 0} /> paddingColSpan={5} emptyContent={ showSearchEmptyState ? ( ) : undefined } trailingContent={ } > {(bucket) => ( )} ) }