Spaces:
Sleeping
Sleeping
| "use client"; | |
| import type { Message } from '@/lib/types'; | |
| import { cn } from '@/lib/utils'; | |
| import { Avatar, AvatarFallback } from '@/components/ui/avatar'; | |
| import { Bot, User } from 'lucide-react'; | |
| import Image from 'next/image'; | |
| interface MessageBubbleProps { | |
| message: Message; | |
| } | |
| export default function MessageBubble({ message }: MessageBubbleProps) { | |
| const isUser = message.role === 'user'; | |
| return ( | |
| <div | |
| className={cn( | |
| 'flex items-start gap-4 my-4', | |
| isUser ? 'justify-end' : 'justify-start' | |
| )} | |
| > | |
| {!isUser && ( | |
| <Avatar className="h-8 w-8 shrink-0"> | |
| <AvatarFallback className="bg-primary text-primary-foreground"> | |
| <Bot className="h-5 w-5" /> | |
| </AvatarFallback> | |
| </Avatar> | |
| )} | |
| <div | |
| className={cn( | |
| 'max-w-[75%] rounded-lg p-3 text-sm shadow-md', | |
| isUser | |
| ? 'bg-primary text-primary-foreground' | |
| : 'bg-muted' | |
| )} | |
| > | |
| {message.imageUrl && ( | |
| <Image | |
| src={message.imageUrl} | |
| alt="Uploaded content" | |
| width={300} | |
| height={300} | |
| className="rounded-md mb-2 object-cover" | |
| /> | |
| )} | |
| <p className="whitespace-pre-wrap leading-relaxed"> | |
| {message.content} | |
| </p> | |
| </div> | |
| {isUser && ( | |
| <Avatar className="h-8 w-8 shrink-0"> | |
| <AvatarFallback className="bg-accent"> | |
| <User className="h-5 w-5" /> | |
| </AvatarFallback> | |
| </Avatar> | |
| )} | |
| </div> | |
| ); | |
| } | |