Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Restrict reactions to a single emoji #3069

Merged
merged 2 commits into from
Jun 6, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions src/HtmlUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ const ZWJ_REGEX = new RegExp("\u200D|\u2003", "g");
const WHITESPACE_REGEX = new RegExp("\\s", "g");

const BIGEMOJI_REGEX = new RegExp(`^(${EMOJIBASE_REGEX.source})+$`, 'i');
const SINGLE_EMOJI_REGEX = new RegExp(`^(${EMOJIBASE_REGEX.source})$`, 'i');

const COLOR_REGEX = /^#[0-9a-fA-F]{6}$/;

Expand All @@ -63,10 +64,19 @@ const PERMITTED_URL_SCHEMES = ['http', 'https', 'ftp', 'mailto', 'magnet'];
* need emojification.
* unicodeToImage uses this function.
*/
export function containsEmoji(str) {
export function mayContainEmoji(str) {
jryans marked this conversation as resolved.
Show resolved Hide resolved
return SURROGATE_PAIR_PATTERN.test(str) || SYMBOL_PATTERN.test(str);
}

/**
* Returns true if the string definitely contains a single emoji.
* @param {String} str String to test
* @return {Boolean}
*/
export function isSingleEmoji(str) {
return mayContainEmoji(str) && SINGLE_EMOJI_REGEX.test(str);
}

/**
* Returns the shortcode for an emoji character.
*
Expand Down Expand Up @@ -428,7 +438,7 @@ export function bodyToHtml(content, highlights, opts={}) {
if (opts.stripReplyFallback && formattedBody) formattedBody = ReplyThread.stripHTMLReply(formattedBody);
strippedBody = opts.stripReplyFallback ? ReplyThread.stripPlainReply(content.body) : content.body;

bodyHasEmoji = containsEmoji(isHtmlMessage ? formattedBody : content.body);
bodyHasEmoji = mayContainEmoji(isHtmlMessage ? formattedBody : content.body);

// Only generate safeBody if the message was sent as org.matrix.custom.html
if (isHtmlMessage) {
Expand Down
4 changes: 4 additions & 0 deletions src/components/views/messages/ReactionsRow.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import PropTypes from 'prop-types';

import sdk from '../../../index';
import { isContentActionable } from '../../../utils/EventUtils';
import { isSingleEmoji } from '../../../HtmlUtils';
import MatrixClientPeg from '../../../MatrixClientPeg';

export default class ReactionsRow extends React.PureComponent {
Expand Down Expand Up @@ -103,6 +104,9 @@ export default class ReactionsRow extends React.PureComponent {

const ReactionsRowButton = sdk.getComponent('messages.ReactionsRowButton');
const items = reactions.getSortedAnnotationsByKey().map(([content, events]) => {
if (!isSingleEmoji(content)) {
return null;
}
const count = events.size;
if (!count) {
return null;
Expand Down