button-menu.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. hidden={open}
  69. id={id}
  70. description={<div>{label}</div>}
  71. overlayProps={{ placement: 'bottom' }}
  72. >
  73. {button}
  74. </Tooltip>
  75. {overlay}
  76. </>
  77. )
  78. })