OmniHelper / client /src /components /ChatMessage.tsx
hotboxxgenn's picture
Upload 9 files (#12)
c2d42ec verified
import { Bot, User } from "lucide-react";
import { Avatar, AvatarFallback } from "@/components/ui/avatar";
export type Message = {
id: string;
role: "user" | "assistant";
content: string;
timestamp: Date;
};
type ChatMessageProps = {
message: Message;
buddyName?: string;
};
export function ChatMessage({ message, buddyName = "AI Buddy" }: ChatMessageProps) {
const isUser = message.role === "user";
return (
<div
className={`flex gap-3 py-3 px-4 ${isUser ? "flex-row-reverse" : ""}`}
data-testid={`message-${message.role}-${message.id}`}
>
<Avatar className="w-10 h-10 flex-shrink-0">
<AvatarFallback className={isUser ? "bg-primary text-primary-foreground" : "bg-chart-2 text-white"}>
{isUser ? <User className="w-5 h-5" /> : <Bot className="w-5 h-5" />}
</AvatarFallback>
</Avatar>
<div className={`flex flex-col gap-1 max-w-[70%] ${isUser ? "items-end" : "items-start"}`}>
<span className="text-xs text-muted-foreground px-1">
{isUser ? "You" : buddyName}
</span>
<div
className={`rounded-2xl px-4 py-3 ${
isUser
? "bg-primary text-primary-foreground"
: "bg-card border border-card-border"
}`}
>
<p className="text-sm whitespace-pre-wrap break-words">{message.content}</p>
</div>
<span className="text-xs text-muted-foreground px-1">
{message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
</span>
</div>
</div>
);
}