import { useMemo } from 'react'; import { useForm, useFieldArray, Controller, useWatch } from 'react-hook-form'; import type { TPromptGroup } from 'librechat-data-provider'; import { extractVariableInfo, wrapVariable, replaceSpecialVars } from '~/utils'; import { useAuthContext, useLocalize, useSubmitMessage } from '~/hooks'; import { Textarea } from '~/components/ui'; type FormValues = { fields: { variable: string; value: string }[]; }; export default function VariableForm({ group, onClose, }: { group: TPromptGroup; onClose: () => void; }) { const localize = useLocalize(); const { user } = useAuthContext(); const mainText = useMemo(() => { const initialText = group.productionPrompt?.prompt ?? ''; return replaceSpecialVars({ text: initialText, user }); }, [group.productionPrompt?.prompt, user]); const { allVariables, uniqueVariables, variableIndexMap } = useMemo( () => extractVariableInfo(mainText), [mainText], ); const { submitPrompt } = useSubmitMessage(); const { control, handleSubmit } = useForm({ defaultValues: { fields: uniqueVariables.map((variable) => ({ variable: wrapVariable(variable), value: '' })), }, }); const { fields } = useFieldArray({ control, name: 'fields', }); const fieldValues = useWatch({ control, name: 'fields', }); if (!uniqueVariables.length) { return null; } const generateHighlightedText = () => { let tempText = mainText; const parts: JSX.Element[] = []; allVariables.forEach((variable, index) => { const placeholder = `{{${variable}}}`; const partsBeforePlaceholder = tempText.split(placeholder); const fieldIndex = variableIndexMap.get(variable) as string | number; const fieldValue = fieldValues[fieldIndex].value as string; parts.push( {partsBeforePlaceholder[0]}, {fieldValue !== '' ? fieldValue : placeholder} , ); tempText = partsBeforePlaceholder.slice(1).join(placeholder); }); parts.push({tempText}); return parts; }; const onSubmit = (data: FormValues) => { let text = mainText; data.fields.forEach(({ variable, value }) => { if (value) { const regex = new RegExp(variable, 'g'); text = text.replace(regex, value); } }); submitPrompt(text); onClose(); }; return (

{generateHighlightedText()}

{fields.map((field, index) => (
(