import { Box } from "@hope-ui/solid"
import { createEffect, createSignal, onCleanup, onMount } from "solid-js"
import { MaybeLoading } from "./FullLoading"
import loader from "@monaco-editor/loader"
import { monaco_cdn } from "~/utils"
loader.config({
paths: {
vs: monaco_cdn,
},
})
export interface MonacoEditorProps {
value: string
onChange?: (value: string) => void
theme: "vs" | "vs-dark"
path?: string
language?: string
}
let monaco: any
export const MonacoEditorLoader = (props: MonacoEditorProps) => {
const [loading, setLoading] = createSignal(true)
loader.init().then((m) => {
monaco = m
setLoading(false)
})
return (
)
}
export const MonacoEditor = (props: MonacoEditorProps) => {
let monacoEditorDiv: HTMLDivElement
let monacoEditor: any /*monaco.editor.IStandaloneCodeEditor*/
let model: any /*monaco.editor.ITextModel*/
onMount(() => {
monacoEditor = monaco.editor.create(monacoEditorDiv!, {
value: props.value,
theme: props.theme,
})
model = monaco.editor.createModel(
props.value,
props.language,
props.path ? monaco.Uri.parse(props.path) : undefined,
)
monacoEditor.setModel(model)
monacoEditor.onDidChangeModelContent(() => {
props.onChange?.(monacoEditor.getValue())
})
})
createEffect(() => {
monacoEditor.setValue(props.value)
})
createEffect(() => {
monaco.editor.setTheme(props.theme)
})
onCleanup(() => {
model && model.dispose()
monacoEditor && monacoEditor.dispose()
})
return
}