import { formatTime } from "../../../utils/utils"; import type { Message as MessageType } from "../../../core/types"; import defaultAvatar from "../../../resources/images/default-avatar.png"; import Quote from "../core/Quote"; interface MessageProps { message: MessageType; isAuthor: boolean; onProfileClick: (username: string) => void; onContextMenu: (e: React.MouseEvent, message: MessageType) => void; isLoadingProfile?: boolean; isDm?: boolean; } export function Message({ message, isAuthor, onProfileClick, onContextMenu, isLoadingProfile = false, isDm = false }: MessageProps) { const handleContextMenu = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); onContextMenu(e, message); }; return (
{/* Add profile picture for received messages */} {!isAuthor && !isDm && (
{message.username} !isLoadingProfile && onProfileClick(message.username)} style={{ cursor: isLoadingProfile ? "default" : "pointer" }} className={isLoadingProfile ? "loading" : ""} onError={(e) => { const target = e.target as HTMLImageElement; target.src = defaultAvatar; }} />
)} {!isAuthor && !isDm && (
!isLoadingProfile && onProfileClick(message.username)} style={{ cursor: isLoadingProfile ? "default" : "pointer" }}> {/* TODO extract to SCSS */} {message.username}
)} {/* Add reply preview if this is a reply */} {message.reply_to && ( {message.reply_to.username} {message.reply_to.content} )}
{message.content}
{formatTime(message.timestamp)} {message.is_edited ? " (edited)" : undefined} {isAuthor && message.is_read ? ( ) : undefined}
); }