Fix boundary math calculations

pull/21833/head
Travis Ralston 2019-02-13 19:35:01 -07:00
parent c0b63f986f
commit b08ab6cd12
1 changed files with 15 additions and 14 deletions

View File

@ -43,6 +43,7 @@ class RoomListStore extends Store {
super(dis); super(dis);
this._init(); this._init();
this.__onDispatch = this.__onDispatch.bind(this);
this._getManualComparator = this._getManualComparator.bind(this); this._getManualComparator = this._getManualComparator.bind(this);
this._recentsComparator = this._recentsComparator.bind(this); this._recentsComparator = this._recentsComparator.bind(this);
} }
@ -80,7 +81,7 @@ class RoomListStore extends Store {
this.__emitChange(); this.__emitChange();
} }
__onDispatch = (payload) => { __onDispatch(payload) {
const logicallyReady = this._matrixClient && this._state.ready; const logicallyReady = this._matrixClient && this._state.ready;
switch (payload.action) { switch (payload.action) {
// Initialise state after initial sync // Initialise state after initial sync
@ -231,7 +232,7 @@ class RoomListStore extends Store {
const myMembership = room.getMyMembership(); const myMembership = room.getMyMembership();
let doInsert = true; let doInsert = true;
let targetTags = []; const targetTags = [];
if (myMembership !== "join" && myMembership !== "invite") { if (myMembership !== "join" && myMembership !== "invite") {
doInsert = false; doInsert = false;
} else { } else {
@ -253,8 +254,8 @@ class RoomListStore extends Store {
listsClone[key] = []; listsClone[key] = [];
let pushedEntry = false; let pushedEntry = false;
const hasRoom = !!this._state.lists[key].find((e) => e.room.roomId === room.roomId); const hasRoom = !!this._state.lists[key].find((e) => e.room.roomId === room.roomId);
let lastCategoryBoundary = 0; let desiredCategoryBoundaryIndex = 0;
let lastCategoryIndex = 0; let foundBoundary = false;
for (const entry of this._state.lists[key]) { for (const entry of this._state.lists[key]) {
// if the list is a recent list, and the room appears in this list, and we're not looking at a sticky // if the list is a recent list, and the room appears in this list, and we're not looking at a sticky
// room (sticky rooms have unreliable categories), try to slot the new room in // room (sticky rooms have unreliable categories), try to slot the new room in
@ -264,16 +265,21 @@ class RoomListStore extends Store {
const entryTs = this._tsOfNewestEvent(entry.room); const entryTs = this._tsOfNewestEvent(entry.room);
const entryCategory = CATEGORY_ORDER.indexOf(entry.category); const entryCategory = CATEGORY_ORDER.indexOf(entry.category);
if (entryCategory >= targetCatIndex && !foundBoundary) {
desiredCategoryBoundaryIndex = listsClone[key].length - 1;
foundBoundary = true;
}
// If we've hit the top of a boundary (either because there's no rooms in the target or // If we've hit the top of a boundary (either because there's no rooms in the target or
// we've reached the grouping of rooms), insert our room ahead of the others in the category. // we've reached the grouping of rooms), insert our room ahead of the others in the category.
// This ensures that our room is on top (more recent) than the others. // This ensures that our room is on top (more recent) than the others.
const changedBoundary = entryCategory > targetCatIndex; const changedBoundary = entryCategory >= targetCatIndex;
const currentCategory = entryCategory === targetCatIndex; const currentCategory = entryCategory === targetCatIndex;
if (changedBoundary || (currentCategory && targetTs >= entryTs)) { if (changedBoundary || (false && currentCategory && targetTs >= entryTs)) {
if (changedBoundary) { if (changedBoundary && false) {
// If we changed a boundary, then we've gone too far - go to the top of the last // If we changed a boundary, then we've gone too far - go to the top of the last
// section instead. // section instead.
listsClone[key].splice(lastCategoryBoundary, 0, {room, category}); listsClone[key].splice(desiredCategoryBoundaryIndex, 0, {room, category});
} else { } else {
// If we're ordering by timestamp, just insert normally // If we're ordering by timestamp, just insert normally
listsClone[key].push({room, category}); listsClone[key].push({room, category});
@ -281,11 +287,6 @@ class RoomListStore extends Store {
pushedEntry = true; pushedEntry = true;
inserted = true; inserted = true;
} }
if (entryCategory !== lastCategoryIndex) {
lastCategoryBoundary = listsClone[key].length - 1;
}
lastCategoryIndex = entryCategory;
} }
// We insert our own record as needed, so don't let the old one through. // We insert our own record as needed, so don't let the old one through.
@ -386,7 +387,7 @@ class RoomListStore extends Store {
switch (LIST_ORDERS[listKey]) { switch (LIST_ORDERS[listKey]) {
case "recent": case "recent":
comparator = (entryA, entryB) => { comparator = (entryA, entryB) => {
this._recentsComparator(entryA, entryB, (room) => { return this._recentsComparator(entryA, entryB, (room) => {
if (latestEventTsCache[room.roomId]) { if (latestEventTsCache[room.roomId]) {
return latestEventTsCache[room.roomId]; return latestEventTsCache[room.roomId];
} }