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 @{displayedName};
} else {
return {PubKey.shorten(props.text)};
}
};
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 = [];
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();
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}>;
};