ProjectCommandItem.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { Check } from 'lucide-react'
  2. import { ReactNode } from 'react'
  3. import { cn, CommandItem } from 'ui'
  4. import type { OrgProject } from '@/data/projects/org-projects-infinite-query'
  5. export interface ProjectCommandItemProps {
  6. project: 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. }
  14. export function ProjectCommandItem({
  15. project,
  16. selectedRef,
  17. onSelect,
  18. onClose,
  19. renderRow,
  20. checkPosition = 'right',
  21. isOptionDisabled,
  22. }: ProjectCommandItemProps) {
  23. const handleSelect = () => {
  24. onSelect?.(project)
  25. onClose()
  26. }
  27. const disabled = isOptionDisabled?.(project) ?? false
  28. return (
  29. <CommandItem
  30. key={project.ref}
  31. value={`${project.name.replaceAll('"', '')}-${project.ref}`}
  32. className="cursor-pointer w-full"
  33. onSelect={handleSelect}
  34. disabled={disabled}
  35. >
  36. {renderRow ? (
  37. renderRow(project)
  38. ) : (
  39. <div
  40. className={cn(
  41. 'w-full flex items-center',
  42. checkPosition === 'left' ? 'gap-x-2' : 'justify-between',
  43. project.ref !== selectedRef && checkPosition === 'left' && 'ml-6'
  44. )}
  45. >
  46. {checkPosition === 'left' && project.ref === selectedRef && <Check size={16} />}
  47. {project.name}
  48. {checkPosition === 'right' && project.ref === selectedRef && <Check size={16} />}
  49. </div>
  50. )}
  51. </CommandItem>
  52. )
  53. }