"use client"; import CodeMirror from "@uiw/react-codemirror"; import { useTheme } from "next-themes"; import { useEffect, useState } from "react"; import { Textarea } from "@/components/ui/textarea"; import { cn } from "@/lib/utils"; import { loadCodeEditorExtensions } from "./code-editor-extensions"; import { useThread } from "./messages/context"; export function CodeEditor({ className, placeholder, value, readonly, disabled, autoFocus, onChange, onSave, settings, language, }: { className?: string; placeholder?: string; value: string; readonly?: boolean; disabled?: boolean; autoFocus?: boolean; onChange?: (value: string) => void; onSave?: () => void; settings?: unknown; language?: string; }) { const { thread: { isLoading }, } = useThread(); const { resolvedTheme } = useTheme(); const [loaded, setLoaded] = useState< Awaited> | undefined >(); useEffect(() => { let cancelled = false; setLoaded(undefined); void loadCodeEditorExtensions( language, resolvedTheme === "dark" ? "dark" : "light", ).then((extensions) => { if (!cancelled) setLoaded(extensions); }); return () => { cancelled = true; }; }, [language, resolvedTheme]); return (
{ if ( (event.metaKey || event.ctrlKey) && event.key.toLowerCase() === "s" ) { event.preventDefault(); onSave?.(); } }} > {isLoading || !loaded ? (