diff --git a/src/renderer/components/monaco-editor/monaco-editor.tsx b/src/renderer/components/monaco-editor/monaco-editor.tsx index c44b664f23..d417e728ab 100644 --- a/src/renderer/components/monaco-editor/monaco-editor.tsx +++ b/src/renderer/components/monaco-editor/monaco-editor.tsx @@ -60,7 +60,7 @@ export const defaultEditorProps: Partial = { options: {}, language: "yaml", autoFocus: false, - get theme(): string { + get theme(): MonacoEditorProps["theme"] { // theme for monaco-editor defined in `src/renderer/themes/lens-*.json` return ThemeStore.getInstance().activeTheme.monacoTheme; } @@ -147,24 +147,30 @@ export class MonacoEditor extends React.Component { } componentDidMount() { - this.createEditor(); - logger.info(`[MONACO]: editor did mounted`); - - if (this.props.autoFocus) { - this.editor.focus(); + try { + this.createEditor(); + if (this.props.autoFocus) { + this.editor.focus(); + } + logger.info(`[MONACO]: editor did mounted`); + } catch (error) { + logger.error(`[MONACO]: mounting failed`, { error, editor: this }); } } componentWillUnmount() { - logger.info(`[MONACO]: unmounting editor..`); - this.unmounting = true; - this.disposeOnUnmount(); - MonacoEditor.models.get(this).forEach(model => model.dispose()); - MonacoEditor.models.delete(this); - this.editor?.dispose(); + try { + logger.info(`[MONACO]: unmounting editor..`); + this.unmounting = true; + this.destroyEditor(); + MonacoEditor.models.get(this).forEach(model => model.dispose()); + MonacoEditor.models.delete(this); + } catch (error) { + logger.error(`[MONACO]: unmounting error failed: ${String(error)}`, this, error); + } } - private createEditor = (): void => { + private createEditor() { if (!this.containerElem || this.editor || this.unmounting) { return; } @@ -210,6 +216,14 @@ export class MonacoEditor extends React.Component { ); }; + private destroyEditor(): void { + if (!this.editor) return; + + this.editor.dispose(); + this.editor = null; + this.disposeOnUnmount(); + } + @action setDimensions(width: number, height: number) { this.dimensions.width = width; diff --git a/src/renderer/theme.store.ts b/src/renderer/theme.store.ts index f873366231..8fccc7d157 100644 --- a/src/renderer/theme.store.ts +++ b/src/renderer/theme.store.ts @@ -26,6 +26,7 @@ import logger from "../main/logger"; import darkTheme from "./themes/lens-dark.json"; import lightTheme from "./themes/lens-light.json"; import type { SelectOption } from "./components/select"; +import type { MonacoEditorProps } from "./components/monaco-editor"; export type ThemeId = string; @@ -35,7 +36,7 @@ export interface Theme { colors: Record; description: string; author: string; - monacoTheme: string; + monacoTheme: MonacoEditorProps["theme"]; } export interface ThemeItems extends Theme {