|
import * as React from "react" |
|
import { |
|
useAppDispatch, |
|
useAutoScroll, |
|
LANGUAGE_OPTIONS, |
|
useAppSelector, |
|
GRAPH_OPTIONS, |
|
isRagGraph, |
|
} from "@/common" |
|
import { Bot, Brain, MessageCircleQuestion } from "lucide-react" |
|
import { EMessageDataType, EMessageType, type IChatItem } from "@/types" |
|
import { Avatar, AvatarFallback } from "@/components/ui/avatar" |
|
import { cn } from "@/lib/utils" |
|
|
|
export default function MessageList(props: { className?: string }) { |
|
const { className } = props |
|
|
|
const chatItems = useAppSelector((state) => state.global.chatItems) |
|
|
|
const containerRef = React.useRef<HTMLDivElement>(null) |
|
|
|
useAutoScroll(containerRef) |
|
|
|
return ( |
|
<div |
|
ref={containerRef} |
|
className={cn("flex-grow space-y-2 overflow-y-auto p-4", className)} |
|
> |
|
{chatItems.map((item, index) => { |
|
return <MessageItem data={item} key={item.time} /> |
|
})} |
|
</div> |
|
) |
|
} |
|
|
|
export function MessageItem(props: { data: IChatItem }) { |
|
const { data } = props |
|
|
|
return ( |
|
<> |
|
<div |
|
className={cn("flex items-start gap-2", { |
|
"flex-row-reverse": data.type === EMessageType.USER, |
|
})} |
|
> |
|
{data.type === EMessageType.AGENT ? data.data_type === EMessageDataType.REASON ? ( |
|
<Avatar> |
|
<AvatarFallback> |
|
<Brain size={20} /> |
|
</AvatarFallback> |
|
</Avatar> |
|
) : ( |
|
<Avatar> |
|
<AvatarFallback> |
|
<Bot /> |
|
</AvatarFallback> |
|
</Avatar> |
|
) : null} |
|
<div className="max-w-[80%] rounded-lg bg-secondary p-2 text-secondary-foreground"> |
|
{data.data_type === EMessageDataType.IMAGE ? ( |
|
<img src={data.text} alt="chat" className="w-full" /> |
|
) : ( |
|
<p className={data.data_type === EMessageDataType.REASON ? cn( |
|
"text-xs", |
|
"text-zinc-500", |
|
) : ""}>{data.text}</p> |
|
)} |
|
</div> |
|
</div> |
|
</> |
|
) |
|
} |
|
|