import React from "react";
import ReactMarkdown from "react-markdown";
import type { ChatMessage } from "../../types";
interface MessageItemProps {
message: ChatMessage;
isEditing: boolean;
editContent: string;
isLoading: boolean;
onEditContentChange: (content: string) => void;
onEditMessage: (messageId: string, content: string) => void;
onCancelEdit: () => void;
onSaveEdit: (messageId: string) => void;
onSwitchVersion: (messageId: string, direction: "prev" | "next") => void;
}
export function MessageItem({
message,
isEditing,
editContent,
isLoading,
onEditContentChange,
onEditMessage,
onCancelEdit,
onSaveEdit,
onSwitchVersion,
}: MessageItemProps) {
if (isEditing) {
return (
);
}
return (
{message.content}
{new Date(message.timestamp).toLocaleTimeString("ru-RU", {
hour: "2-digit",
minute: "2-digit",
})}
{message.role === "user" && !isLoading && (
{message.versions && message.versions.length > 1 && (
{(message.activeVersion || 0) + 1}/{message.versions.length}
)}
)}
);
}
interface StreamingMessageProps {
content: string;
}
export function StreamingMessage({ content }: StreamingMessageProps) {
return (
);
}
export function LoadingMessage() {
return (
);
}
interface ErrorMessageProps {
error: string;
onDismiss: () => void;
}
export function ErrorMessage({ error, onDismiss }: ErrorMessageProps) {
return (
⚠️ {error}
);
}
interface MessageListProps {
messages: ChatMessage[];
streamingContent: string;
isLoading: boolean;
error: string | null;
editingMessageId: string | null;
editContent: string;
onEditContentChange: (content: string) => void;
onEditMessage: (messageId: string, content: string) => void;
onCancelEdit: () => void;
onSaveEdit: (messageId: string) => void;
onSwitchVersion: (messageId: string, direction: "prev" | "next") => void;
onDismissError: () => void;
messagesEndRef: React.RefObject;
messagesContainerRef: React.RefObject;
onScroll: () => void;
}
export function MessageList({
messages,
streamingContent,
isLoading,
error,
editingMessageId,
editContent,
onEditContentChange,
onEditMessage,
onCancelEdit,
onSaveEdit,
onSwitchVersion,
onDismissError,
messagesEndRef,
messagesContainerRef,
onScroll,
}: MessageListProps) {
return (
{messages.map((message) => (
))}
{isLoading && streamingContent && (
)}
{isLoading && !streamingContent &&
}
{error &&
}
);
}