| import React, { useMemo } from 'react'; | |
| import ReactMarkdown from 'react-markdown'; | |
| import remarkGfm from 'remark-gfm'; | |
| import rehypeKatex from 'rehype-katex'; | |
| import remarkMath from 'remark-math'; | |
| import supersub from 'remark-supersub'; | |
| import { Label } from '@librechat/client'; | |
| import rehypeHighlight from 'rehype-highlight'; | |
| import { replaceSpecialVars } from 'librechat-data-provider'; | |
| import type { TPromptGroup } from 'librechat-data-provider'; | |
| import { codeNoExecution } from '~/components/Chat/Messages/Content/MarkdownComponents'; | |
| import { useLocalize, useAuthContext } from '~/hooks'; | |
| import CategoryIcon from './Groups/CategoryIcon'; | |
| import PromptVariables from './PromptVariables'; | |
| import { PromptVariableGfm } from './Markdown'; | |
| import Description from './Description'; | |
| import Command from './Command'; | |
| const PromptDetails = ({ group }: { group?: TPromptGroup }) => { | |
| const localize = useLocalize(); | |
| const { user } = useAuthContext(); | |
| const mainText = useMemo(() => { | |
| const initialText = group?.productionPrompt?.prompt ?? ''; | |
| return replaceSpecialVars({ text: initialText, user }); | |
| }, [group?.productionPrompt?.prompt, user]); | |
| if (!group) { | |
| return null; | |
| } | |
| return ( | |
| <div> | |
| <div className="flex flex-col items-center justify-between p-4 text-text-primary sm:flex-row"> | |
| <div className="mb-1 flex flex-row items-center font-bold sm:text-xl md:mb-0 md:text-2xl"> | |
| <div className="mb-1 flex items-center md:mb-0"> | |
| <div className="rounded pr-2"> | |
| {(group.category?.length ?? 0) > 0 ? ( | |
| <CategoryIcon category={group.category ?? ''} /> | |
| ) : null} | |
| </div> | |
| <Label className="text-2xl font-bold">{group.name}</Label> | |
| </div> | |
| </div> | |
| </div> | |
| <div className="flex h-full max-h-screen flex-col overflow-y-auto md:flex-row"> | |
| <div className="flex flex-1 flex-col gap-4 p-0 md:max-h-[calc(100vh-150px)] md:p-2"> | |
| <div> | |
| <h2 className="flex items-center justify-between rounded-t-lg border border-border-light py-2 pl-4 text-base font-semibold text-text-primary"> | |
| {localize('com_ui_prompt_text')} | |
| </h2> | |
| <div className="group relative min-h-32 rounded-b-lg border border-border-light p-4 transition-all duration-150"> | |
| <ReactMarkdown | |
| remarkPlugins={[ | |
| /** @ts-ignore */ | |
| supersub, | |
| remarkGfm, | |
| [remarkMath, { singleDollarTextMath: false }], | |
| ]} | |
| rehypePlugins={[ | |
| /** @ts-ignore */ | |
| [rehypeKatex], | |
| /** @ts-ignore */ | |
| [rehypeHighlight, { ignoreMissing: true }], | |
| ]} | |
| /** @ts-ignore */ | |
| components={{ p: PromptVariableGfm, code: codeNoExecution }} | |
| className="markdown prose dark:prose-invert light dark:text-gray-70 my-1 break-words" | |
| > | |
| {mainText} | |
| </ReactMarkdown> | |
| </div> | |
| </div> | |
| <PromptVariables promptText={mainText} showInfo={false} /> | |
| <Description initialValue={group.oneliner} disabled={true} /> | |
| <Command initialValue={group.command} disabled={true} /> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| export default PromptDetails; | |