"use client"; import Link from "next/link"; import { memo } from "react"; import { CopyIconButton } from "./CopyIconButton"; import { Markdown } from "./Markdown"; import { ThinkingRow } from "./ThinkingRow"; import { Button } from "@/components/ui"; import { ModelErrorActions } from "@/components/ModelErrorActions"; import { PencilIcon, PlusIcon, RefreshIcon, SparklesIcon } from "@/components/icons"; import { useI18n } from "@/lib/i18n"; import type { ChatMessage } from "@/lib/chat"; /** * One turn: user bubbles on the right, assistant answers as full-width text * (no bubble) with the Thinking row, sources, actions and error recovery. */ export const MessageRow = memo(function MessageRow({ message, streaming, isLastAssistant, isLastUser, busy, onRegenerate, onEdit, onRetry, onToFlashcards, onSaveNotes, }: { message: ChatMessage; streaming?: boolean; isLastAssistant?: boolean; isLastUser?: boolean; busy?: boolean; onRegenerate?: () => void; onEdit?: () => void; onRetry?: () => void; onToFlashcards?: (message: ChatMessage) => void; onSaveNotes?: (message: ChatMessage) => void; }) { const { t } = useI18n(); if (message.role === "user") { return (
{message.content}
{message.attachments && message.attachments.length > 0 ? ({message.attachments.map((attachment) => attachment.name).join(" · ")}
) : null}{message.error.message}