"use client"; import type { ChatMessage as ChatMessageType, ActiveMCQ } from '@/types'; import { cn } from '@/lib/utils'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Bot, User, AlertTriangle, CheckCircle, Info } from 'lucide-react'; import { Card, CardContent } from '@/components/ui/card'; import { MCQOptions } from './mcq-options'; import { useState, useEffect } from 'react'; interface ChatMessageProps { message: ChatMessageType; activeMCQ?: ActiveMCQ | null; isAwaitingActiveMCQAnswer?: boolean; onOptionSelectActiveMCQ?: (option: string, isCorrect: boolean) => void; incorrectAttemptsForMCQ?: string[]; } export function ChatMessage({ message, activeMCQ, isAwaitingActiveMCQAnswer, onOptionSelectActiveMCQ, incorrectAttemptsForMCQ, }: ChatMessageProps) { const isUser = message.sender === 'user'; const Icon = isUser ? User : Bot; const avatarFallback = isUser ? 'U' : 'AI'; const [formattedTime, setFormattedTime] = useState(''); useEffect(() => { if (message.timestamp) { setFormattedTime(new Date(message.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })); } }, [message.timestamp]); return (
{!isUser && ( )} {message.type === 'mcq' && message.mcq && (

{message.mcq.mcq}

{isAwaitingActiveMCQAnswer && onOptionSelectActiveMCQ && (
)}
)} {message.type === 'text' && message.text &&

{message.text}

} {message.type === 'feedback' && message.text && (
{/* Show CheckCircle only if isCorrect and not the final resolution message */} {message.isCorrect && message.text && !message.text.includes("The correct answer is") && ( )} {/* Show Info icon for incorrect answer explanations where user can try again */} {!message.isCorrect && ( )} {/* If message.isCorrect is true AND text includes "The correct answer is", no icon will be shown */}

{message.text}

)} {message.type === 'error' && message.text && (

{message.text}

)} {message.type === 'user' && message.text && (

You chose: "{message.text}"

)} {formattedTime && (

{formattedTime}

)}
{isUser && ( )}
); }