file-tree-root.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import React, { useEffect } from 'react'
  2. import PropTypes from 'prop-types'
  3. import withErrorBoundary from '../../../infrastructure/error-boundary'
  4. import FileTreeContext from './file-tree-context'
  5. import FileTreeDraggablePreviewLayer from './file-tree-draggable-preview-layer'
  6. import FileTreeFolderList from './file-tree-folder-list'
  7. import FileTreeToolbar from './file-tree-toolbar'
  8. import FileTreeModalDelete from './modals/file-tree-modal-delete'
  9. import FileTreeModalCreateFolder from './modals/file-tree-modal-create-folder'
  10. import FileTreeContextMenu from './file-tree-context-menu'
  11. import FileTreeError from './file-tree-error'
  12. import { useFileTreeMutable } from '../contexts/file-tree-mutable'
  13. import { useDroppable } from '../contexts/file-tree-draggable'
  14. import { useFileTreeAngularListener } from '../hooks/file-tree-angular-listener'
  15. import { useFileTreeSocketListener } from '../hooks/file-tree-socket-listener'
  16. function FileTreeRoot({
  17. projectId,
  18. rootFolder,
  19. rootDocId,
  20. hasWritePermissions,
  21. onSelect,
  22. onInit
  23. }) {
  24. const isReady = projectId && rootFolder
  25. useEffect(
  26. () => {
  27. if (isReady) onInit()
  28. },
  29. [isReady]
  30. )
  31. if (!isReady) return null
  32. return (
  33. <FileTreeContext
  34. projectId={projectId}
  35. hasWritePermissions={hasWritePermissions}
  36. rootFolder={rootFolder}
  37. initialSelectedEntityId={rootDocId}
  38. onSelect={onSelect}
  39. >
  40. <FileTreeToolbar />
  41. <FileTreeContextMenu />
  42. <div className="file-tree-inner">
  43. <FileTreeRootFolder />
  44. </div>
  45. <FileTreeModalDelete />
  46. <FileTreeModalCreateFolder />
  47. </FileTreeContext>
  48. )
  49. }
  50. function FileTreeRootFolder() {
  51. useFileTreeSocketListener()
  52. useFileTreeAngularListener()
  53. const { fileTreeData } = useFileTreeMutable()
  54. const { isOver, dropRef } = useDroppable(fileTreeData._id)
  55. return (
  56. <>
  57. <FileTreeDraggablePreviewLayer isOver={isOver} />
  58. <FileTreeFolderList
  59. folders={fileTreeData.folders}
  60. docs={fileTreeData.docs}
  61. files={fileTreeData.fileRefs}
  62. classes={{ root: 'file-tree-list' }}
  63. dropRef={dropRef}
  64. isOver={isOver}
  65. />
  66. </>
  67. )
  68. }
  69. FileTreeRoot.propTypes = {
  70. projectId: PropTypes.string,
  71. rootFolder: PropTypes.array,
  72. rootDocId: PropTypes.string,
  73. hasWritePermissions: PropTypes.bool.isRequired,
  74. onSelect: PropTypes.func.isRequired,
  75. onInit: PropTypes.func.isRequired
  76. }
  77. export default withErrorBoundary(FileTreeRoot, FileTreeError)