diff --git a/packages/web/src/app/[domain]/components/configEditor.tsx b/packages/web/src/app/[domain]/components/configEditor.tsx index 14ed0d61..31c0ffea 100644 --- a/packages/web/src/app/[domain]/components/configEditor.tsx +++ b/packages/web/src/app/[domain]/components/configEditor.tsx @@ -6,15 +6,8 @@ import { useThemeNormalized } from "@/hooks/useThemeNormalized"; import { json, jsonLanguage, jsonParseLinter } from "@codemirror/lang-json"; import { linter } from "@codemirror/lint"; import { EditorView, hoverTooltip } from "@codemirror/view"; -import CodeMirror, { ReactCodeMirrorRef } from "@uiw/react-codemirror"; -import { - handleRefresh, - jsonCompletion, - jsonSchemaHover, - jsonSchemaLinter, - stateExtensions -} from "codemirror-json-schema"; -import { useRef, forwardRef, useImperativeHandle, Ref, ReactNode, useState } from "react"; +import CodeMirror, { Extension, ReactCodeMirrorRef } from "@uiw/react-codemirror"; +import { useRef, forwardRef, useImperativeHandle, Ref, ReactNode, useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Separator } from "@/components/ui/separator"; import { Schema } from "ajv"; @@ -94,7 +87,7 @@ export function onQuickAction( const cursorPos = next.lastIndexOf(selectionText); if (cursorPos >= 0) { view.dispatch({ - selection: { + selection: { anchor: cursorPos, head: cursorPos + selectionText.length } @@ -120,7 +113,6 @@ const ConfigEditor = (props: ConfigEditorProps, forwardedRef: Ref(null); const [isViewMoreActionsEnabled, setIsViewMoreActionsEnabled] = useState(false); const [height, setHeight] = useState(224); - useImperativeHandle( forwardedRef, () => editorRef.current as ReactCodeMirrorRef @@ -129,6 +121,51 @@ const ConfigEditor = (props: ConfigEditorProps, forwardedRef: Ref Internal error: Error: Element type is invalid: expected a string (for built-in components) or a class/function + // > (for composite components) but got: undefined. You likely forgot to export your component from the file it's + // > defined in, or you might have mixed up default and named imports. + // + // Why was this happening? We have no idea, but we isolated it to the extensions exported by the `codemirror-json-schema` + // package. The solution that worked was to dynamically import the package inside of the useEffect and load the extensions + // async. + // + // So, yeah. - Brendan + const [jsonSchemaExtensions, setJsonSchemaExtensions] = useState([]); + useEffect(() => { + const loadExtensions = async () => { + const { + handleRefresh, + jsonCompletion, + jsonSchemaHover, + jsonSchemaLinter, + stateExtensions + } = await import('codemirror-json-schema'); + return [ + linter(jsonParseLinter(), { + delay: 300, + }), + linter(jsonSchemaLinter(), { + needsRefresh: handleRefresh, + }), + jsonLanguage.data.of({ + autocomplete: jsonCompletion(), + }), + hoverTooltip(jsonSchemaHover()), + // eslint-disable-next-line @typescript-eslint/no-explicit-any + stateExtensions(schema as any), + ] + } + + loadExtensions().then((extensions) => { + console.debug('Loaded json schema extensions'); + setJsonSchemaExtensions(extensions); + }); + }, [schema]); + return (
@@ -211,19 +248,8 @@ const ConfigEditor = (props: ConfigEditorProps, forwardedRef: Ref diff --git a/packages/web/src/app/[domain]/components/connectionCreationForms/sharedConnectionCreationForm.tsx b/packages/web/src/app/[domain]/components/connectionCreationForms/sharedConnectionCreationForm.tsx index 63e9c006..859d87da 100644 --- a/packages/web/src/app/[domain]/components/connectionCreationForms/sharedConnectionCreationForm.tsx +++ b/packages/web/src/app/[domain]/components/connectionCreationForms/sharedConnectionCreationForm.tsx @@ -67,7 +67,7 @@ export default function SharedConnectionCreationForm({ return checkIfSecretExists(secretKey, domain); }, { message: "Secret not found" }), }); - }, [schema, domain]); + }, [schema, domain, additionalConfigValidation]); const form = useForm>({ resolver: zodResolver(formSchema), diff --git a/packages/web/src/app/[domain]/components/editorContextMenu.tsx b/packages/web/src/app/[domain]/components/editorContextMenu.tsx index c392437d..513abf31 100644 --- a/packages/web/src/app/[domain]/components/editorContextMenu.tsx +++ b/packages/web/src/app/[domain]/components/editorContextMenu.tsx @@ -126,7 +126,7 @@ export const EditorContextMenu = ({ } } ) - }, [captureEvent, path, repoName, selection.from, selection.to, toast, view, revisionName]); + }, [selection.from, selection.to, domain, repoName, revisionName, path, toast, captureEvent, view]); return (
@@ -85,12 +86,7 @@ export default async function ConnectionManagementPage({ params, searchParams }: