import { createPortal } from 'react-dom' import { useState, useEffect } from 'react' import { useSelector } from 'react-redux' import PropTypes from 'prop-types' import { Button, Dialog, DialogActions, DialogContent, Box, List, ListItemButton, ListItem, ListItemAvatar, ListItemText, Typography, Stack } from '@mui/material' import { useTheme } from '@mui/material/styles' import PerfectScrollbar from 'react-perfect-scrollbar' import { StyledButton } from 'ui-component/button/StyledButton' import { DarkCodeEditor } from 'ui-component/editor/DarkCodeEditor' import { LightCodeEditor } from 'ui-component/editor/LightCodeEditor' import './EditPromptValuesDialog.css' import { baseURL } from 'store/constant' const EditPromptValuesDialog = ({ show, dialogProps, onCancel, onConfirm }) => { const portalElement = document.getElementById('portal') const theme = useTheme() const customization = useSelector((state) => state.customization) const languageType = 'json' const [inputValue, setInputValue] = useState('') const [inputParam, setInputParam] = useState(null) const [textCursorPosition, setTextCursorPosition] = useState({}) useEffect(() => { if (dialogProps.value) setInputValue(dialogProps.value) if (dialogProps.inputParam) setInputParam(dialogProps.inputParam) return () => { setInputValue('') setInputParam(null) setTextCursorPosition({}) } }, [dialogProps]) const onMouseUp = (e) => { if (e.target && e.target.selectionEnd && e.target.value) { const cursorPosition = e.target.selectionEnd const textBeforeCursorPosition = e.target.value.substring(0, cursorPosition) const textAfterCursorPosition = e.target.value.substring(cursorPosition, e.target.value.length) const body = { textBeforeCursorPosition, textAfterCursorPosition } setTextCursorPosition(body) } else { setTextCursorPosition({}) } } const onSelectOutputResponseClick = (node, isUserQuestion = false) => { let variablePath = isUserQuestion ? `question` : `${node.id}.data.instance` if (textCursorPosition) { let newInput = '' if (textCursorPosition.textBeforeCursorPosition === undefined && textCursorPosition.textAfterCursorPosition === undefined) newInput = `${inputValue}${`{{${variablePath}}}`}` else newInput = `${textCursorPosition.textBeforeCursorPosition}{{${variablePath}}}${textCursorPosition.textAfterCursorPosition}` setInputValue(newInput) } } const component = show ? (
{inputParam && inputParam.type === 'string' && (
{inputParam.label} {customization.isDarkMode ? ( setInputValue(code)} placeholder={inputParam.placeholder} type={languageType} onMouseUp={(e) => onMouseUp(e)} onBlur={(e) => onMouseUp(e)} style={{ fontSize: '0.875rem', minHeight: 'calc(100vh - 220px)', width: '100%' }} /> ) : ( setInputValue(code)} placeholder={inputParam.placeholder} type={languageType} onMouseUp={(e) => onMouseUp(e)} onBlur={(e) => onMouseUp(e)} style={{ fontSize: '0.875rem', minHeight: 'calc(100vh - 220px)', width: '100%' }} /> )}
)} {!dialogProps.disabled && inputParam && inputParam.acceptVariable && (
Select Variable onSelectOutputResponseClick(null, true)} >
AI
{dialogProps.availableNodesForVariable && dialogProps.availableNodesForVariable.length > 0 && dialogProps.availableNodesForVariable.map((node, index) => { const selectedOutputAnchor = node.data.outputAnchors[0].options.find( (ancr) => ancr.name === node.data.outputs['output'] ) return ( onSelectOutputResponseClick(node)} >
{node.data.name}
) })}
)}
onConfirm(inputValue, inputParam.name)}> {dialogProps.confirmButtonName}
) : null return createPortal(component, portalElement) } EditPromptValuesDialog.propTypes = { show: PropTypes.bool, dialogProps: PropTypes.object, onCancel: PropTypes.func, onConfirm: PropTypes.func } export default EditPromptValuesDialog