OrgMenuItem.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import Link from 'next/link'
  2. import { cn, sidebarMenuButtonVariants, SidebarMenuItem } from 'ui'
  3. import type { OrgNavItem } from './OrgMenuContent.utils'
  4. export interface OrgMenuItemProps {
  5. item: OrgNavItem
  6. isActive: boolean
  7. disabled?: boolean
  8. onCloseSheet?: () => void
  9. onSubmenuClick?: (item: OrgNavItem) => void
  10. onSelect?: () => void
  11. }
  12. export function OrgMenuItem({
  13. item,
  14. isActive,
  15. disabled = false,
  16. onCloseSheet,
  17. onSubmenuClick,
  18. onSelect,
  19. }: OrgMenuItemProps) {
  20. const menuButtonClass = cn(
  21. sidebarMenuButtonVariants({ size: 'default', hasIcon: true }),
  22. disabled && 'opacity-50 pointer-events-none'
  23. )
  24. const content = (
  25. <>
  26. <span className="flex size-5 shrink-0 items-center justify-center [&>svg]:size-5 [&>svg]:shrink-0">
  27. {item.icon}
  28. </span>
  29. <span className="truncate">{item.label}</span>
  30. </>
  31. )
  32. return (
  33. <SidebarMenuItem key={item.key}>
  34. {onSubmenuClick ? (
  35. <button
  36. type="button"
  37. data-active={isActive}
  38. onClick={() => onSubmenuClick?.(item)}
  39. disabled={disabled}
  40. className={menuButtonClass}
  41. >
  42. {content}
  43. </button>
  44. ) : (
  45. <Link
  46. href={item.href}
  47. onClick={() => {
  48. onSelect?.()
  49. onCloseSheet?.()
  50. }}
  51. data-active={isActive}
  52. className={menuButtonClass}
  53. >
  54. {content}
  55. </Link>
  56. )}
  57. </SidebarMenuItem>
  58. )
  59. }