EmbeddedProjectList.tsx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import type { ReactNode } from 'react'
  2. import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader'
  3. import { ProjectCommandItem } from './ProjectCommandItem'
  4. import type { OrgProject } from '@/data/projects/org-projects-infinite-query'
  5. export interface EmbeddedProjectListProps {
  6. projects: OrgProject[]
  7. selectedRef: string | undefined
  8. onSelect?: (project: OrgProject) => void
  9. onClose: () => void
  10. renderRow?: (project: OrgProject) => ReactNode
  11. checkPosition?: 'right' | 'left'
  12. isOptionDisabled?: (project: OrgProject) => boolean
  13. sentinelRef: (node: Element | null) => void
  14. hasNextPage: boolean
  15. }
  16. export function EmbeddedProjectList({
  17. projects,
  18. selectedRef,
  19. onSelect,
  20. onClose,
  21. renderRow,
  22. checkPosition,
  23. isOptionDisabled,
  24. sentinelRef,
  25. hasNextPage,
  26. }: EmbeddedProjectListProps) {
  27. return (
  28. <div className="min-h-0 p-1">
  29. {projects.map((project) => (
  30. <ProjectCommandItem
  31. key={project.ref}
  32. project={project}
  33. selectedRef={selectedRef}
  34. onSelect={onSelect}
  35. onClose={onClose}
  36. renderRow={renderRow}
  37. checkPosition={checkPosition}
  38. isOptionDisabled={isOptionDisabled}
  39. />
  40. ))}
  41. <div ref={sentinelRef} className="h-1 -mt-1" />
  42. {hasNextPage && (
  43. <div className="px-2 py-1">
  44. <ShimmeringLoader className="py-2" />
  45. </div>
  46. )}
  47. </div>
  48. )
  49. }