Spaces:
Running
Running
| 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> | |
| ); | |
| } | |