import { FC, ReactNode } from 'react'; import cn from 'classnames'; import { Tooltip } from 'antd'; import { useRecoilValue } from 'recoil'; import dynamic from 'next/dynamic'; import { Interweave } from 'interweave'; import { UrlMatcher } from 'interweave-autolink'; import { ChatMessageHighlightMatcher } from './customMatcher'; import styles from './ChatUserMessage.module.scss'; import { formatTimestamp } from './messageFmt'; import { ChatMessage } from '../../../interfaces/chat-message.model'; import { accessTokenAtom } from '../../stores/ClientConfigStore'; import { User } from '../../../interfaces/user.model'; import { AuthedUserBadge } from '../ChatUserBadge/AuthedUserBadge'; import { ModerationBadge } from '../ChatUserBadge/ModerationBadge'; import { BotUserBadge } from '../ChatUserBadge/BotUserBadge'; // Lazy loaded components const ChatModerationActionMenu = dynamic( () => import('../ChatModerationActionMenu/ChatModerationActionMenu').then( mod => mod.ChatModerationActionMenu, ), { ssr: false, }, ); export type ChatUserMessageProps = { message: ChatMessage; showModeratorMenu: boolean; highlightString: string; sentBySelf: boolean; sameUserAsLast: boolean; isAuthorModerator: boolean; isAuthorAuthenticated: boolean; isAuthorBot: boolean; }; export type UserTooltipProps = { user: User; children: ReactNode; }; const UserTooltip: FC = ({ children, user }) => { const { displayName, createdAt } = user; const content = `${displayName} first joined ${formatTimestamp(createdAt)}`; return ( {children} ); }; export const ChatUserMessage: FC = ({ message, highlightString, showModeratorMenu, sentBySelf, // Move the border to the right and render a background sameUserAsLast, isAuthorModerator, isAuthorAuthenticated, isAuthorBot, }) => { const { id: messageId, body, user, timestamp } = message; const { id: userId, displayName, displayColor } = user; const accessToken = useRecoilValue(accessTokenAtom); const color = `var(--theme-color-users-${displayColor})`; const formattedTimestamp = `Sent ${formatTimestamp(timestamp)}`; const badgeNodes = []; if (isAuthorModerator) { badgeNodes.push(); } if (isAuthorAuthenticated) { badgeNodes.push(); } if (isAuthorBot) { badgeNodes.push(); } return (
{!sameUserAsLast && (
{displayName} {badgeNodes}
)} {showModeratorMenu && (
)}
); };