Fix bug where room list would get stuck showing no rooms

If you had an unsent message in a room that was in a sublist with
the 'Show rooms with unread messages first' option enabled, the
room list would show no rooms next time you restarted element and
get stuck that way.

This was because there was a different notification category for
rooms with unsent messages but the algorithm is hard-coded to add
only a fixed set of categories to its list, and it missed 'unsent',
so it NPEed when it encountered a room with an unsent message.

This just adds the category (assuming that we want to show rooms
with unsent messages first). It doesn't make it less hard-coded, or
fix the fact that an exception in the room list code causes everything
to break.

Fixes https://github.com/vector-im/element-web/issues/19373
This commit is contained in:
David Baker 2021-10-13 14:39:09 +01:00
parent 193a060ec9
commit 0332bc99cb

View file

@ -37,6 +37,7 @@ interface ICategoryIndex {
// comments! Check the usage of Category carefully to figure out what needs changing // comments! Check the usage of Category carefully to figure out what needs changing
// if you're going to change this array's order. // if you're going to change this array's order.
const CATEGORY_ORDER = [ const CATEGORY_ORDER = [
NotificationColor.Unsent,
NotificationColor.Red, NotificationColor.Red,
NotificationColor.Grey, NotificationColor.Grey,
NotificationColor.Bold, NotificationColor.Bold,
@ -50,9 +51,10 @@ const CATEGORY_ORDER = [
* interfere with this algorithm, however manual ordering does. * interfere with this algorithm, however manual ordering does.
* *
* The importance of a room is defined by the kind of notifications, if any, are * The importance of a room is defined by the kind of notifications, if any, are
* present on the room. These are classified internally as Red, Grey, Bold, and * present on the room. These are classified internally as Unsent, Red, Grey,
* Idle. Red rooms have mentions, grey have unread messages, bold is a less noisy * Bold, and Idle. 'Unsent' rooms habe unsent messages, Red rooms have mentions,
* version of grey, and idle means all activity has been seen by the user. * grey have unread messages, bold is a less noisy version of grey, and idle
* means all activity has been seen by the user.
* *
* The algorithm works by monitoring all room changes, including new messages in * The algorithm works by monitoring all room changes, including new messages in
* tracked rooms, to determine if it needs a new category or different placement * tracked rooms, to determine if it needs a new category or different placement
@ -74,6 +76,7 @@ export class ImportanceAlgorithm extends OrderingAlgorithm {
// noinspection JSMethodCanBeStatic // noinspection JSMethodCanBeStatic
private categorizeRooms(rooms: Room[]): ICategorizedRoomMap { private categorizeRooms(rooms: Room[]): ICategorizedRoomMap {
const map: ICategorizedRoomMap = { const map: ICategorizedRoomMap = {
[NotificationColor.Unsent]: [],
[NotificationColor.Red]: [], [NotificationColor.Red]: [],
[NotificationColor.Grey]: [], [NotificationColor.Grey]: [],
[NotificationColor.Bold]: [], [NotificationColor.Bold]: [],