button-menu.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { FC, memo, useRef } from 'react'
  2. import { Button, ListGroup, Overlay, Popover } from 'react-bootstrap'
  3. import Icon from '../../../../shared/components/icon'
  4. import useDropdown from '../../../../shared/hooks/use-dropdown'
  5. import Tooltip from '../../../../shared/components/tooltip'
  6. export const ToolbarButtonMenu: FC<{
  7. id: string
  8. label: string
  9. icon: string
  10. }> = memo(function ButtonMenu({ icon, id, label, children }) {
  11. const target = useRef<any>(null)
  12. const { open, onToggle, ref } = useDropdown()
  13. const button = (
  14. <Button
  15. type="button"
  16. className="ol-cm-toolbar-button"
  17. aria-label={label}
  18. bsStyle={null}
  19. onMouseDown={event => {
  20. event.preventDefault()
  21. event.stopPropagation()
  22. }}
  23. onClick={() => {
  24. onToggle(!open)
  25. }}
  26. ref={target}
  27. >
  28. <Icon type={icon} fw />
  29. </Button>
  30. )
  31. const overlay = (
  32. <Overlay
  33. show={open}
  34. target={target.current}
  35. placement="bottom"
  36. container={document.querySelector('.cm-editor')}
  37. containerPadding={0}
  38. animation
  39. onHide={() => onToggle(false)}
  40. >
  41. <Popover
  42. id={`${id}-menu`}
  43. ref={ref}
  44. className="ol-cm-toolbar-button-menu-popover"
  45. >
  46. <ListGroup
  47. role="menu"
  48. onClick={() => {
  49. onToggle(false)
  50. }}
  51. >
  52. {children}
  53. </ListGroup>
  54. </Popover>
  55. </Overlay>
  56. )
  57. if (!label) {
  58. return (
  59. <>
  60. {button}
  61. {overlay}
  62. </>
  63. )
  64. }
  65. return (
  66. <>
  67. <Tooltip
  68. id={id}
  69. description={<div>{label}</div>}
  70. overlayProps={{ placement: 'bottom' }}
  71. >
  72. {button}
  73. </Tooltip>
  74. {overlay}
  75. </>
  76. )
  77. })