Fix bug where avatar change not reflected in LLP

Fixes vector-im/riot-web#6189
This commit is contained in:
Luke Barnard 2018-03-01 14:40:03 +00:00
parent 1ac62a17ff
commit 4037a22492
3 changed files with 48 additions and 11 deletions

View file

@ -29,6 +29,7 @@ import classnames from 'classnames';
import GroupStoreCache from '../../stores/GroupStoreCache'; import GroupStoreCache from '../../stores/GroupStoreCache';
import GroupStore from '../../stores/GroupStore'; import GroupStore from '../../stores/GroupStore';
import FlairStore from '../../stores/FlairStore';
import { showGroupAddRoomDialog } from '../../GroupAddressPicker'; import { showGroupAddRoomDialog } from '../../GroupAddressPicker';
import GeminiScrollbar from 'react-gemini-scrollbar'; import GeminiScrollbar from 'react-gemini-scrollbar';
import {makeGroupPermalink, makeUserPermalink} from "../../matrix-to"; import {makeGroupPermalink, makeUserPermalink} from "../../matrix-to";
@ -429,6 +430,7 @@ export default React.createClass({
editing: false, editing: false,
saving: false, saving: false,
uploadingAvatar: false, uploadingAvatar: false,
avatarChanged: false,
membershipBusy: false, membershipBusy: false,
publicityBusy: false, publicityBusy: false,
inviterProfile: null, inviterProfile: null,
@ -590,6 +592,10 @@ export default React.createClass({
this.setState({ this.setState({
uploadingAvatar: false, uploadingAvatar: false,
profileForm: newProfileForm, profileForm: newProfileForm,
// Indicate that FlairStore needs to be poked to show this change
// in TagTile (TagPanel), Flair and GroupTile (MyGroups).
avatarChanged: true,
}); });
}).catch((e) => { }).catch((e) => {
this.setState({uploadingAvatar: false}); this.setState({uploadingAvatar: false});
@ -615,6 +621,11 @@ export default React.createClass({
}); });
dis.dispatch({action: 'panel_disable'}); dis.dispatch({action: 'panel_disable'});
this._initGroupStore(this.props.groupId); this._initGroupStore(this.props.groupId);
if (this.state.avatarChanged) {
// XXX: Evil - poking a store should be done from an async action
FlairStore.refreshGroupProfile(this._matrixClient, this.props.groupId);
}
}).catch((e) => { }).catch((e) => {
this.setState({ this.setState({
saving: false, saving: false,
@ -625,6 +636,10 @@ export default React.createClass({
title: _t('Error'), title: _t('Error'),
description: _t('Failed to update community'), description: _t('Failed to update community'),
}); });
}).finally(() => {
this.setState({
avatarChanged: false,
});
}).done(); }).done();
}, },

View file

@ -55,6 +55,20 @@ export default React.createClass({
componentWillMount() { componentWillMount() {
this.unmounted = false; this.unmounted = false;
if (this.props.tag[0] === '+') { if (this.props.tag[0] === '+') {
FlairStore.addListener('updateGroupProfile', this._onFlairStoreUpdated);
this._onFlairStoreUpdated();
}
},
componentWillUnmount() {
this.unmounted = true;
if (this.props.tag[0] === '+') {
FlairStore.removeListener('updateGroupProfile', this._onFlairStoreUpdated);
}
},
_onFlairStoreUpdated() {
if (this.unmounted) return;
FlairStore.getGroupProfileCached( FlairStore.getGroupProfileCached(
this.context.matrixClient, this.context.matrixClient,
this.props.tag, this.props.tag,
@ -64,11 +78,6 @@ export default React.createClass({
}).catch((err) => { }).catch((err) => {
console.warn('Could not fetch group profile for ' + this.props.tag, err); console.warn('Could not fetch group profile for ' + this.props.tag, err);
}); });
}
},
componentWillUnmount() {
this.unmounted = true;
}, },
onClick: function(e) { onClick: function(e) {

View file

@ -14,6 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
import EventEmitter from 'events';
import Promise from 'bluebird'; import Promise from 'bluebird';
const BULK_REQUEST_DEBOUNCE_MS = 200; const BULK_REQUEST_DEBOUNCE_MS = 200;
@ -28,8 +29,9 @@ const GROUP_PROFILES_CACHE_BUST_MS = 1800000; // 30 mins
/** /**
* Stores data used by <Flair/> * Stores data used by <Flair/>
*/ */
class FlairStore { class FlairStore extends EventEmitter {
constructor(matrixClient) { constructor(matrixClient) {
super();
this._matrixClient = matrixClient; this._matrixClient = matrixClient;
this._userGroups = { this._userGroups = {
// $userId: ['+group1:domain', '+group2:domain', ...] // $userId: ['+group1:domain', '+group2:domain', ...]
@ -175,12 +177,23 @@ class FlairStore {
}; };
delete this._groupProfilesPromise[groupId]; delete this._groupProfilesPromise[groupId];
/// XXX: This is verging on recreating a third "Flux"-looking Store. We really
/// should replace FlairStore with a Flux store and some async actions.
this.emit('updateGroupProfile');
setTimeout(() => { setTimeout(() => {
delete this._groupProfiles[groupId]; this.refreshGroupProfile(groupId);
}, GROUP_PROFILES_CACHE_BUST_MS); }, GROUP_PROFILES_CACHE_BUST_MS);
return this._groupProfiles[groupId]; return this._groupProfiles[groupId];
} }
refreshGroupProfile(matrixClient, groupId) {
// Invalidate the cache
delete this._groupProfiles[groupId];
// Fetch new profile data, and cache it
return this.getGroupProfileCached(matrixClient, groupId);
}
} }
if (global.singletonFlairStore === undefined) { if (global.singletonFlairStore === undefined) {