import React from 'react'; import { PatientAvatar, NurseAvatar, SeniorDoctorAvatar } from '../avatars'; export interface AgentMessageData { id: string; agent_type: 'patient' | 'nurse' | 'senior_doctor' | 'family' | 'lab_tech' | 'student' | 'system'; display_name: string; content: string; distress_level?: string; urgency_level?: string; timestamp: Date; is_event?: boolean; is_teaching?: boolean; is_intervention?: boolean; event_type?: string; } interface AgentMessageProps { message: AgentMessageData; } /* ── Per-agent colour and name styling ── */ const AGENT_COLORS: Record = { patient: { bg: '#FFF8E1', nameColor: 'text-amber-700', tailColor: '#FFF8E1', }, nurse: { bg: '#E3F2FD', nameColor: 'text-blue-700', tailColor: '#E3F2FD', }, senior_doctor: { bg: '#E8F5E9', nameColor: 'text-emerald-700', tailColor: '#E8F5E9', }, family: { bg: '#F3E5F5', nameColor: 'text-purple-700', tailColor: '#F3E5F5', }, lab_tech: { bg: '#E0F7FA', nameColor: 'text-cyan-700', tailColor: '#E0F7FA', }, student: { bg: '#DCF8C6', nameColor: 'text-text-primary', tailColor: '#DCF8C6', }, }; /* ── Avatar resolver ── */ const AgentAvatar: React.FC<{ agentType: string; distressLevel?: string; urgencyLevel?: string; }> = ({ agentType, distressLevel, urgencyLevel }) => { const SIZE = 36; const wrapperClass = 'w-9 h-9 rounded-full flex items-center justify-center text-lg flex-shrink-0 shadow-sm'; switch (agentType) { case 'patient': return (
); case 'nurse': return (
); case 'senior_doctor': return (
); case 'family': return (
{'\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC66'}
); case 'lab_tech': return (
{'\uD83E\uDDEA'}
); default: return null; } }; /* ── Timestamp formatter ── */ function formatTimestamp(date: Date): string { return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: true }); } /* ── Urgency border class ── */ function urgencyBorderClass(level?: string): string { if (level === 'critical') return 'border-l-[3px] border-l-red-500'; if (level === 'urgent') return 'border-l-[3px] border-l-amber-500'; return ''; } /* ── Event (system) message ── */ const EventMessage: React.FC<{ message: AgentMessageData }> = ({ message }) => (
{message.content} {formatTimestamp(message.timestamp)}
); /* ── Main component ── */ export const AgentMessage: React.FC = ({ message }) => { /* Event / system messages get a centred pill style */ if (message.is_event) { return ; } const isStudent = message.agent_type === 'student'; const colors = AGENT_COLORS[message.agent_type] || AGENT_COLORS.student; /* Urgency border */ const urgencyBorder = !isStudent ? urgencyBorderClass(message.urgency_level) : ''; /* Teaching highlight */ const teachingRing = message.is_teaching && message.agent_type === 'senior_doctor' ? 'ring-2 ring-emerald-300/60 ring-offset-1' : ''; /* Intervention alert border */ const interventionBorder = message.is_intervention ? 'border-2 border-terracotta/60 shadow-md' : ''; return (
{/* Avatar — only for non-student (left side) */} {!isStudent && (
)} {/* Bubble + tail container */}
{/* CSS triangle tail */}
{/* Message bubble */}
{/* Agent name (not shown for student) */} {!isStudent && (
{message.display_name}
)} {/* Teaching badge */} {message.is_teaching && ( Teaching )} {/* Intervention badge */} {message.is_intervention && ( Intervention )} {/* Content */}
{message.content}
{/* Timestamp — bottom right, WhatsApp style */}
{formatTimestamp(message.timestamp)}
); };