| import { useMemo } from 'react'; |
| import { useAtomValue } from 'jotai'; |
| import { useRecoilValue } from 'recoil'; |
| import { useAuthContext, useLocalize } from '~/hooks'; |
| import type { TMessageProps, TMessageIcon } from '~/common'; |
| import MinimalHoverButtons from '~/components/Chat/Messages/MinimalHoverButtons'; |
| import Icon from '~/components/Chat/Messages/MessageIcon'; |
| import SearchContent from './Content/SearchContent'; |
| import { fontSizeAtom } from '~/store/fontSize'; |
| import SearchButtons from './SearchButtons'; |
| import SubRow from './SubRow'; |
| import { cn } from '~/utils'; |
| import store from '~/store'; |
|
|
| const MessageAvatar = ({ iconData }: { iconData: TMessageIcon }) => ( |
| <div className="relative flex flex-shrink-0 flex-col items-end"> |
| <div className="pt-0.5"> |
| <div className="flex h-6 w-6 items-center justify-center overflow-hidden rounded-full"> |
| <Icon iconData={iconData} /> |
| </div> |
| </div> |
| </div> |
| ); |
|
|
| const MessageBody = ({ message, messageLabel, fontSize }) => ( |
| <div |
| className={cn('relative flex w-11/12 flex-col', message.isCreatedByUser ? '' : 'agent-turn')} |
| > |
| <div className={cn('select-none font-semibold', fontSize)}>{messageLabel}</div> |
| <SearchContent message={message} /> |
| <SubRow classes="text-xs"> |
| <MinimalHoverButtons message={message} /> |
| <SearchButtons message={message} /> |
| </SubRow> |
| </div> |
| ); |
|
|
| export default function SearchMessage({ message }: Pick<TMessageProps, 'message'>) { |
| const fontSize = useAtomValue(fontSizeAtom); |
| const UsernameDisplay = useRecoilValue<boolean>(store.UsernameDisplay); |
| const { user } = useAuthContext(); |
| const localize = useLocalize(); |
|
|
| const iconData: TMessageIcon = useMemo( |
| () => ({ |
| endpoint: message?.endpoint ?? '', |
| model: message?.model ?? '', |
| iconURL: message?.iconURL ?? '', |
| isCreatedByUser: message?.isCreatedByUser ?? false, |
| }), |
| [message?.endpoint, message?.model, message?.iconURL, message?.isCreatedByUser], |
| ); |
|
|
| const messageLabel = useMemo(() => { |
| if (message?.isCreatedByUser) { |
| return UsernameDisplay |
| ? (user?.name ?? '') || (user?.username ?? '') |
| : localize('com_user_message'); |
| } |
| return message?.sender ?? ''; |
| }, [ |
| message?.isCreatedByUser, |
| message?.sender, |
| UsernameDisplay, |
| user?.name, |
| user?.username, |
| localize, |
| ]); |
|
|
| if (!message) { |
| return null; |
| } |
|
|
| return ( |
| <div className="text-token-text-primary w-full bg-transparent"> |
| <div className="m-auto p-4 py-2 md:gap-6"> |
| <div className="final-completion group mx-auto flex flex-1 gap-3 md:max-w-3xl md:px-5 lg:max-w-[40rem] lg:px-1 xl:max-w-[48rem] xl:px-5"> |
| <MessageAvatar iconData={iconData} /> |
| <MessageBody message={message} messageLabel={messageLabel} fontSize={fontSize} /> |
| </div> |
| </div> |
| </div> |
| ); |
| } |
|
|