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;