11import CodeMirror , {
22 EditorView ,
3+ Extension ,
34 ReactCodeMirrorRef ,
45} from "@uiw/react-codemirror" ;
6+ import { LanguageSupport } from "@codemirror/language" ;
57import {
68 acceptCompletion ,
79 completionStatus ,
810 startCompletion ,
911} from "@codemirror/autocomplete" ;
10- import { sql , SQLNamespace } from "@codemirror/lang-sql" ;
12+ import { sql , SQLNamespace , MySQL as MySQLDialect } from "@codemirror/lang-sql" ;
1113import { forwardRef , KeyboardEventHandler , useMemo } from "react" ;
1214
1315import { defaultKeymap , insertTab } from "@codemirror/commands" ;
@@ -19,9 +21,11 @@ import { sqliteDialect } from "@/drivers/sqlite/sqlite-dialect";
1921import { functionTooltip } from "./function-tooltips" ;
2022import sqliteFunctionList from "@/drivers/sqlite/function-tooltip.json" ;
2123import { toast } from "sonner" ;
24+ import { SupportedDialect } from "@/drivers/base-driver" ;
2225
2326interface SqlEditorProps {
2427 value : string ;
28+ dialect : SupportedDialect ;
2529 readOnly ?: boolean ;
2630 onChange ?: ( value : string ) => void ;
2731 schema ?: SQLNamespace ;
@@ -38,6 +42,7 @@ interface SqlEditorProps {
3842const SqlEditor = forwardRef < ReactCodeMirrorRef , SqlEditorProps > (
3943 function SqlEditor (
4044 {
45+ dialect,
4146 value,
4247 onChange,
4348 schema,
@@ -119,6 +124,44 @@ const SqlEditor = forwardRef<ReactCodeMirrorRef, SqlEditorProps>(
119124 ] ) ;
120125 } , [ fontSize , onFontSizeChanged ] ) ;
121126
127+ const extensions = useMemo ( ( ) => {
128+ let sqlDialect : LanguageSupport | undefined = undefined ;
129+ let tooltipExtension : Extension | undefined = undefined ;
130+
131+ if ( dialect === "sqlite" ) {
132+ sqlDialect = sql ( {
133+ dialect : sqliteDialect ,
134+ schema,
135+ } ) ;
136+ tooltipExtension = functionTooltip ( sqliteFunctionList ) ;
137+ } else {
138+ sqlDialect = sql ( {
139+ dialect : MySQLDialect ,
140+ schema,
141+ } ) ;
142+ }
143+
144+ return [
145+ keyExtensions ,
146+ sqlDialect ,
147+ tooltipExtension ,
148+ tableNameHighlightPlugin ,
149+ EditorView . updateListener . of ( ( state ) => {
150+ const pos = state . state . selection . main . head ;
151+ const line = state . state . doc . lineAt ( pos ) ;
152+ const lineNumber = line . number ;
153+ const columnNumber = pos - line . from ;
154+ if ( onCursorChange ) onCursorChange ( pos , lineNumber , columnNumber ) ;
155+ } ) ,
156+ ] . filter ( Boolean ) as Extension [ ] ;
157+ } , [
158+ dialect ,
159+ onCursorChange ,
160+ keyExtensions ,
161+ schema ,
162+ tableNameHighlightPlugin ,
163+ ] ) ;
164+
122165 return (
123166 < CodeMirror
124167 ref = { ref }
@@ -137,22 +180,7 @@ const SqlEditor = forwardRef<ReactCodeMirrorRef, SqlEditorProps>(
137180 fontSize : 20 ,
138181 height : "100%" ,
139182 } }
140- extensions = { [
141- keyExtensions ,
142- sql ( {
143- dialect : sqliteDialect ,
144- schema,
145- } ) ,
146- functionTooltip ( sqliteFunctionList ) ,
147- tableNameHighlightPlugin ,
148- EditorView . updateListener . of ( ( state ) => {
149- const pos = state . state . selection . main . head ;
150- const line = state . state . doc . lineAt ( pos ) ;
151- const lineNumber = line . number ;
152- const columnNumber = pos - line . from ;
153- if ( onCursorChange ) onCursorChange ( pos , lineNumber , columnNumber ) ;
154- } ) ,
155- ] }
183+ extensions = { extensions }
156184 />
157185 ) ;
158186 }
0 commit comments