import { useEffect, useRef } from 'react' import { renderMarkdown } from '../utils/markdown' const PROVIDER_ICONS = { groq: 'โก', google: '๐', mistral: '๐ซ', huggingface: '๐ค', nvidia: 'โ', openrouter: '๐', } function addCopyButtons(el) { el.querySelectorAll('.hljs-pre').forEach(pre => { if (pre.parentElement?.classList.contains('code-wrap')) return const lang = pre.dataset.lang || 'code' const wrap = document.createElement('div'); wrap.className = 'code-wrap' const header = document.createElement('div'); header.className = 'code-header' const langLabel = document.createElement('span'); langLabel.className = 'code-lang'; langLabel.textContent = lang const copyBtn = document.createElement('button'); copyBtn.className = 'copy-btn' copyBtn.innerHTML = ` Copy` copyBtn.addEventListener('click', async () => { const code = pre.querySelector('code')?.textContent || pre.textContent await navigator.clipboard.writeText(code).catch(() => {}) copyBtn.innerHTML = ` Copied!` copyBtn.classList.add('copied') setTimeout(() => { copyBtn.innerHTML = ` Copy` copyBtn.classList.remove('copied') }, 2000) }) header.appendChild(langLabel); header.appendChild(copyBtn) pre.parentNode.insertBefore(wrap, pre); wrap.appendChild(header); wrap.appendChild(pre) }) } export default function MessageBubble({ message, index = 0, user }) { const { role, content, model_used, provider, attachments } = message const bubbleRef = useRef(null) const delay = Math.min(index * 60, 500) + 'ms' const html = role === 'assistant' ? renderMarkdown(content || '') : null useEffect(() => { if (role === 'assistant' && bubbleRef.current) { addCopyButtons(bubbleRef.current) } }, [content, role]) if (role === 'user') { return (