diff --git a/packages/console/src/common/Code.tsx b/packages/console/src/common/Code.tsx index 4da8e9cf86..373c7de5c4 100644 --- a/packages/console/src/common/Code.tsx +++ b/packages/console/src/common/Code.tsx @@ -1,51 +1,47 @@ -import React, { Component, ReactElement, ReactNode } from 'react'; +import React, { useEffect, useState, ReactNode } from 'react'; import * as monaco from 'monaco-editor'; +import { useTheme } from '@deephaven/components'; interface CodeProps { children: ReactNode; language: string; } -class Code extends Component> { - constructor(props: CodeProps) { - super(props); - - this.container = null; - } - - componentDidMount(): void { - this.colorize(); - } - - container: HTMLDivElement | null; - - colorize(): void { - const { children } = this.props; - if (this.container && children != null) { - monaco.editor.colorizeElement(this.container, { - theme: 'dh-dark', - }); +function Code({ children, language }: CodeProps): JSX.Element { + const [colorizedHtml, setColorizedHtml] = useState(null); + const { activeThemes } = useTheme(); + + useEffect(() => { + let isCanceled = false; + async function colorize() { + if (children != null && activeThemes != null) { + const result = await monaco.editor.colorize( + children.toString(), + language, + {} + ); + if (!isCanceled) { + setColorizedHtml(result); + } + } } - } - - render(): ReactElement { - const { children, language } = this.props; - return ( -
-
{ - this.container = container; - }} - // Add pointerEvents: 'none' has huge benefits on performance with Hit Test testing on large colorized elements. - // You can still select the text event with this set - style={{ pointerEvents: 'none' }} - > - {children} -
-
- ); - } + colorize(); + return () => { + isCanceled = true; + }; + }, [activeThemes, children, language]); + + return ( +
+ ); } export default Code;