dropdown-menu.tsx 1.9 KB

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