From 2ada4a06167b3a00a4c4c69e1b0c78b00ef1db5f Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 10 Oct 2021 01:11:33 +0200 Subject: feat(web): add CodeMirror 6 editor --- language-web/src/main/js/RootStore.tsx | 4 +- language-web/src/main/js/editor/EditorArea.tsx | 142 ++++++++--- language-web/src/main/js/editor/EditorButtons.tsx | 35 ++- language-web/src/main/js/editor/EditorParent.ts | 61 +++++ language-web/src/main/js/editor/EditorStore.ts | 294 ++++++++++++---------- language-web/src/main/js/editor/editor.ts | 18 -- language-web/src/main/js/index.tsx | 3 +- language-web/src/main/js/theme/ThemeStore.ts | 4 + 8 files changed, 363 insertions(+), 198 deletions(-) create mode 100644 language-web/src/main/js/editor/EditorParent.ts delete mode 100644 language-web/src/main/js/editor/editor.ts (limited to 'language-web/src/main/js') diff --git a/language-web/src/main/js/RootStore.tsx b/language-web/src/main/js/RootStore.tsx index 88b8a445..96e1b26a 100644 --- a/language-web/src/main/js/RootStore.tsx +++ b/language-web/src/main/js/RootStore.tsx @@ -8,9 +8,9 @@ export class RootStore { themeStore; - constructor() { + constructor(initialValue: string) { this.themeStore = new ThemeStore(); - this.editorStore = new EditorStore(this.themeStore); + this.editorStore = new EditorStore(initialValue, this.themeStore); } } diff --git a/language-web/src/main/js/editor/EditorArea.tsx b/language-web/src/main/js/editor/EditorArea.tsx index 531a57c9..58d65184 100644 --- a/language-web/src/main/js/editor/EditorArea.tsx +++ b/language-web/src/main/js/editor/EditorArea.tsx @@ -1,41 +1,123 @@ +import { Command, EditorView } from '@codemirror/view'; +import { closeSearchPanel, openSearchPanel } from '@codemirror/search'; +import { closeLintPanel, openLintPanel } from '@codemirror/lint'; import { observer } from 'mobx-react-lite'; -import React, { useRef } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; +import { EditorParent } from './EditorParent'; +import { getLogger } from '../logging'; import { useRootStore } from '../RootStore'; +const log = getLogger('EditorArea'); + +function usePanel( + label: string, + stateToSet: boolean, + editorView: EditorView | null, + openCommand: Command, + closeCommand: Command, +) { + const [cachedViewState, setCachedViewState] = useState(false); + useEffect(() => { + if (editorView === null || cachedViewState === stateToSet) { + return; + } + const success = stateToSet ? openCommand(editorView) : closeCommand(editorView); + if (!success) { + log.error( + 'Failed to synchronize', + label, + 'panel state - store state:', + cachedViewState, + 'view state:', + stateToSet, + ); + } + setCachedViewState(stateToSet); + }, [ + stateToSet, + editorView, + cachedViewState, + label, + openCommand, + closeCommand, + ]); + return setCachedViewState; +} + export const EditorArea = observer(() => { const { editorStore } = useRootStore(); - const { CodeMirror } = editorStore.chunk || {}; - const fallbackTextarea = useRef(null); - - if (!CodeMirror) { - return ( -