editor.tsx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { EditorLoadingPane } from '@/features/ide-react/components/editor/editor-loading-pane'
  2. import { useEditorOpenDocContext } from '@/features/ide-react/context/editor-open-doc-context'
  3. import { useFileTreeOpenContext } from '@/features/ide-react/context/file-tree-open-context'
  4. import classNames from 'classnames'
  5. import SourceEditor from '@/features/source-editor/components/source-editor'
  6. import { Panel, PanelGroup } from 'react-resizable-panels'
  7. import { VerticalResizeHandle } from '@/features/ide-react/components/resize/vertical-resize-handle'
  8. import { FC, Suspense } from 'react'
  9. import { FullSizeLoadingSpinner } from '@/shared/components/loading-spinner'
  10. import SymbolPalettePane from '@/features/ide-react/components/editor/symbol-palette-pane'
  11. import { useEditorPropertiesContext } from '@/features/ide-react/context/editor-properties-context'
  12. import { isSplitTestEnabled } from '@/utils/splitTestUtils'
  13. import importOverleafModules from '../../../../../macros/import-overleaf-module.macro'
  14. const [pythonRunnerModule] = importOverleafModules('pythonRunner') as {
  15. import: { PythonEditorSplit: FC }
  16. }[]
  17. export const Editor = () => {
  18. const { opening, errorState, showSymbolPalette } =
  19. useEditorPropertiesContext()
  20. const { selectedEntityCount, openEntity } = useFileTreeOpenContext()
  21. const { currentDocumentId, currentDocument } = useEditorOpenDocContext()
  22. if (!currentDocumentId) {
  23. return null
  24. }
  25. const isLoading = Boolean(
  26. (!currentDocument || opening) && !errorState && currentDocumentId
  27. )
  28. const isPythonDocument =
  29. openEntity?.type === 'doc' &&
  30. openEntity.entity.name.toLowerCase().endsWith('.py')
  31. return (
  32. <div
  33. className={classNames('ide-redesign-editor-content', {
  34. hidden: openEntity?.type !== 'doc' || selectedEntityCount !== 1,
  35. })}
  36. >
  37. <PanelGroup
  38. autoSaveId="ide-redesign-editor-symbol-palette"
  39. direction="vertical"
  40. >
  41. <Panel
  42. id="ide-redesign-panel-source-editor"
  43. order={1}
  44. className="ide-redesign-editor-panel"
  45. >
  46. {pythonRunnerModule &&
  47. isPythonDocument &&
  48. isSplitTestEnabled('overleaf-code') ? (
  49. <pythonRunnerModule.import.PythonEditorSplit />
  50. ) : (
  51. <SourceEditor />
  52. )}
  53. {isLoading && <EditorLoadingPane />}
  54. </Panel>
  55. {showSymbolPalette && (
  56. <>
  57. <VerticalResizeHandle id="ide-redesign-editor-symbol-palette" />
  58. <Panel
  59. id="ide-redesign-panel-symbol-palette"
  60. order={2}
  61. defaultSize={25}
  62. minSize={10}
  63. maxSize={50}
  64. >
  65. <Suspense fallback={<FullSizeLoadingSpinner delay={500} />}>
  66. <SymbolPalettePane />
  67. </Suspense>
  68. </Panel>
  69. </>
  70. )}
  71. </PanelGroup>
  72. </div>
  73. )
  74. }