diff --git a/apps/builder/components/shared/CodeEditor.tsx b/apps/builder/components/shared/CodeEditor.tsx index a6ce502ff..8de010430 100644 --- a/apps/builder/components/shared/CodeEditor.tsx +++ b/apps/builder/components/shared/CodeEditor.tsx @@ -1,4 +1,4 @@ -import { Box, BoxProps } from '@chakra-ui/react' +import { Box, BoxProps, HStack } from '@chakra-ui/react' import { EditorState, EditorView, basicSetup } from '@codemirror/basic-setup' import { json, jsonParseLinter } from '@codemirror/lang-json' import { css } from '@codemirror/lang-css' @@ -7,6 +7,8 @@ import { html } from '@codemirror/lang-html' import { useEffect, useRef, useState } from 'react' import { useDebouncedCallback } from 'use-debounce' import { linter } from '@codemirror/lint' +import { VariablesButton } from './buttons/VariablesButton' +import { Variable } from 'models' const linterExtension = linter(jsonParseLinter()) @@ -15,12 +17,14 @@ type Props = { lang?: 'css' | 'json' | 'js' | 'html' isReadOnly?: boolean debounceTimeout?: number + withVariableButton?: boolean onChange?: (value: string) => void } export const CodeEditor = ({ value, lang, onChange, + withVariableButton = true, isReadOnly = false, debounceTimeout = 1000, ...props @@ -28,6 +32,9 @@ export const CodeEditor = ({ const editorContainer = useRef(null) const editorView = useRef(null) const [, setPlainTextValue] = useState(value) + const [carretPosition, setCarretPosition] = useState(0) + const isVariableButtonDisplayed = withVariableButton && !isReadOnly + const debounced = useDebouncedCallback( (value) => { setPlainTextValue(value) @@ -101,5 +108,35 @@ export const CodeEditor = ({ return editor } - return + const handleVariableSelected = (variable?: Pick) => { + editorView.current?.focus() + const insert = `{{${variable?.name}}}` + editorView.current?.dispatch({ + changes: { + from: carretPosition, + insert, + }, + selection: { anchor: carretPosition + insert.length }, + }) + } + + const handleKeyUp = () => { + if (!editorContainer.current) return + setCarretPosition(editorView.current?.state.selection.main.from ?? 0) + } + + return ( + + + {isVariableButtonDisplayed && ( + + )} + + ) } diff --git a/apps/builder/components/shared/Graph/Nodes/BlockNode/BlockNode.tsx b/apps/builder/components/shared/Graph/Nodes/BlockNode/BlockNode.tsx index 11d67ff8d..a4ad0eecf 100644 --- a/apps/builder/components/shared/Graph/Nodes/BlockNode/BlockNode.tsx +++ b/apps/builder/components/shared/Graph/Nodes/BlockNode/BlockNode.tsx @@ -144,7 +144,7 @@ export const BlockNode = ({ block, blockIndex }: Props) => { pointerEvents={isReadOnly || isStartBlock ? 'none' : 'auto'} > diff --git a/apps/builder/components/shared/Graph/Nodes/StepNode/SettingsPopoverContent/bodies/SetVariableSettings.tsx b/apps/builder/components/shared/Graph/Nodes/StepNode/SettingsPopoverContent/bodies/SetVariableSettings.tsx index c7d367708..3b24790cb 100644 --- a/apps/builder/components/shared/Graph/Nodes/StepNode/SettingsPopoverContent/bodies/SetVariableSettings.tsx +++ b/apps/builder/components/shared/Graph/Nodes/StepNode/SettingsPopoverContent/bodies/SetVariableSettings.tsx @@ -1,4 +1,5 @@ -import { FormLabel, Stack } from '@chakra-ui/react' +import { FormLabel, HStack, Stack, Switch, Text } from '@chakra-ui/react' +import { CodeEditor } from 'components/shared/CodeEditor' import { Textarea } from 'components/shared/Textbox' import { VariableSearchInput } from 'components/shared/VariableSearchInput' import { SetVariableOptions, Variable } from 'models' @@ -14,6 +15,11 @@ export const SetVariableSettings = ({ options, onOptionsChange }: Props) => { onOptionsChange({ ...options, variableId: variable?.id }) const handleExpressionChange = (expressionToEvaluate: string) => onOptionsChange({ ...options, expressionToEvaluate }) + const handleValueTypeChange = () => + onOptionsChange({ + ...options, + isCode: options.isCode ? !options.isCode : true, + }) return ( @@ -28,14 +34,34 @@ export const SetVariableSettings = ({ options, onOptionsChange }: Props) => { /> - - Value / Expression: - -