file-tree-root.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. import FileTreeModalCreateFile from './modals/file-tree-modal-create-file'
  18. function FileTreeRoot({
  19. projectId,
  20. rootFolder,
  21. rootDocId,
  22. hasWritePermissions,
  23. userHasFeature,
  24. refProviders,
  25. reindexReferences,
  26. setRefProviderEnabled,
  27. setStartedFreeTrial,
  28. onSelect,
  29. onInit,
  30. isConnected
  31. }) {
  32. const isReady = projectId && rootFolder
  33. useEffect(() => {
  34. if (isReady) onInit()
  35. }, [isReady, onInit])
  36. if (!isReady) return null
  37. return (
  38. <FileTreeContext
  39. projectId={projectId}
  40. hasWritePermissions={hasWritePermissions}
  41. userHasFeature={userHasFeature}
  42. refProviders={refProviders}
  43. setRefProviderEnabled={setRefProviderEnabled}
  44. setStartedFreeTrial={setStartedFreeTrial}
  45. reindexReferences={reindexReferences}
  46. rootFolder={rootFolder}
  47. rootDocId={rootDocId}
  48. onSelect={onSelect}
  49. >
  50. {isConnected ? null : <div className="disconnected-overlay" />}
  51. <FileTreeToolbar />
  52. <FileTreeContextMenu />
  53. <div className="file-tree-inner">
  54. <FileTreeRootFolder />
  55. </div>
  56. <FileTreeModalDelete />
  57. {window.showReactAddFilesModal && <FileTreeModalCreateFile />}
  58. <FileTreeModalCreateFolder />
  59. <FileTreeModalError />
  60. </FileTreeContext>
  61. )
  62. }
  63. function FileTreeRootFolder() {
  64. useFileTreeSocketListener()
  65. useFileTreeAngularListener()
  66. const { fileTreeData } = useFileTreeMutable()
  67. const { isOver, dropRef } = useDroppable(fileTreeData._id)
  68. return (
  69. <>
  70. <FileTreeDraggablePreviewLayer isOver={isOver} />
  71. <FileTreeFolderList
  72. folders={fileTreeData.folders}
  73. docs={fileTreeData.docs}
  74. files={fileTreeData.fileRefs}
  75. classes={{ root: 'file-tree-list' }}
  76. dropRef={dropRef}
  77. isOver={isOver}
  78. >
  79. <li className="bottom-buffer" />
  80. </FileTreeFolderList>
  81. </>
  82. )
  83. }
  84. FileTreeRoot.propTypes = {
  85. projectId: PropTypes.string,
  86. rootFolder: PropTypes.array,
  87. rootDocId: PropTypes.string,
  88. hasWritePermissions: PropTypes.bool.isRequired,
  89. onSelect: PropTypes.func.isRequired,
  90. onInit: PropTypes.func.isRequired,
  91. isConnected: PropTypes.bool.isRequired,
  92. setRefProviderEnabled: PropTypes.func.isRequired,
  93. userHasFeature: PropTypes.func.isRequired,
  94. setStartedFreeTrial: PropTypes.func.isRequired,
  95. reindexReferences: PropTypes.func.isRequired,
  96. refProviders: PropTypes.object.isRequired
  97. }
  98. export default withErrorBoundary(FileTreeRoot, FileTreeError)