diff --git a/services/web/frontend/js/features/ide-redesign/components/editor.tsx b/services/web/frontend/js/features/ide-redesign/components/editor.tsx new file mode 100644 index 0000000000..12e6e3b4fb --- /dev/null +++ b/services/web/frontend/js/features/ide-redesign/components/editor.tsx @@ -0,0 +1,73 @@ +import { LoadingPane } from '@/features/ide-react/components/editor/loading-pane' +import { + EditorScopeValue, + useEditorManagerContext, +} from '@/features/ide-react/context/editor-manager-context' +import { useFileTreeOpenContext } from '@/features/ide-react/context/file-tree-open-context' +import useScopeValue from '@/shared/hooks/use-scope-value' +import classNames from 'classnames' +import SourceEditor from '@/features/source-editor/components/source-editor' +import { useProjectContext } from '@/shared/context/project-context' +import { useFileTreeData } from '@/shared/context/file-tree-data-context' +import { useEffect, useRef } from 'react' +import { findInTree } from '@/features/file-tree/util/find-in-tree' + +// FIXME: This is only needed until we have a working file tree. This hook does +// the minimal amount of work to load the initial document. +const useWorkaroundForOpeningInitialDocument = () => { + const { _id: projectId } = useProjectContext() + const { fileTreeData, setSelectedEntities } = useFileTreeData() + const isReady = Boolean(projectId && fileTreeData) + const { handleFileTreeInit, handleFileTreeSelect } = useFileTreeOpenContext() + const { currentDocumentId } = useEditorManagerContext() + + useEffect(() => { + if (isReady) handleFileTreeInit() + }, [isReady, handleFileTreeInit]) + + const alreadyOpenedFile = useRef(false) + useEffect(() => { + if (isReady && currentDocumentId && !alreadyOpenedFile.current) { + alreadyOpenedFile.current = true + const doc = findInTree(fileTreeData, currentDocumentId) + if (doc) { + handleFileTreeSelect([doc]) + setSelectedEntities([doc]) + } + } + }, [ + isReady, + currentDocumentId, + fileTreeData, + handleFileTreeSelect, + setSelectedEntities, + ]) +} + +export const Editor = () => { + const [editor] = useScopeValue('editor') + useWorkaroundForOpeningInitialDocument() + const { selectedEntityCount, openEntity } = useFileTreeOpenContext() + const { currentDocumentId } = useEditorManagerContext() + + if (!currentDocumentId) { + return null + } + + const isLoading = Boolean( + (!editor.sharejs_doc || editor.opening) && + !editor.error_state && + editor.open_doc_id + ) + + return ( +
+ + {isLoading && } +
+ ) +} diff --git a/services/web/frontend/js/features/ide-redesign/components/main-layout.tsx b/services/web/frontend/js/features/ide-redesign/components/main-layout.tsx index 553fe95ca6..fb8e6b870c 100644 --- a/services/web/frontend/js/features/ide-redesign/components/main-layout.tsx +++ b/services/web/frontend/js/features/ide-redesign/components/main-layout.tsx @@ -2,6 +2,7 @@ import { Panel, PanelGroup } from 'react-resizable-panels' import classNames from 'classnames' import { HorizontalResizeHandle } from '@/features/ide-react/components/resize/horizontal-resize-handle' import PdfPreview from '@/features/pdf-preview/components/pdf-preview' +import { Editor } from './editor' export default function MainLayout() { return ( @@ -34,8 +35,8 @@ export default function MainLayout() { hitAreaMargins={{ coarse: 0, fine: 0 }} /> -
- Editor +
+