import React, { useEffect, useRef } from 'react'; import MonacoEditor from 'react-monaco-editor'; import * as monaco from 'monaco-editor'; import type * as monacoTypes from 'monaco-editor'; import { installAutoHeightLayout } from '../shared/autoHeightLayout'; import { language, languageConfiguration } from './sql'; import { formatSql } from './format'; interface SqlPreviewProps { className?: string; value?: string; theme?: 'light' | 'dark'; fontSize?: number; /** Whether to auto-format the SQL before displaying. Default: true */ enableFormat?: boolean; } const SQL_LANG_ID = 'sql'; const themeMap: Record = { light: 'sql-preview-light', dark: 'sql-preview-dark', }; const transparentColors: monaco.editor.IStandaloneThemeData['colors'] = { 'editor.background': '#00000000', 'editorCursor.foreground': '#00000000', 'editor.lineHighlightBackground': '#00000000', 'editorLineNumber.foreground': '#28191900', focusBorder: '#00000000', }; const SqlPreview: React.FC = (props) => { const { className, value = '', theme = 'light', fontSize, enableFormat = true } = props; const containerRef = useRef(null); // Format the SQL if formatting is enabled const displayValue = enableFormat ? formatSql(value) : value; useEffect(() => { // Register language if not already registered if (!monaco.languages.getLanguages().some((lang) => lang.id === SQL_LANG_ID)) { monaco.languages.register({ id: SQL_LANG_ID }); monaco.languages.setMonarchTokensProvider(SQL_LANG_ID, language as any); monaco.languages.setLanguageConfiguration(SQL_LANG_ID, languageConfiguration); } }, []); const handleEditorMount = (editor: monacoTypes.editor.IStandaloneCodeEditor) => { monaco.editor.defineTheme('sql-preview-light', { base: 'vs', inherit: true, rules: [], colors: transparentColors }); monaco.editor.defineTheme('sql-preview-dark', { base: 'vs-dark', inherit: true, rules: [], colors: transparentColors }); if (containerRef.current) { installAutoHeightLayout(editor, containerRef.current, { heightStyleProperty: 'minHeight' }); } }; return (
); }; export default SqlPreview; export type { SqlPreviewProps };