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

Don't re-sort the room-list based on profile/status changes #6595

Merged
merged 9 commits into from
Aug 25, 2021
4 changes: 4 additions & 0 deletions src/stores/room-list/RoomListStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import { SpaceWatcher } from "./SpaceWatcher";
import SpaceStore from "../SpaceStore";
import { Action } from "../../dispatcher/actions";
import { SettingUpdatedPayload } from "../../dispatcher/payloads/SettingUpdatedPayload";
import { ignoreSelfEvent } from "./algorithms/tag-sorting/RecentAlgorithm";

interface IState {
tagsEnabled?: boolean;
Expand Down Expand Up @@ -270,6 +271,9 @@ export class RoomListStoreClass extends AsyncStoreWithClient<IState> {
// Ignore non-live events (backfill)
if (!eventPayload.isLiveEvent || !payload.isLiveUnfilteredRoomTimelineEvent) return;

// Avoid re-ordering on status, profile etc. changes
if (ignoreSelfEvent(eventPayload.event)) return;

const roomId = eventPayload.event.getRoomId();
const room = this.matrixClient.getRoom(roomId);
const tryUpdate = async (updatedRoom: Room) => {
Expand Down
19 changes: 19 additions & 0 deletions src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,25 @@ import { IAlgorithm } from "./IAlgorithm";
import { MatrixClientPeg } from "../../../../MatrixClientPeg";
import * as Unread from "../../../../Unread";
import { EffectiveMembership, getEffectiveMembership } from "../../../../utils/membership";
import { EventType } from "matrix-js-sdk/src/@types/event";
import { MatrixEvent } from "matrix-js-sdk/src/models/event";

export function ignoreSelfEvent(event: MatrixEvent): boolean {
const type = event.getType();
const content = event.getContent();
const prevContent = event.getPrevContent();

// Never ignore membership changes
if (type === EventType.RoomMember && prevContent.membership !== content.membership) return false;

// Ignore status changes
// XXX: This should be an enum
if (type === "im.vector.user_status") return true;
// Ignore display name changes
if (type === EventType.RoomMember && prevContent.displayname !== content.displayname) return true;

return false;
}

export const sortRooms = (rooms: Room[]): Room[] => {
// We cache the timestamp lookup to avoid iterating forever on the timeline
Expand Down