Files
supabase/apps/studio/components/ui/SqlEditor.tsx
Joshen Lim 7f5865872a Enforce noUnusedLocals and noUnusedParameters in tsconfig.json + fix all related issues (#45264)
## Context

Enforce `noUnusedLocals` and `noUnusedParameters` in tsconfig.json + fix
all related issues
2026-04-27 17:42:34 +08:00

107 lines
2.4 KiB
TypeScript

import Editor, { OnChange, useMonaco } from '@monaco-editor/react'
import { noop } from 'lodash'
import { useEffect, useRef } from 'react'
import { LogoLoader } from 'ui'
import { formatSql } from '@/lib/formatSql'
// [Joshen] We should deprecate this and use CodeEditor instead
interface SqlEditorProps {
contextmenu?: boolean
defaultValue?: string
language?: string
onInputChange?: OnChange
queryId?: string
readOnly?: boolean
}
/**
* @deprecated Use CodeEditor instead
*/
const SqlEditor = ({
queryId,
language = 'pgsql',
defaultValue = '',
readOnly = false,
contextmenu = true,
onInputChange = noop,
}: SqlEditorProps) => {
const monaco = useMonaco()
const editorRef = useRef<any>()
useEffect(() => {
if (monaco) {
// Enable pgsql format
const formatprovider = monaco.languages.registerDocumentFormattingEditProvider('pgsql', {
async provideDocumentFormattingEdits(model: any) {
const value = model.getValue()
const formatted = formatSql(value)
return [
{
range: model.getFullModelRange(),
text: formatted,
},
]
},
})
return () => {
formatprovider.dispose()
}
}
}, [monaco])
useEffect(() => {
if (editorRef.current) {
// add margin above first line
editorRef.current?.changeViewZones((accessor: any) => {
accessor.addZone({
afterLineNumber: 0,
heightInPx: 4,
domNode: document.createElement('div'),
})
})
}
}, [queryId])
const onMount = (editor: any, _monaco: any) => {
editorRef.current = editor
// Add margin above first line
editor.changeViewZones((accessor: any) => {
accessor.addZone({
afterLineNumber: 0,
heightInPx: 4,
domNode: document.createElement('div'),
})
})
}
return (
<Editor
className="monaco-editor"
theme="supabase"
defaultLanguage={language}
defaultValue={defaultValue}
path={queryId}
loading={<LogoLoader />}
options={{
readOnly,
tabSize: 2,
fontSize: 13,
minimap: {
enabled: false,
},
wordWrap: 'on',
fixedOverflowWidgets: true,
contextmenu: contextmenu,
}}
onMount={onMount}
onChange={onInputChange}
/>
)
}
export default SqlEditor