file-tree-context-menu.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import React from 'react'
  2. import ReactDOM from 'react-dom'
  3. import PropTypes from 'prop-types'
  4. import { Dropdown } from 'react-bootstrap'
  5. import { useEditorContext } from '../../../shared/context/editor-context'
  6. import { useFileTreeMainContext } from '../contexts/file-tree-main'
  7. import FileTreeItemMenuItems from './file-tree-item/file-tree-item-menu-items'
  8. function FileTreeContextMenu() {
  9. const { permissionsLevel } = useEditorContext(editorContextPropTypes)
  10. const { contextMenuCoords, setContextMenuCoords } = useFileTreeMainContext()
  11. if (permissionsLevel === 'readOnly' || !contextMenuCoords) return null
  12. function close() {
  13. // reset context menu
  14. setContextMenuCoords(null)
  15. }
  16. function handleToggle(wantOpen) {
  17. if (!wantOpen) close()
  18. }
  19. function handleClick() {
  20. handleToggle(false)
  21. }
  22. return ReactDOM.createPortal(
  23. <Dropdown
  24. onClick={handleClick}
  25. open
  26. id="dropdown-file-tree-context-menu"
  27. onToggle={handleToggle}
  28. >
  29. <FakeDropDownToggle bsRole="toggle" />
  30. <Dropdown.Menu className="context-menu" style={contextMenuCoords}>
  31. <FileTreeItemMenuItems />
  32. </Dropdown.Menu>
  33. </Dropdown>,
  34. document.querySelector('body')
  35. )
  36. }
  37. const editorContextPropTypes = {
  38. permissionsLevel: PropTypes.oneOf(['readOnly', 'readAndWrite', 'owner']),
  39. }
  40. // fake component required as Dropdowns require a Toggle, even tho we don't want
  41. // one for the context menu
  42. const FakeDropDownToggle = React.forwardRef((props, ref) => {
  43. return null
  44. })
  45. FakeDropDownToggle.displayName = 'FakeDropDownToggle'
  46. export default FileTreeContextMenu