diff --git a/app/javascript/mastodon/actions/accounts.js b/app/javascript/mastodon/actions/accounts.js
index ebf3f672d..0688ef338 100644
--- a/app/javascript/mastodon/actions/accounts.js
+++ b/app/javascript/mastodon/actions/accounts.js
@@ -138,8 +138,13 @@ export function fetchAccountsFromStatuses(statuses) {
return fetchAccounts(
uniq(
statuses
- .flatMap(item => item.emoji_reactions)
- .flatMap(emoji_reaction => emoji_reaction.account_ids)
+ .flatMap(status => status.reblog ? status.reblog.emoji_reactions : status.emoji_reactions)
+ .concat(
+ statuses
+ .flatMap(status => status.quote ? status.quote.emoji_reactions : null)
+ )
+ .flatMap(emoji_reaction => emoji_reaction?.account_ids)
+ .filter(e => !!e)
)
);
};
diff --git a/app/javascript/mastodon/actions/streaming.js b/app/javascript/mastodon/actions/streaming.js
index 1ae7912fa..1563aff32 100644
--- a/app/javascript/mastodon/actions/streaming.js
+++ b/app/javascript/mastodon/actions/streaming.js
@@ -9,6 +9,7 @@ import {
connectTimeline,
disconnectTimeline,
} from './timelines';
+import { fetchRelationships, fetchAccounts } from './accounts';
import { getHomeVisibilities } from 'mastodon/selectors';
import { updateNotifications, expandNotifications } from './notifications';
import { updateConversations } from './conversations';
@@ -94,7 +95,10 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
dispatch(fetchFilters());
break;
case 'emoji_reaction':
- dispatch(updateEmojiReaction(JSON.parse(data.payload)));
+ const emojiReaction = JSON.parse(data.payload);
+ dispatch(fetchRelationships(emojiReaction.account_ids));
+ dispatch(fetchAccounts(emojiReaction.account_ids));
+ dispatch(updateEmojiReaction(emojiReaction));
break;
case 'announcement':
dispatch(updateAnnouncements(JSON.parse(data.payload)));
diff --git a/app/javascript/mastodon/components/emoji_reactions_bar.js b/app/javascript/mastodon/components/emoji_reactions_bar.js
index c1280fabe..2374af399 100644
--- a/app/javascript/mastodon/components/emoji_reactions_bar.js
+++ b/app/javascript/mastodon/components/emoji_reactions_bar.js
@@ -1,7 +1,10 @@
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
-import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
+import { makeGetAccount } from 'mastodon/selectors';
+import ImmutablePropTypes, { list } from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
+import { List } from 'immutable';
import classNames from 'classnames';
import Emoji from './emoji';
import unicodeMapping from 'mastodon/features/emoji/emoji_unicode_mapping_light';
@@ -9,6 +12,85 @@ import TransitionMotion from 'react-motion/lib/TransitionMotion';
import AnimatedNumber from 'mastodon/components/animated_number';
import { reduceMotion, me } from 'mastodon/initial_state';
import spring from 'react-motion/lib/spring';
+import Avatar from 'mastodon/components/avatar';
+import Overlay from 'react-overlays/lib/Overlay';
+import { FormattedMessage, injectIntl } from 'react-intl';
+import { isUserTouching } from 'mastodon/is_mobile';
+
+const makeMapStateToProps = () => {
+ const getAccount = makeGetAccount();
+
+ const mapStateToProps = (state, { accountId }) => ({
+ account: getAccount(state, accountId),
+ });
+
+ return mapStateToProps;
+};
+
+@connect(makeMapStateToProps)
+class Account extends ImmutablePureComponent {
+
+ static propTypes = {
+ account: ImmutablePropTypes.map,
+ };
+
+ render () {
+ const { account } = this.props;
+
+ if ( !account ) {
+ return