overflow.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { FC, LegacyRef, useRef } from 'react'
  2. import { Button, Overlay, Popover } from 'react-bootstrap'
  3. import classnames from 'classnames'
  4. import Icon from '../../../../shared/components/icon'
  5. import { useCodeMirrorViewContext } from '../codemirror-editor'
  6. export const ToolbarOverflow: FC<{
  7. overflowed: boolean
  8. overflowOpen: boolean
  9. setOverflowOpen: (open: boolean) => void
  10. overflowRef?: LegacyRef<Popover>
  11. }> = ({ overflowed, overflowOpen, setOverflowOpen, overflowRef, children }) => {
  12. const buttonRef = useRef<Button>(null)
  13. const view = useCodeMirrorViewContext()
  14. const className = classnames(
  15. 'ol-cm-toolbar-button',
  16. 'ol-cm-toolbar-overflow-toggle',
  17. {
  18. 'ol-cm-toolbar-overflow-toggle-visible': overflowed,
  19. }
  20. )
  21. return (
  22. <>
  23. <Button
  24. ref={buttonRef}
  25. type="button"
  26. id="toolbar-more"
  27. className={className}
  28. aria-label="More"
  29. bsStyle={null}
  30. onMouseDown={event => {
  31. event.preventDefault()
  32. event.stopPropagation()
  33. }}
  34. onClick={() => {
  35. setOverflowOpen(!overflowOpen)
  36. }}
  37. >
  38. <Icon type="ellipsis-h" fw />
  39. </Button>
  40. <Overlay
  41. show={overflowOpen}
  42. target={buttonRef.current ?? undefined}
  43. placement="bottom"
  44. container={view.dom}
  45. containerPadding={0}
  46. animation
  47. onHide={() => setOverflowOpen(false)}
  48. >
  49. <Popover id="popover-toolbar-overflow" ref={overflowRef}>
  50. <div className="ol-cm-toolbar-overflow">{children}</div>
  51. </Popover>
  52. </Overlay>
  53. </>
  54. )
  55. }