import React, { Suspense, useState } from 'react'; import { classNames } from '~/utils/classNames'; import WithTooltip from '~/components/ui/Tooltip'; import { parseTestResultsMessage, type Message, TEST_RESULTS_CATEGORY } from '~/lib/persistence/message'; import { MessageContents } from './MessageContents'; interface MessagesProps { id?: string; className?: string; hasPendingMessage?: boolean; pendingMessageStatus?: string; messages?: Message[]; } export const Messages = React.forwardRef((props: MessagesProps, ref) => { const { id, hasPendingMessage = false, pendingMessageStatus = '', messages = [] } = props; const [showDetailMessageIds, setShowDetailMessageIds] = useState([]); const getLastUserResponse = (index: number) => { return messages.findLast((message, messageIndex) => messageIndex < index && message.category === 'UserResponse'); }; // Return whether the test results at index are the last for the associated user response. const isLastTestResults = (index: number) => { let lastIndex = -1; for (let i = index; i < messages.length; i++) { const { category } = messages[i]; if (category === 'UserResponse') { return lastIndex === index; } if (category === 'TestResults') { lastIndex = i; } } return lastIndex === index; }; const renderTestResults = (message: Message, index: number) => { const testResults = parseTestResultsMessage(message); return (
Test Results
{testResults.map((result) => (
{result.recordingId ? ( {result.title} ) : (
{result.title}
)}
))}
); }; const renderMessage = (message: Message, index: number) => { const { role, repositoryId } = message; const isUserMessage = role === 'user'; const isFirst = index === 0; const isLast = index === messages.length - 1; if (!isUserMessage && message.category && message.category !== 'UserResponse') { const lastUserResponse = getLastUserResponse(index); if (!lastUserResponse) { return null; } const showDetails = showDetailMessageIds.includes(lastUserResponse.id); if (message.category === TEST_RESULTS_CATEGORY) { // The default view only shows the last test results for each user response. if (!isLastTestResults(index) && !showDetails) { return null; } return renderTestResults(message, index); } else { if (!showDetails) { return null; } } } return (
} > {isUserMessage && (
)}
{!isUserMessage && message.category === 'UserResponse' && showDetailMessageIds.includes(message.id) && (
)} {!isUserMessage && message.category === 'UserResponse' && !showDetailMessageIds.includes(message.id) && (
)} {repositoryId && (
)}
); }; return (
{messages.length > 0 ? messages.map(renderMessage) : null} {hasPendingMessage && (
{pendingMessageStatus ? `${pendingMessageStatus}...` : ''}
)}
); });