editor.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { LoadingPane } from '@/features/ide-react/components/editor/loading-pane'
  2. import {
  3. EditorScopeValue,
  4. useEditorManagerContext,
  5. } from '@/features/ide-react/context/editor-manager-context'
  6. import { useFileTreeOpenContext } from '@/features/ide-react/context/file-tree-open-context'
  7. import useScopeValue from '@/shared/hooks/use-scope-value'
  8. import classNames from 'classnames'
  9. import SourceEditor from '@/features/source-editor/components/source-editor'
  10. import { useProjectContext } from '@/shared/context/project-context'
  11. import { useFileTreeData } from '@/shared/context/file-tree-data-context'
  12. import { useEffect, useRef } from 'react'
  13. import { findInTree } from '@/features/file-tree/util/find-in-tree'
  14. // FIXME: This is only needed until we have a working file tree. This hook does
  15. // the minimal amount of work to load the initial document.
  16. const useWorkaroundForOpeningInitialDocument = () => {
  17. const { _id: projectId } = useProjectContext()
  18. const { fileTreeData, setSelectedEntities } = useFileTreeData()
  19. const isReady = Boolean(projectId && fileTreeData)
  20. const { handleFileTreeInit, handleFileTreeSelect } = useFileTreeOpenContext()
  21. const { currentDocumentId } = useEditorManagerContext()
  22. useEffect(() => {
  23. if (isReady) handleFileTreeInit()
  24. }, [isReady, handleFileTreeInit])
  25. const alreadyOpenedFile = useRef(false)
  26. useEffect(() => {
  27. if (isReady && currentDocumentId && !alreadyOpenedFile.current) {
  28. alreadyOpenedFile.current = true
  29. const doc = findInTree(fileTreeData, currentDocumentId)
  30. if (doc) {
  31. handleFileTreeSelect([doc])
  32. setSelectedEntities([doc])
  33. }
  34. }
  35. }, [
  36. isReady,
  37. currentDocumentId,
  38. fileTreeData,
  39. handleFileTreeSelect,
  40. setSelectedEntities,
  41. ])
  42. }
  43. export const Editor = () => {
  44. const [editor] = useScopeValue<EditorScopeValue>('editor')
  45. useWorkaroundForOpeningInitialDocument()
  46. const { selectedEntityCount, openEntity } = useFileTreeOpenContext()
  47. const { currentDocumentId } = useEditorManagerContext()
  48. if (!currentDocumentId) {
  49. return null
  50. }
  51. const isLoading = Boolean(
  52. (!editor.sharejs_doc || editor.opening) &&
  53. !editor.error_state &&
  54. editor.open_doc_id
  55. )
  56. return (
  57. <div
  58. className={classNames('ide-redesign-editor-content', {
  59. hidden: openEntity?.type !== 'doc' || selectedEntityCount !== 1,
  60. })}
  61. >
  62. <SourceEditor />
  63. {isLoading && <LoadingPane />}
  64. </div>
  65. )
  66. }