From 5482f8e72e72ba1323d5991454c9c36b608d6256 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Mon, 9 Sep 2024 20:51:52 +1000 Subject: [PATCH] render matrix room and event link content (#1938) --- src/app/plugins/react-custom-html-parser.tsx | 31 +++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/app/plugins/react-custom-html-parser.tsx b/src/app/plugins/react-custom-html-parser.tsx index ab333704b..6a4d05306 100644 --- a/src/app/plugins/react-custom-html-parser.tsx +++ b/src/app/plugins/react-custom-html-parser.tsx @@ -14,7 +14,12 @@ import { IntermediateRepresentation, Opts as LinkifyOpts, OptFn } from 'linkifyj import Linkify from 'linkify-react'; import { ErrorBoundary } from 'react-error-boundary'; import * as css from '../styles/CustomHtml.css'; -import { getMxIdLocalPart, getCanonicalAliasRoomId, isRoomAlias, mxcUrlToHttp } from '../utils/matrix'; +import { + getMxIdLocalPart, + getCanonicalAliasRoomId, + isRoomAlias, + mxcUrlToHttp, +} from '../utils/matrix'; import { getMemberDisplayName } from '../utils/room'; import { EMOJI_PATTERN, URL_NEG_LB } from '../utils/regex'; import { getHexcodeForEmoji, getShortcodeFor } from './emoji'; @@ -44,7 +49,8 @@ export const LINKIFY_OPTS: LinkifyOpts = { }; export const makeMentionCustomProps = ( - handleMentionClick?: ReactEventHandler + handleMentionClick?: ReactEventHandler, + content?: string ): ComponentPropsWithoutRef<'a'> => ({ style: { cursor: 'pointer' }, target: '_blank', @@ -53,6 +59,7 @@ export const makeMentionCustomProps = ( tabIndex: handleMentionClick ? 0 : -1, onKeyDown: handleMentionClick ? onEnterOrSpace(handleMentionClick) : undefined, onClick: handleMentionClick, + children: content, }); export const renderMatrixMention = ( @@ -72,8 +79,9 @@ export const renderMatrixMention = ( className={css.Mention({ highlight: mx.getUserId() === userId })} data-mention-id={userId} > - {`@${(currentRoom && getMemberDisplayName(currentRoom, userId)) ?? getMxIdLocalPart(userId) - }`} + {`@${ + (currentRoom && getMemberDisplayName(currentRoom, userId)) ?? getMxIdLocalPart(userId) + }`} ); } @@ -85,6 +93,8 @@ export const renderMatrixMention = ( isRoomAlias(roomIdOrAlias) ? getCanonicalAliasRoomId(mx, roomIdOrAlias) : roomIdOrAlias ); + const fallbackContent = mentionRoom ? `#${mentionRoom.name}` : roomIdOrAlias; + return ( - {mentionRoom ? `#${mentionRoom.name}` : roomIdOrAlias} + {customProps.children ? customProps.children : fallbackContent} ); } @@ -118,7 +128,9 @@ export const renderMatrixMention = ( data-mention-event-id={eventId} data-mention-via={viaServers?.join(',')} > - Message: {mentionRoom ? `#${mentionRoom.name}` : roomIdOrAlias} + {customProps.children + ? customProps.children + : `Message: ${mentionRoom ? `#${mentionRoom.name}` : roomIdOrAlias}`} ); } @@ -327,12 +339,17 @@ export const getReactCustomHtmlParser = ( } if (name === 'a' && testMatrixTo(tryDecodeURIComponent(props.href))) { + const content = children.find((child) => !(child instanceof DOMText)) + ? undefined + : children.map((c) => (c instanceof DOMText ? c.data : '')).join(); + const mention = renderMatrixMention( mx, roomId, tryDecodeURIComponent(props.href), - makeMentionCustomProps(params.handleMentionClick) + makeMentionCustomProps(params.handleMentionClick, content) ); + if (mention) return mention; }