import Link from 'next/link' import { chatText } from '@/lib/i18n/chat' import { splitBody } from '@/lib/chat/mentions' import { stampColor } from '@/components/StampMark' import type { CasePreview } from '@/lib/chat/preview' /** * Nachrichtentext mit hervorgehobenen Erwähnungen und Aktenzeichen. * * Der Text wird **zerlegt**, nicht als HTML gebaut: kein * `dangerouslySetInnerHTML` für Nutzerinhalte, siehe docs/07. * * Die Vorschaukarte zu einem Aktenzeichen ist serverseitig aufgelöst. Eine * Akte, die der Leser nicht sehen darf, sieht hier genauso aus wie eine, die * es gar nicht gibt. */ export function MessageBody({ body, mentionNames, previews, }: { body: string /** Anzeigename je erwähntem Benutzernamen, kleingeschrieben. */ mentionNames: Map previews: Map }) { const stuecke = splitBody(body) return (

{stuecke.map((stueck, index) => { if (stueck.kind === 'text') return {stueck.value} if (stueck.kind === 'mention') { const name = stueck.value.slice(1).toLowerCase() const bekannt = mentionNames.has(name) return ( {stueck.value} ) } const vorschau = previews.get(stueck.value) if (!vorschau) return {stueck.value} if (!vorschau.visible) { return ( {stueck.value} · {chatText.hiddenCase} ) } return ( {vorschau.caseNumber} {vorschau.title} ) })}

) }