import { For, Show } from "solid-js" import type { Message } from "../types/message" import { partHasRenderableText } from "../types/message" import MessagePart from "./message-part" interface MessageItemProps { message: Message messageInfo?: any isQueued?: boolean parts?: any[] onRevert?: (messageId: string) => void } export default function MessageItem(props: MessageItemProps) { const isUser = () => props.message.type === "user" const timestamp = () => { const date = new Date(props.message.timestamp) return date.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }) } const messageParts = () => props.parts ?? props.message.parts const errorMessage = () => { if (!props.messageInfo?.error) return null const error = props.messageInfo.error if (error.name === "ProviderAuthError") { return error.data?.message || "Authentication error" } if (error.name === "MessageOutputLengthError") { return "Message output length exceeded" } if (error.name === "MessageAbortedError") { return "Request was aborted" } if (error.name === "UnknownError") { return error.data?.message || "Unknown error occurred" } return null } const hasContent = () => { if (errorMessage() !== null) { return true } return messageParts().some((part) => partHasRenderableText(part)) } const isGenerating = () => { return !hasContent() && props.messageInfo?.time?.completed === 0 } const handleRevert = () => { if (props.onRevert && isUser()) { props.onRevert(props.message.id) } } const containerClass = () => isUser() ? "message-item-base bg-[var(--message-user-bg)] border-l-4 border-[var(--message-user-border)]" : "message-item-base assistant-message bg-[var(--message-assistant-bg)] border-l-4 border-[var(--message-assistant-border)]" return (
{isUser() ? "You" : "Assistant"}
{timestamp()}
QUEUED
⚠️ {errorMessage()}
Generating...
{(part) => }
Sending...
⚠ Message failed to send
) }