| import { useState } from 'react'; | |
| import { useRecoilValue } from 'recoil'; | |
| import type { TPreset } from 'librechat-data-provider'; | |
| import { Plugin } from '~/components/svg'; | |
| import EndpointOptionsDialog from '../Endpoints/EndpointOptionsDialog'; | |
| import { cn, alternateName } from '~/utils/'; | |
| import { useLocalize } from '~/hooks'; | |
| import store from '~/store'; | |
| const MessageHeader = ({ isSearchView = false }) => { | |
| const [saveAsDialogShow, setSaveAsDialogShow] = useState(false); | |
| const conversation = useRecoilValue(store.conversation); | |
| const searchQuery = useRecoilValue(store.searchQuery); | |
| const localize = useLocalize(); | |
| if (!conversation) { | |
| return null; | |
| } | |
| const { endpoint, model } = conversation; | |
| if (!endpoint) { | |
| return null; | |
| } | |
| const isNotClickable = endpoint === 'chatGPTBrowser'; | |
| const plugins = ( | |
| <> | |
| <Plugin /> <span className="px-1">•</span> | |
| {/* <span className="py-0.25 ml-1 rounded bg-blue-200 px-1 text-[10px] font-semibold uppercase text-[#4559A4]"> | |
| beta | |
| </span> | |
| <span className="px-1">•</span> */} | |
| {localize('com_ui_model')}: {model} | |
| </> | |
| ); | |
| const getConversationTitle = () => { | |
| if (isSearchView) { | |
| return `Search: ${searchQuery}`; | |
| } else { | |
| let _title = `${alternateName[endpoint] ?? endpoint}`; | |
| if (endpoint === 'azureOpenAI' || endpoint === 'openAI') { | |
| const { chatGptLabel } = conversation; | |
| if (model) { | |
| _title += `: ${model}`; | |
| } | |
| if (chatGptLabel) { | |
| _title += ` as ${chatGptLabel}`; | |
| } | |
| } else if (endpoint === 'google') { | |
| _title = 'PaLM'; | |
| const { modelLabel, model } = conversation; | |
| if (model) { | |
| _title += `: ${model}`; | |
| } | |
| if (modelLabel) { | |
| _title += ` as ${modelLabel}`; | |
| } | |
| } else if (endpoint === 'bingAI') { | |
| const { jailbreak, toneStyle } = conversation; | |
| if (toneStyle) { | |
| _title += `: ${toneStyle}`; | |
| } | |
| if (jailbreak) { | |
| _title += ' as Sydney'; | |
| } | |
| } else if (endpoint === 'chatGPTBrowser') { | |
| if (model) { | |
| _title += `: ${model}`; | |
| } | |
| } else if (endpoint === 'gptPlugins') { | |
| return plugins; | |
| } else if (endpoint === 'anthropic') { | |
| _title = 'Claude'; | |
| } else if (endpoint === null) { | |
| null; | |
| } else { | |
| null; | |
| } | |
| return _title; | |
| } | |
| }; | |
| return ( | |
| <> | |
| <div | |
| className={cn( | |
| 'flex min-h-[60px] w-full flex-wrap items-center justify-between gap-3 border-b border-black/10 bg-white text-sm text-gray-500 transition-all hover:bg-gray-50 hover:bg-opacity-30 dark:border-gray-900/50 dark:bg-gray-800 dark:hover:bg-gray-700 dark:hover:bg-opacity-100', | |
| isNotClickable ? '' : 'cursor-pointer ', | |
| )} | |
| onClick={() => (isNotClickable ? null : setSaveAsDialogShow(true))} | |
| > | |
| <div className="flex flex-1 flex-grow items-center justify-center gap-1 p-1 text-gray-600 dark:text-gray-200 sm:p-0"> | |
| {getConversationTitle()} | |
| </div> | |
| </div> | |
| <EndpointOptionsDialog | |
| open={saveAsDialogShow} | |
| onOpenChange={setSaveAsDialogShow} | |
| preset={conversation as TPreset} | |
| /> | |
| </> | |
| ); | |
| }; | |
| export default MessageHeader; | |