file-tree-context-menu.js 1.3 KB

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