You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-11-28 05:03:59 +03:00
move the fact that we're prototyping only with joined members up the stack to client
only MatrixClient really needs to know that for now we only load joined members, the rest of the code can be generic for other membership types as that is the eventual plan, to also support invites at least.
This commit is contained in:
@@ -767,7 +767,18 @@ MatrixClient.prototype.loadRoomMembersIfNeeded = async function(roomId) {
|
||||
if (!room || !room.membersNeedLoading()) {
|
||||
return;
|
||||
}
|
||||
const membersPromise = this.joinedMembers(roomId);
|
||||
const joinedMembersPromise = this.joinedMembers(roomId);
|
||||
const membersPromise = joinedMembersPromise.then((profiles) => {
|
||||
return Object.entries(profiles).map(([userId, profile]) => {
|
||||
return {
|
||||
userId: userId,
|
||||
avatarUrl: profile.avatar_url,
|
||||
displayName: profile.display_name,
|
||||
membership: "join", // as we need to support invitees as well
|
||||
// in the future, already include but hardcode it
|
||||
};
|
||||
});
|
||||
});
|
||||
await room.setLazilyLoadedMembers(membersPromise);
|
||||
};
|
||||
|
||||
|
||||
@@ -74,11 +74,11 @@ function EventTimelineSet(room, opts) {
|
||||
utils.inherits(EventTimelineSet, EventEmitter);
|
||||
|
||||
/**
|
||||
* Sets the lazily loaded members. For now only joined members.
|
||||
* @param {Profile[]} joinedMembers array with {avatar_url, display_name } tuples
|
||||
* Sets the lazily loaded members.
|
||||
* @param {Member[]} members array of {userId, avatarUrl, displayName, membership} tuples
|
||||
*/
|
||||
EventTimelineSet.prototype.setJoinedMembers = function(joinedMembers) {
|
||||
this._timelines.forEach((tl) => tl.setJoinedMembers(joinedMembers));
|
||||
EventTimelineSet.prototype.setLazilyLoadedMembers = function(members) {
|
||||
this._timelines.forEach((tl) => tl.setLazilyLoadedMembers(members));
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -159,12 +159,12 @@ EventTimeline.prototype.getRoomId = function() {
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the lazily loaded members. For now only joined members.
|
||||
* @param {Profile[]} joinedMembers array with {avatar_url, display_name } tuples
|
||||
* Sets the lazily loaded members.
|
||||
* @param {Member[]} members array of {userId, avatarUrl, displayName, membership} tuples
|
||||
*/
|
||||
EventTimeline.prototype.setJoinedMembers = function(joinedMembers) {
|
||||
this._startState.setJoinedMembers(joinedMembers);
|
||||
this._endState.setJoinedMembers(joinedMembers);
|
||||
EventTimeline.prototype.setLazilyLoadedMembers = function(members) {
|
||||
this._startState.setLazilyLoadedMembers(members);
|
||||
this._endState.setLazilyLoadedMembers(members);
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -105,15 +105,14 @@ RoomMember.prototype.setMembershipEvent = function(event, roomState) {
|
||||
|
||||
/**
|
||||
* Update this room member from a lazily loaded member
|
||||
* @param {string} displayName
|
||||
* @param {string} avatarUrl
|
||||
* @param {Member} memberInfo a {userId, avatarUrl, displayName, membership} tuple
|
||||
* @param {RoomState} roomState the room state this member is part of, needed to disambiguate the display name
|
||||
*/
|
||||
RoomMember.prototype.setAsJoinedMember = function(displayName, avatarUrl, roomState) {
|
||||
this.membership = "join";
|
||||
this.name = calculateDisplayName(this.userId, displayName, roomState);
|
||||
this.rawDisplayName = displayName || this.userId;
|
||||
this._lazyLoadAvatarUrl = avatarUrl;
|
||||
RoomMember.prototype.setAsLazilyLoadedMember = function(memberInfo, roomState) {
|
||||
this.membership = memberInfo.membership;
|
||||
this.name = calculateDisplayName(this.userId, memberInfo.displayName, roomState);
|
||||
this.rawDisplayName = memberInfo.displayName || this.userId;
|
||||
this._lazyLoadAvatarUrl = memberInfo.avatarUrl;
|
||||
this._isLazilyLoaded = true;
|
||||
//TODO: race condition between existing membership events since started syncing
|
||||
};
|
||||
|
||||
@@ -275,27 +275,29 @@ RoomState.prototype._updateMember = function(member) {
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the lazily loaded members. For now only joined members.
|
||||
* @param {Profile[]} joinedMembers array with {avatar_url, display_name } tuples
|
||||
* Sets the lazily loaded members.
|
||||
* @param {Member[]} members array of {userId, avatarUrl, displayName, membership} tuples
|
||||
*/
|
||||
RoomState.prototype.setJoinedMembers = function(joinedMembers) {
|
||||
Object.entries(joinedMembers).forEach(([userId, details]) => {
|
||||
this._setJoinedMember(userId, details.display_name, details.avatar_url);
|
||||
});
|
||||
RoomState.prototype.setLazilyLoadedMembers = function(members) {
|
||||
members.forEach((member) => this._setLazilyLoadedMember(member));
|
||||
};
|
||||
|
||||
RoomState.prototype._setJoinedMember = function(userId, displayName, avatarUrl) {
|
||||
const member = new RoomMember(this.roomId, userId);
|
||||
/**
|
||||
* Add/updates a lazily loaded member.
|
||||
* @param {Member} memberInfo a {userId, avatarUrl, displayName, membership} tuple
|
||||
*/
|
||||
RoomState.prototype._setLazilyLoadedMember = function(memberInfo) {
|
||||
const member = new RoomMember(this.roomId, memberInfo.userId);
|
||||
// try to find the member event for the user and set it first on the member
|
||||
// so inspection of the event is possible later on if we have it
|
||||
const userMemberEvent = this.getStateEvents("m.room.member", userId);
|
||||
const userMemberEvent = this.getStateEvents("m.room.member", member.userId);
|
||||
if (userMemberEvent) {
|
||||
member.setMembershipEvent(userMemberEvent, this);
|
||||
}
|
||||
// override the displayName and avatarUrl from the lazily loaded members
|
||||
// as this is guaranteed to be the current state
|
||||
member.setAsJoinedMember(displayName, avatarUrl, this);
|
||||
const isNewMember = !this.members[userId];
|
||||
member.setAsLazilyLoadedMember(memberInfo, this);
|
||||
|
||||
const isNewMember = !this.members[member.userId];
|
||||
|
||||
_updateDisplayNameCache(this, member.userId, member.name);
|
||||
this._updateMember(member);
|
||||
|
||||
@@ -226,18 +226,18 @@ Room.prototype.membersNeedLoading = function() {
|
||||
|
||||
/**
|
||||
* Sets the lazily loaded members from the result of calling /joined_members
|
||||
* @param {Promise} joinedMembersPromise promise with result of /joined_members endpoint
|
||||
* @param {Promise} membersPromise promise with array of {userId, avatarUrl, displayName, membership} tuples
|
||||
*/
|
||||
Room.prototype.setLazilyLoadedMembers = async function(joinedMembersPromise) {
|
||||
Room.prototype.setLazilyLoadedMembers = async function(membersPromise) {
|
||||
this._membersNeedLoading = false;
|
||||
let members = null;
|
||||
try {
|
||||
members = await joinedMembersPromise;
|
||||
members = await membersPromise;
|
||||
} catch (err) {
|
||||
this._membersNeedLoading = true;
|
||||
throw err; //rethrow so calling code is aware operation failed
|
||||
}
|
||||
this._timelineSets.forEach((tlSet) => tlSet.setJoinedMembers(members.joined));
|
||||
this._timelineSets.forEach((tlSet) => tlSet.setLazilyLoadedMembers(members));
|
||||
this.emit('Room', this);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user