Spaces:
Runtime error
Runtime error
| /* | |
| * Copyright (c) Meta Platforms, Inc. and affiliates. | |
| * | |
| * This source code is licensed under the Chameleon License found in the | |
| * LICENSE file in the root directory of this source tree. | |
| */ | |
| import { WSContent, IMAGE } from "../../DataTypes"; | |
| import { User, Bot } from "@carbon/icons-react"; | |
| import { ReactNode } from "react"; | |
| import Markdown from "react-markdown"; | |
| import remarkGfm from "remark-gfm"; | |
| import { ImageResult } from "./ImageResult"; | |
| export interface ChatRowProps { | |
| isUser: boolean; | |
| data?: WSContent; | |
| children?: ReactNode; | |
| index?: number; | |
| streaming?: boolean; | |
| } | |
| export function ChatRow({ | |
| isUser, | |
| data, | |
| children, | |
| index = 0, | |
| streaming = false, | |
| }: ChatRowProps) { | |
| const userIconStyle = `w-6 h-6 p-1 ${ | |
| isUser ? "bg-gray-100" : "bg-purple-200" | |
| } flex items-center justify-start rounded-full`; | |
| const badgeStyle = "flex flex-row items-center gap-2 text-sm font-bold"; | |
| return ( | |
| <div | |
| className={`chat-row flex flex-col items-stretch my-6 ${ | |
| streaming ? "text-purple-700" : "text-gray-900" | |
| }`} | |
| > | |
| {data && ( | |
| <> | |
| <div className={`${badgeStyle} ${!isUser && "text-purple-700"}`}> | |
| {isUser ? ( | |
| <> | |
| <div className={userIconStyle}> | |
| <User size={16} /> | |
| </div> | |
| <div>You</div> | |
| </> | |
| ) : ( | |
| <> | |
| <div className={userIconStyle}> | |
| <Bot size={16} /> | |
| </div> | |
| <div>Chameleon</div> | |
| </> | |
| )} | |
| </div> | |
| <div | |
| className={`flex-1 mt-2 ml-8 ${ | |
| !isUser && " border-l-2 border-l-purple-200 pl-4" | |
| }`} | |
| > | |
| {data.content_type === IMAGE ? ( | |
| <ImageResult src={data.content} key={`img${index}`} /> | |
| ) : ( | |
| <Markdown remarkPlugins={[remarkGfm]} key={`text${index}`}> | |
| {data.content} | |
| </Markdown> | |
| )} | |
| </div> | |
| </> | |
| )} | |
| {/* Streaming temporary content in children */} | |
| {children && ( | |
| <> | |
| <div className={`${badgeStyle} text-purple-700`}> | |
| <div className={userIconStyle}> | |
| <Bot size={16} /> | |
| </div> | |
| <div>Chameleon</div> | |
| </div> | |
| <div className={`flex-1 mt-2 ml-8`}>{children}</div> | |
| </> | |
| )} | |
| </div> | |
| ); | |
| } | |