import type { StoredMessage, Topic } from 'tinode-sdk'; import { Icon } from '@/app/Icon'; import { avatarBgClass, avatarLetter } from '@/lib/avatar'; import { isRecalled, isServerDeleted, systemNoticeText } from '@/lib/messages/dispatch'; import { renderDrafty } from '@/lib/messages/drafty'; import { formatBubbleTime, formatEventTimestamp } from '@/lib/messages/time'; import { isFailedStatus, isSendingStatus, outgoingStatusLabel } from '@/lib/messages/status'; import { retryMessage } from '@/lib/tinode/send'; interface MessageRowProps { topic: Topic; msg: StoredMessage; mine: boolean; isGroup: boolean; peerName: string; myUserId: string | null; selectMode?: boolean; selected?: boolean; /** README §3.5: "选中气泡加 outline:2px solid #1677ff" -- true while this message is the open * context menu's target. */ menuActive?: boolean; onToggleSelect?: (seq: number) => void; onContextMenu?: (e: React.MouseEvent, msg: StoredMessage) => void; } export function MessageRow({ topic, msg, mine, isGroup, peerName, myUserId, selectMode, selected, menuActive, onToggleSelect, onContextMenu, }: MessageRowProps) { if (isServerDeleted(msg)) { return