import { MAX_SOURCE_MESSAGE_LENGTH } from '@rocket.chat/ai-search'; import type { IRoom } from '@rocket.chat/core-typings'; import { Box, Icon, Message, MessageBody, MessageContainer, MessageContainerFixed, MessageHeader, MessageLeftContainer, MessageName, MessageRole, MessageTimestamp, MessageUsername, } from '@rocket.chat/fuselage'; import type { AISearchResult } from '@rocket.chat/rest-typings'; import { MessageAvatar } from '@rocket.chat/ui-avatar'; import type { ComponentProps, ReactElement } from 'react'; import { useTranslation } from 'react-i18next'; import MarkdownText from '../../components/MarkdownText'; import { roomCoordinator } from '../../lib/rooms/roomCoordinator'; const formatMessageTime = (ts: string | undefined): string => { if (!ts) { return ''; } const date = new Date(ts); if (Number.isNaN(date.getTime())) { return ''; } return date.toLocaleDateString([], { month: 'short', day: 'numeric' }); }; const getMessageHref = (item: AISearchResult): string | undefined => { const { room } = item; if (!room) { return undefined; } const href = roomCoordinator.getRouteLink(room.t, { rid: room._id || item.rid, name: room.name, }); return href ? `${href}?msg=${encodeURIComponent(item.msgId || item._id)}` : undefined; }; const trimSourceMessage = (text: string): string => text.length > MAX_SOURCE_MESSAGE_LENGTH ? `${text.slice(0, MAX_SOURCE_MESSAGE_LENGTH).trimEnd()}...` : text; const getRoomIcon = (roomType: IRoom['t'] | undefined): ComponentProps['name'] => { if (roomType === 'd') { return 'at'; } if (roomType === 'p') { return 'lock'; } return 'hash'; }; export type SearchSourceResultProps = { item: AISearchResult; }; const SearchSourceResult = ({ item }: SearchSourceResultProps): ReactElement => { const { t } = useTranslation(); const roomLabel = item.room?.fname || item.room?.name; const href = getMessageHref(item); const username = item.u?.username || item.u?.name || t('Unknown_User'); const displayName = item.u?.name || username; const messageTime = formatMessageTime(item.ts); const relevanceScore = typeof item.score === 'number' ? Math.max(0, Math.min(100, Math.round(item.score * 100))) : undefined; return ( {displayName} {item.u?.username && ( <> {' '} @{item.u.username} )} {roomLabel && ( {roomLabel} )} {messageTime && {messageTime}} {typeof relevanceScore === 'number' && ( {relevanceScore}% )} {href && ( )} ); }; export default SearchSourceResult;