button-menu.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. bsStyle={null}
  18. onMouseDown={event => {
  19. event.preventDefault()
  20. event.stopPropagation()
  21. }}
  22. onClick={() => {
  23. onToggle(!open)
  24. }}
  25. ref={target}
  26. >
  27. <Icon type={icon} fw />
  28. </Button>
  29. )
  30. const overlay = (
  31. <Overlay
  32. show={open}
  33. target={target.current}
  34. placement="bottom"
  35. container={document.querySelector('.cm-editor')}
  36. containerPadding={0}
  37. animation
  38. onHide={() => onToggle(false)}
  39. >
  40. <Popover
  41. id={`${id}-menu`}
  42. ref={ref}
  43. className="ol-cm-toolbar-button-menu-popover"
  44. >
  45. <ListGroup
  46. onClick={() => {
  47. onToggle(false)
  48. }}
  49. >
  50. {children}
  51. </ListGroup>
  52. </Popover>
  53. </Overlay>
  54. )
  55. if (!label) {
  56. return (
  57. <>
  58. {button}
  59. {overlay}
  60. </>
  61. )
  62. }
  63. return (
  64. <>
  65. <Tooltip
  66. id={id}
  67. description={<div>{label}</div>}
  68. overlayProps={{ placement: 'bottom' }}
  69. >
  70. {button}
  71. </Tooltip>
  72. {overlay}
  73. </>
  74. )
  75. })