/* eslint-disable no-nested-ternary */ import './CodeMirrorWhereClause.styles.scss'; import CodeMirror, { EditorView } from '@uiw/react-codemirror'; import { Typography } from 'antd'; import { useCallback, useEffect, useRef, useState } from 'react'; import { IQueryContext, IValidationResult } from 'types/antlrQueryTypes'; import { getQueryContextAtCursor, validateQuery } from 'utils/antlrQueryUtils'; const { Text } = Typography; function CodeMirrorWhereClause(): JSX.Element { const [query, setQuery] = useState(''); const [isLoading, setIsLoading] = useState(false); const [queryContext, setQueryContext] = useState(null); const [validation, setValidation] = useState({ isValid: false, message: '', errors: [], }); const [cursorPos, setCursorPos] = useState({ line: 0, ch: 0 }); const lastPosRef = useRef<{ line: number; ch: number }>({ line: 0, ch: 0 }); const handleUpdate = (viewUpdate: { view: EditorView }): void => { const selection = viewUpdate.view.state.selection.main; const pos = selection.head; const lineInfo = viewUpdate.view.state.doc.lineAt(pos); const newPos = { line: lineInfo.number, ch: pos - lineInfo.from, }; const lastPos = lastPosRef.current; // Only update if cursor position actually changed if (newPos.line !== lastPos.line || newPos.ch !== lastPos.ch) { setCursorPos(newPos); lastPosRef.current = newPos; } }; console.log({ cursorPos, queryContext, validation, isLoading, }); const handleQueryChange = useCallback(async (newQuery: string) => { setIsLoading(true); setQuery(newQuery); try { const validationResponse = validateQuery(newQuery); setValidation(validationResponse); } catch (error) { setValidation({ isValid: false, message: 'Failed to process query', errors: [error instanceof Error ? error.message : 'Unknown error'], }); } finally { setIsLoading(false); } }, []); useEffect(() => { if (query) { const context = getQueryContextAtCursor(query, cursorPos.ch); setQueryContext(context as IQueryContext); } }, [query, cursorPos]); useEffect(() => { console.log('cursorPos', cursorPos); }, [cursorPos]); const handleChange = (value: string): void => { console.log('value', value); setQuery(value); handleQueryChange(value); }; return (
Cursor at Line: {cursorPos.line}, Ch: {cursorPos.ch}
{queryContext && (

Current Context

Token: {queryContext.currentToken}

Type: {queryContext.tokenType}

Context:{' '} {queryContext.isInValue ? 'Value' : queryContext.isInKey ? 'Key' : queryContext.isInOperator ? 'Operator' : queryContext.isInFunction ? 'Function' : 'Unknown'}

)}
Examples:
  • status = 'error'
  • service = 'frontend' AND level = 'error'
  • message LIKE '%timeout%'
  • duration {'>'} 1000
  • tags IN ['prod', 'frontend']
  • NOT (status = 'error' OR level = 'error')
); } export default CodeMirrorWhereClause;