file-tree-root.js 2.5 KB

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