import React from 'react'; import type { ChatMessage as ChatMessageType, Persona } from '@/lib/ai/types'; import { getPersonaIcon, UserIcon } from './Icons'; interface ChatMessageProps { message: ChatMessageType; persona: Persona; } export const ChatMessage: React.FC = ({ message, persona }) => { const isUser = message.role === 'user'; const Icon = getPersonaIcon(persona.icon); const formatInlineCode = (text: string, keyPrefix: string, isUserMsg: boolean) => { const codeRegex = /`([^`]+)`/g; const parts = text.split(codeRegex); return parts.map((part, i) => { if (i % 2 === 1) { const codeClass = isUserMsg ? "bg-black/20 text-white px-1.5 py-0.5 rounded text-sm font-mono" : "bg-gray-900/50 text-cyan-300 px-1.5 py-0.5 rounded text-sm font-mono border border-gray-700/50"; return {part}; } const boldRegex = /\*\*(.*?)\*\*/g; const boldParts = part.split(boldRegex); return boldParts.map((bPart, bI) => { if (bI % 2 === 1) { return {bPart}; } const italicRegex = /\*([^\*]+)\*/g; const italicParts = bPart.split(italicRegex); return italicParts.map((iPart, iI) => { if (iI % 2 === 1) { return {iPart}; } return {iPart}; }); }); }); }; const formatContent = (content: string, isUserMsg: boolean) => { const codeBlockRegex = /```([\s\S]*?)```/g; const parts = content.split(codeBlockRegex); return parts.map((part, index) => { if (index % 2 === 1) { const preClass = isUserMsg ? "bg-black/20 p-3 rounded-md overflow-x-auto my-2 text-white/90" : "bg-gray-950 p-3 rounded-md overflow-x-auto my-2 border border-gray-800"; const codeClass = isUserMsg ? "text-sm font-mono" : `text-sm font-mono ${persona.theme.primary}`; return (
            {part.trim()}
          
); } const lines = part.split('\n'); return (
{lines.map((line, lineIdx) => { const listMatch = line.match(/^(\s*)([-*]|\d+\.)\s+(.+)/); if (listMatch) { const [, , marker, text] = listMatch; const isOrdered = /^\d+\./.test(marker); return (
{isOrdered ? marker : '●'} {formatInlineCode(text, `${index}-${lineIdx}`, isUserMsg)}
); } if (line.trim() === '') { return
; } return (
{formatInlineCode(line, `${index}-${lineIdx}`, isUserMsg)}
); })}
); }); }; if (isUser) { return (
{formatContent(message.content, true)}
); } return (
{formatContent(message.content, false)}
); };