LoadMoreRow.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { useIntersectionObserver } from '@uidotdev/usehooks'
  2. import { useEffect } from 'react'
  3. import { cn, Skeleton, TableCell, TableRow } from 'ui'
  4. import { ShimmeringCard } from './ShimmeringCard'
  5. interface LoadMoreRowProps {
  6. type?: 'card' | 'table'
  7. isFetchingNextPage: boolean
  8. fetchNextPage: () => void
  9. }
  10. export const LoadMoreRows = ({ type, isFetchingNextPage, fetchNextPage }: LoadMoreRowProps) => {
  11. const [sentinelRef, entry] = useIntersectionObserver({
  12. threshold: 0,
  13. rootMargin: '200px 0px 200px 0px',
  14. })
  15. useEffect(() => {
  16. if (entry?.isIntersecting && !isFetchingNextPage) {
  17. fetchNextPage?.()
  18. }
  19. }, [entry?.isIntersecting, isFetchingNextPage, fetchNextPage])
  20. if (type === 'card') {
  21. return (
  22. <ul
  23. ref={sentinelRef}
  24. className={cn(
  25. 'grid grid-cols-1 gap-2 md:gap-4',
  26. 'sm:grid-cols-1 md:grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 pb-6'
  27. )}
  28. >
  29. {[...Array(2)].map((_, i) => (
  30. <ShimmeringCard key={i} />
  31. ))}
  32. </ul>
  33. )
  34. }
  35. return (
  36. <TableRow ref={sentinelRef}>
  37. <TableCell>
  38. <Skeleton className="bg-surface-400 h-4 w-32"></Skeleton>
  39. </TableCell>
  40. <TableCell>
  41. <Skeleton className="bg-surface-400 h-4 w-16"></Skeleton>
  42. </TableCell>
  43. <TableCell>
  44. <Skeleton className="bg-surface-400 h-4 w-20"></Skeleton>
  45. </TableCell>
  46. <TableCell>
  47. <Skeleton className="bg-surface-400 h-4 w-20"></Skeleton>
  48. </TableCell>
  49. <TableCell>
  50. <Skeleton className="bg-surface-400 h-4 w-24"></Skeleton>
  51. </TableCell>
  52. </TableRow>
  53. )
  54. }