/* Copyright 2026 Marimo. All rights reserved. */ import type { EditorView } from "@codemirror/view"; import { DatabaseIcon } from "lucide-react"; import type React from "react"; import { useMemo } from "react"; import { Button } from "@/components/ui/button"; import { Tooltip } from "@/components/ui/tooltip"; import { switchLanguage } from "@/core/codemirror/language/extension"; import { LanguageAdapters } from "@/core/codemirror/language/LanguageAdapters"; import type { LanguageAdapter } from "@/core/codemirror/language/types"; import { Functions } from "@/utils/functions"; import { MarkdownIcon, PythonIcon } from "./icons"; interface LanguageTogglesProps { editorView: EditorView | null; code: string; currentLanguageAdapter: LanguageAdapter["type"] | undefined; onAfterToggle: () => void; } export const LanguageToggles: React.FC = ({ editorView, code, currentLanguageAdapter, onAfterToggle, }) => { const canUseMarkdown = useMemo( () => LanguageAdapters.markdown.isSupported(code) || code.trim() === "", [code], ); const canUseSQL = useMemo( () => LanguageAdapters.sql.isSupported(code) || code.trim() === "", [code], ); return (
} toType="sql" displayName="SQL" onAfterToggle={onAfterToggle} /> } toType="markdown" displayName="Markdown" onAfterToggle={onAfterToggle} /> } toType="python" displayName="Python" onAfterToggle={Functions.NOOP} />
); }; interface Props { className?: string; editorView: EditorView | null; canSwitchToLanguage: boolean; currentLanguageAdapter: LanguageAdapter["type"] | undefined; toType: LanguageAdapter["type"]; displayName: string; icon: React.ReactNode; onAfterToggle: () => void; } export const LanguageToggle: React.FC = ({ editorView, currentLanguageAdapter, canSwitchToLanguage, icon, toType, displayName, onAfterToggle, }) => { const handleClick = () => { if (!editorView) { return; } switchLanguage(editorView, { language: toType }); onAfterToggle(); }; if (!canSwitchToLanguage) { return null; } if (currentLanguageAdapter === toType) { return null; } return ( ); };