ToolJet/frontend/src/Editor/CodeBuilder/CodeHinter.jsx

80 lines
2.4 KiB
React
Raw Normal View History

import React, { useEffect, useMemo, useState } from 'react';
import CodeMirror from '@uiw/react-codemirror';
2021-05-03 11:26:31 +00:00
import 'codemirror/mode/handlebars/handlebars';
2021-05-09 04:25:17 +00:00
import 'codemirror/mode/javascript/javascript';
import 'codemirror/mode/sql/sql';
import 'codemirror/addon/hint/show-hint';
import 'codemirror/addon/display/placeholder';
import 'codemirror/addon/search/match-highlighter';
2021-05-03 14:27:32 +00:00
import 'codemirror/addon/hint/show-hint.css';
import 'codemirror/theme/base16-light.css';
import 'codemirror/theme/duotone-light.css'
2021-07-03 17:07:50 +00:00
import 'codemirror/theme/monokai.css';
2021-05-03 16:04:54 +00:00
import { getSuggestionKeys, onBeforeChange, handleChange } from './utils';
import { resolveReferences } from '@/_helpers/utils';
2021-05-03 14:27:32 +00:00
export function CodeHinter({
initialValue,
onChange,
currentState,
mode,
theme,
lineNumbers,
className,
placeholder,
ignoreBraces,
enablePreview,
height
}) {
2021-07-03 17:07:50 +00:00
console.log('theme', theme)
2021-05-03 14:27:32 +00:00
const options = {
lineNumbers: lineNumbers,
2021-05-03 14:27:32 +00:00
singleLine: true,
mode: mode || 'handlebars',
2021-05-03 14:27:32 +00:00
tabSize: 2,
theme: theme || 'default',
2021-05-03 14:27:32 +00:00
readOnly: false,
highlightSelectionMatches: true,
placeholder
};
const [realState, setRealState] = useState(currentState);
const [currentValue, setCurrentValue] = useState(initialValue);
useEffect(() => {
setRealState(currentState);
}, [currentState.components]);
let suggestions = useMemo(() => {
return getSuggestionKeys(realState);
}, [realState.components, realState.queries]);
2021-05-03 16:04:54 +00:00
function valueChanged(editor, onChange, suggestions, ignoreBraces) {
handleChange(editor, onChange, suggestions, ignoreBraces);
setCurrentValue(editor.getValue());
}
2021-05-03 14:27:32 +00:00
return (
<div className={`code-hinter ${className || 'codehinter-default-input'}`} key={suggestions.length}>
2021-05-03 14:27:32 +00:00
<CodeMirror
value={initialValue}
realState={realState}
2021-05-03 14:27:32 +00:00
scrollbarStyle={null}
height={height || '100%'}
onBlur={(editor) => {
const value = editor.getValue();
onChange(value);
}}
onChange={(editor) => valueChanged(editor, onChange, suggestions, ignoreBraces)}
onBeforeChange={(editor, change) => onBeforeChange(editor, change, ignoreBraces)}
2021-05-03 14:27:32 +00:00
options={options}
/>
{enablePreview &&
<div className="dynamic-variable-preview bg-azure-lt px-2 py-1">
{resolveReferences(currentValue, realState)}
</div>
}
2021-05-03 14:27:32 +00:00
</div>
);
}