import { useMemo, memo } from 'react'; import { useRecoilValue } from 'recoil'; import { EditIcon } from 'lucide-react'; import type { PluggableList } from 'unified'; import rehypeHighlight from 'rehype-highlight'; import { Controller, useFormContext, useFormState } from 'react-hook-form'; import remarkGfm from 'remark-gfm'; import rehypeKatex from 'rehype-katex'; import remarkMath from 'remark-math'; import supersub from 'remark-supersub'; import ReactMarkdown from 'react-markdown'; import { codeNoExecution } from '~/components/Chat/Messages/Content/Markdown'; import AlwaysMakeProd from '~/components/Prompts/Groups/AlwaysMakeProd'; import { SaveIcon, CrossIcon } from '~/components/svg'; import VariablesDropdown from './VariablesDropdown'; import { TextareaAutosize } from '~/components/ui'; import { PromptVariableGfm } from './Markdown'; import { PromptsEditorMode } from '~/common'; import { cn, langSubset } from '~/utils'; import { useLocalize } from '~/hooks'; import store from '~/store'; const { promptsEditorMode } = store; type Props = { name: string; isEditing: boolean; setIsEditing: React.Dispatch>; }; const PromptEditor: React.FC = ({ name, isEditing, setIsEditing }) => { const localize = useLocalize(); const { control } = useFormContext(); const editorMode = useRecoilValue(promptsEditorMode); const { dirtyFields } = useFormState({ control: control }); const { prompt } = dirtyFields as { prompt?: string }; const EditorIcon = useMemo(() => { if (isEditing && prompt?.length == null) { return CrossIcon; } return isEditing ? SaveIcon : EditIcon; }, [isEditing, prompt]); const rehypePlugins: PluggableList = [ [rehypeKatex], [ rehypeHighlight, { detect: true, ignoreMissing: true, subset: langSubset, }, ], ]; return (

{localize('com_ui_prompt_text')}
{editorMode === PromptsEditorMode.ADVANCED && ( )}

!isEditing && setIsEditing(true)} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { !isEditing && setIsEditing(true); } }} tabIndex={0} > {!isEditing && ( )} isEditing ? ( setIsEditing(false)} onKeyDown={(e) => { if (e.key === 'Escape') { e.preventDefault(); setIsEditing(false); } }} /> ) : (
{field.value}
) } />
); }; export default memo(PromptEditor);