import MonacoEditor from "react-monaco-editor"
import BrowserOnly from "@docusaurus/BrowserOnly"
import ErrorBoundary from "@docusaurus/ErrorBoundary"
import {
LoadingLabel,
ErrorOccurredLabel,
} from "@theme/JSONSchemaViewer/labels"
import type { JSX } from "react"
import type { JSONSchema as Draft_07 } from "json-schema-typed/draft-07"
import type { EditorWillMount, MonacoEditorProps } from "react-monaco-editor"
import type { Props as ErrorProps } from "@theme/Error"
import type { languages as MonacoLanguages } from "monaco-editor/esm/vs/editor/editor.api"
export type Props = {
/**
* The JSON schema to use
*/
schema: unknown | unknown[]
/**
* Options for Monaco Editor diagnostic
* (useful for instance to enable enableSchemaRequest)
*/
diagnosticsOptions?: MonacoLanguages.json.DiagnosticsOptions
} & MonacoEditorProps
// When something bad happens
function EditorError({ error, tryAgain }: ErrorProps): JSX.Element {
return (
)
}
// Find id or generate a default one
function findOrGenerateId(schema: unknown, idx: number): string {
let typedSchema = schema as Draft_07
if (typeof typedSchema === "boolean" || typedSchema.$id === undefined) {
return `https://docusaurus.io/json-viewer/schema_${idx}.json`
}
return typedSchema.$id
}
// Main component
function JSONSchemaEditorInner(props: Props): JSX.Element {
const { schema, diagnosticsOptions, ...editorProps } = props
const editorWillMount: EditorWillMount = (monaco) => {
// Streamline algorithm
const userSchemas = Array.isArray(schema) ? schema : [schema]
// monaco schema
const monacoSchemas = userSchemas.map((userSchema, idx) => ({
uri: findOrGenerateId(schema, idx),
fileMatch: ["*"], // associate with our model
schema: userSchema,
}))
monaco.languages.json.jsonDefaults.setDiagnosticsOptions({
validate: true,
schemas: monacoSchemas,
...diagnosticsOptions,
})
}
return (
)
}
// The public component
// Notice from https://docusaurus.io/docs/api/themes/configuration#use-color-mode
// The component calling useColorMode must be a child of the Layout component.
export default function JSONSchemaEditor(props: Props): JSX.Element {
return (
}>
{() => (
<>
}>
>
)}
)
}