import { ActionIcon, Group, Paper, Stack, Tooltip } from "@mantine/core"; import { IconPencil, IconRefresh } from "@tabler/icons-react"; import { memo } from "react"; import type { ChatMessage } from "../../modules/types"; import FormattedMarkdown from "./FormattedMarkdown"; interface MessageListProps { messages: ChatMessage[]; onEditMessage: (absoluteIndex: number) => void; onRegenerate: () => void; isGenerating: boolean; } interface MessageProps { message: ChatMessage; index: number; absoluteIndex: number; isLastAssistant: boolean; isGenerating: boolean; onEditMessage: (absoluteIndex: number) => void; onRegenerate: () => void; } const Message = memo( ({ message, index, absoluteIndex, isLastAssistant, isGenerating, onEditMessage, onRegenerate, }: MessageProps) => { const canEdit = message.role === "user"; const canRegenerate = isLastAssistant && message.role === "assistant"; const iconSize = 16; const iconVariant: "subtle" = "subtle"; return ( {canEdit && ( onEditMessage(absoluteIndex)} > )} {message.content} {canRegenerate && ( onRegenerate()} > )} ); }, ); const MessageList = memo(function MessageList({ messages, onEditMessage, onRegenerate, isGenerating, }: MessageListProps) { if (messages.length <= 2) return null; return ( {messages .slice(2) .filter((message) => message.content.length > 0) .map((message, index) => { const absoluteIndex = index + 2; const isLastAssistant = absoluteIndex === messages.length - 1 && message.role === "assistant"; return ( ); })} ); }); export default MessageList;