file-tree-context-menu.js 1.3 KB

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