You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/components/conversation/AddMentions.tsx

76 lines
2.1 KiB
TypeScript

import { RenderTextCallbackType } from '../../types/Util';
import classNames from 'classnames';
import { PubKey } from '../../session/types';
import { UserUtils } from '../../session/utils';
import { getConversationController } from '../../session/conversations';
import React from 'react';
interface MentionProps {
key: string;
text: string;
}
const Mention = (props: MentionProps) => {
const foundConvo = getConversationController().get(props.text.slice(1));
let us = false;
if (foundConvo) {
us = UserUtils.isUsFromCache(foundConvo.id);
}
if (foundConvo) {
// TODO: We don't have to search the database of message just to know that the message is for us!
const className = classNames('mention-profile-name', us && 'mention-profile-name-us');
const displayedName = foundConvo.getContactProfileNameOrShortenedPubKey();
return <span className={className}>@{displayedName}</span>;
} else {
return <span className="mention-profile-name">{PubKey.shorten(props.text)}</span>;
}
};
type Props = {
text: string;
renderOther?: RenderTextCallbackType;
isGroup: boolean;
};
const defaultRenderOther = ({ text }: { text: string }) => <>{text}</>;
export const AddMentions = (props: Props): JSX.Element => {
const { text, renderOther, isGroup } = props;
const results: Array<JSX.Element> = [];
const FIND_MENTIONS = new RegExp(`@${PubKey.regexForPubkeys}`, 'g');
const renderWith = renderOther || defaultRenderOther;
let match = FIND_MENTIONS.exec(text);
let last = 0;
let count = 1000;
if (!match) {
return renderWith({ text, key: 0, isGroup });
}
while (match) {
count++;
const key = count;
if (last < match.index) {
const otherText = text.slice(last, match.index);
results.push(renderWith({ text: otherText, key, isGroup }));
}
const pubkey = text.slice(match.index, FIND_MENTIONS.lastIndex);
results.push(<Mention text={pubkey} key={`${key}`} />);
last = FIND_MENTIONS.lastIndex;
match = FIND_MENTIONS.exec(text);
}
if (last < text.length) {
results.push(renderWith({ text: text.slice(last), key: count++, isGroup }));
}
return <>{results}</>;
};