import { cva } from "class-variance-authority"; import React from "react"; import { Avatar, CitationGrid } from "@sparkle/components"; import { cn } from "@sparkle/lib/utils"; type ConversationMessageType = "user" | "agent"; type MessageType = "me" | "user" | "agent"; const wrapperVariants = cva("s-flex s-flex-col s-@container @sm:s-flex-row", { variants: { messageType: { agent: "s-pr-0", me: "s-pl-9", user: "s-pr-9", }, }, defaultVariants: { messageType: "agent", }, }); const messageVariants = cva("s-flex s-rounded-2xl s-max-w-full", { variants: { type: { user: "s-bg-muted-background dark:s-bg-muted-background-night s-p-3 s-gap-2 s-w-fit", agent: "s-w-full s-gap-3 s-p-4 @sm:s-flex-row s-flex-col", }, }, defaultVariants: { type: "agent", }, }); interface ConversationMessageContainerProps extends React.HTMLAttributes { messageType: MessageType; type: ConversationMessageType; } export const ConversationMessageContainer = React.forwardRef< HTMLDivElement, ConversationMessageContainerProps >(({ children, className, messageType, type, ...props }, ref) => { return (
{children}
); }); ConversationMessageContainer.displayName = "ConversationMessageContainer"; interface ConversationMessageContentProps extends React.HTMLAttributes { children: React.ReactNode; citations?: React.ReactElement[]; type: ConversationMessageType; infoChip?: React.ReactNode; } export const ConversationMessageContent = React.forwardRef< HTMLDivElement, ConversationMessageContentProps >(({ children, citations, className, ...props }, ref) => { return (
{children}
{citations && citations.length > 0 && ( {citations} )}
); }); ConversationMessageContent.displayName = "ConversationMessageContent"; interface ConversationMessageAvatarProps extends React.HTMLAttributes { avatarUrl?: string | React.ReactNode; isBusy?: boolean; isDisabled?: boolean; name?: string; type: ConversationMessageType; } export const ConversationMessageAvatar = React.forwardRef< HTMLDivElement, ConversationMessageAvatarProps >( ( { avatarUrl, isBusy, isDisabled, name = "", className, type, ...props }, ref ) => { return (
); } ); ConversationMessageAvatar.displayName = "ConversationMessageAvatar"; interface ConversationMessageTitleProps extends React.HTMLAttributes { name?: string; timestamp?: string; infoChip?: React.ReactNode; completionStatus?: React.ReactNode; renderName: (name: string | null) => React.ReactNode; } export const ConversationMessageTitle = React.forwardRef< HTMLDivElement, ConversationMessageTitleProps >( ( { name = "", timestamp, infoChip, completionStatus, renderName, className, ...props }, ref ) => { return (
{renderName(name)} {timestamp} {infoChip && (
{infoChip}
)}
{completionStatus ?? null}
); } ); ConversationMessageTitle.displayName = "ConversationMessageTitle";