openrag/frontend/app/chat/_components/user-message.tsx
Cole Goldsmith d47038e097
Reorganize folders within frontend (#407)
* reorganize folder structure

* move folders from merge

* fix import issue

* run format

* update configs
2025-11-17 08:23:23 -06:00

74 lines
2.2 KiB
TypeScript

import { FileText, User } from "lucide-react";
import { motion } from "motion/react";
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
import { useAuth } from "@/contexts/auth-context";
import { cn } from "@/lib/utils";
import { Message } from "./message";
interface UserMessageProps {
content: string | undefined;
isCompleted?: boolean;
animate?: boolean;
files?: string;
}
export function UserMessage({
content,
isCompleted,
animate = true,
files,
}: UserMessageProps) {
const { user } = useAuth();
return (
<motion.div
initial={animate ? { opacity: 0, y: -20 } : { opacity: 1, y: 0 }}
animate={{ opacity: 1, y: 0 }}
transition={
animate
? { duration: 0.4, delay: 0.2, ease: "easeOut" }
: { duration: 0 }
}
className={isCompleted ? "opacity-50" : ""}
>
<Message
icon={
<Avatar className="w-8 h-8 rounded-lg flex-shrink-0 select-none">
<AvatarImage
draggable={false}
src={user?.picture}
alt={user?.name}
/>
<AvatarFallback
className={cn(
isCompleted ? "text-placeholder-foreground" : "text-primary",
"text-sm bg-accent/20 rounded-lg transition-colors duration-300",
)}
>
{user?.name ? (
user.name.charAt(0).toUpperCase()
) : (
<User className="h-4 w-4" />
)}
</AvatarFallback>
</Avatar>
}
>
{files && (
<p className="text-muted-foreground flex items-center gap-2 font-normal text-mmd py-1.5 whitespace-pre-wrap break-words overflow-wrap-anywhere transition-colors duration-300">
<FileText className="h-4 w-4" />
{files}
</p>
)}
<p
className={cn(
"text-foreground text-sm py-1.5 whitespace-pre-wrap break-words overflow-wrap-anywhere transition-colors duration-300",
isCompleted ? "text-placeholder-foreground" : "text-foreground",
)}
>
{content}
</p>
</Message>
</motion.div>
);
}