import { useMemo, useRef } from "react"; import { json } from "@codemirror/lang-json"; import { yaml } from "@codemirror/lang-yaml"; import { StreamLanguage } from "@codemirror/language"; import { powerShell } from "@codemirror/legacy-modes/mode/powershell"; import { shell } from "@codemirror/legacy-modes/mode/shell"; import { basicSetup } from "@uiw/codemirror-extensions-basic-setup"; import { vscodeDark, vscodeLight } from "@uiw/codemirror-theme-vscode"; import CodeMirror, { type ReactCodeMirrorProps, type ReactCodeMirrorRef } from "@uiw/react-codemirror"; import { useFocusWithin } from "ahooks"; import { theme } from "antd"; import { useBrowserTheme } from "@/hooks"; import { mergeCls } from "@/utils/css"; export interface CodeInputProps extends Omit { disabled?: boolean; language?: string | string[]; } const CodeInput = ({ className, style, disabled, language, ...props }: CodeInputProps) => { const { token: themeToken } = theme.useToken(); const { theme: browserTheme } = useBrowserTheme(); const cmRef = useRef(null); const isFocusWithin = useFocusWithin(cmRef.current?.editor); const cmTheme = useMemo(() => { if (browserTheme === "dark") { return vscodeDark; } return vscodeLight; }, [browserTheme]); const cmExtensions = useMemo(() => { const temp: NonNullable = [ basicSetup({ foldGutter: false, dropCursor: false, allowMultipleSelections: false, indentOnInput: false, }), ]; const langs = Array.isArray(language) ? language : [language]; langs.forEach((lang) => { switch (lang) { case "shell": temp.push(StreamLanguage.define(shell)); break; case "json": temp.push(json()); break; case "powershell": temp.push(StreamLanguage.define(powerShell)); break; case "yaml": temp.push(yaml()); break; } }); return temp; }, [language]); return (
); }; export default CodeInput;