dropdown-menu.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import React, { forwardRef } from 'react'
  2. import {
  3. Dropdown as BS5Dropdown,
  4. DropdownToggle as BS5DropdownToggle,
  5. DropdownMenu as BS5DropdownMenu,
  6. DropdownItem as BS5DropdownItem,
  7. DropdownDivider as BS5DropdownDivider,
  8. DropdownHeader as BS5DropdownHeader,
  9. } from 'react-bootstrap-5'
  10. import type {
  11. DropdownProps,
  12. DropdownItemProps,
  13. DropdownToggleProps,
  14. DropdownMenuProps,
  15. DropdownDividerProps,
  16. DropdownHeaderProps,
  17. } from '@/features/ui/components/types/dropdown-menu-props'
  18. import MaterialIcon from '@/shared/components/material-icon'
  19. export function Dropdown({ ...props }: DropdownProps) {
  20. return <BS5Dropdown {...props} />
  21. }
  22. export const DropdownItem = forwardRef<
  23. typeof BS5DropdownItem,
  24. DropdownItemProps
  25. >(
  26. (
  27. { active, children, description, leadingIcon, trailingIcon, ...props },
  28. ref
  29. ) => {
  30. const trailingIconType = active ? 'check' : trailingIcon
  31. return (
  32. <BS5DropdownItem
  33. active={active}
  34. className={description ? 'dropdown-item-description-container' : ''}
  35. role="menuitem"
  36. {...props}
  37. ref={ref}
  38. >
  39. {leadingIcon && (
  40. <MaterialIcon
  41. className="dropdown-item-leading-icon"
  42. type={leadingIcon}
  43. />
  44. )}
  45. {children}
  46. {trailingIconType && (
  47. <MaterialIcon
  48. className="dropdown-item-trailing-icon"
  49. type={trailingIconType}
  50. />
  51. )}
  52. {description && (
  53. <span className="dropdown-item-description">{description}</span>
  54. )}
  55. </BS5DropdownItem>
  56. )
  57. }
  58. )
  59. DropdownItem.displayName = 'DropdownItem'
  60. export function DropdownToggle({ ...props }: DropdownToggleProps) {
  61. return <BS5DropdownToggle {...props} />
  62. }
  63. export function DropdownMenu({ as = 'ul', ...props }: DropdownMenuProps) {
  64. return <BS5DropdownMenu as={as} role="menu" {...props} />
  65. }
  66. export function DropdownDivider({ as = 'li' }: DropdownDividerProps) {
  67. return <BS5DropdownDivider as={as} />
  68. }
  69. export function DropdownHeader({ as = 'li', ...props }: DropdownHeaderProps) {
  70. return <BS5DropdownHeader as={as} {...props} />
  71. }