diff --git a/src/components/views/elements/Flair.js b/src/components/views/elements/Flair.js
index cb60be4fef..cce115dc45 100644
--- a/src/components/views/elements/Flair.js
+++ b/src/components/views/elements/Flair.js
@@ -20,6 +20,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import {MatrixClient} from 'matrix-js-sdk';
import UserSettingsStore from '../../../UserSettingsStore';
+import dis from '../../../dispatcher';
import Promise from 'bluebird';
const BULK_REQUEST_DEBOUNCE_MS = 200;
@@ -120,15 +121,54 @@ async function getGroupProfileCached(matrixClient, groupId) {
return groupProfiles[groupId];
}
- groupProfiles[groupId] = await matrixClient.getGroupProfile(groupId);
+ const profile = await matrixClient.getGroupProfile(groupId);
+ groupProfiles[groupId] = {
+ groupId,
+ avatarUrl: profile.avatar_url,
+ };
+
return groupProfiles[groupId];
}
+class FlairAvatar extends React.Component {
+ constructor() {
+ super();
+ this.onClick = this.onClick.bind(this);
+ }
+
+ onClick(ev) {
+ ev.preventDefault();
+ // Don't trigger onClick of parent element
+ ev.stopPropagation();
+ dis.dispatch({
+ action: 'view_group',
+ group_id: this.props.groupProfile.groupId,
+ });
+ }
+
+ render() {
+ const httpUrl = this.context.matrixClient.mxcUrlToHttp(
+ this.props.groupProfile.avatarUrl, 14, 14, 'scale', false);
+ return ;
+ }
+}
+
+FlairAvatar.propTypes = {
+ groupProfile: PropTypes.shape({
+ groupId: PropTypes.string.isRequired,
+ avatarUrl: PropTypes.string.isRequired,
+ }),
+};
+
+FlairAvatar.contextTypes = {
+ matrixClient: React.PropTypes.instanceOf(MatrixClient).isRequired,
+};
+
export default class Flair extends React.Component {
constructor() {
super();
this.state = {
- avatarUrls: [],
+ profiles: [],
};
}
@@ -143,7 +183,7 @@ export default class Flair extends React.Component {
}
}
- async _getAvatarUrls(groups) {
+ async _getGroupProfiles(groups) {
const profiles = [];
for (const groupId of groups) {
let groupProfile = null;
@@ -154,9 +194,7 @@ export default class Flair extends React.Component {
}
profiles.push(groupProfile);
}
-
- const avatarUrls = profiles.filter((p) => p !== null).map((p) => p.avatar_url);
- return avatarUrls;
+ return profiles.filter((p) => p !== null);
}
async _generateAvatars() {
@@ -176,19 +214,18 @@ export default class Flair extends React.Component {
if (!groups || groups.length === 0) {
return;
}
- const avatarUrls = await this._getAvatarUrls(groups);
+ const profiles = await this._getGroupProfiles(groups);
if (!this.unmounted) {
- this.setState({avatarUrls});
+ this.setState({profiles});
}
}
render() {
- if (this.state.avatarUrls.length === 0) {
+ if (this.state.profiles.length === 0) {
return