From ba25771c08755c8478eace29d3123bdfc7af1385 Mon Sep 17 00:00:00 2001
From: Nicolas Werner <nicolas.werner@hotmail.de>
Date: Fri, 13 Dec 2019 20:49:27 +0100
Subject: [PATCH] Make invites always stick to the top

This also removes an ugly hack, that was needed before.
---
 src/RoomInfoListItem.cpp | 12 ------------
 src/RoomList.cpp         |  9 ++++++++-
 2 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/src/RoomInfoListItem.cpp b/src/RoomInfoListItem.cpp
index 8bebb0f50..77de8d5a5 100644
--- a/src/RoomInfoListItem.cpp
+++ b/src/RoomInfoListItem.cpp
@@ -107,18 +107,6 @@ RoomInfoListItem::RoomInfoListItem(QString room_id, RoomInfo info, QWidget *pare
   , unreadHighlightedMsgCount_(0)
 {
         init(parent);
-
-        QString emptyEventId;
-
-        // HACK
-        // We use fake message info with an old date to pin
-        // the invite events to the top.
-        //
-        // State events in invited rooms don't contain timestamp info,
-        // so we can't use them for sorting.
-        if (roomType_ == RoomType::Invited)
-                lastMsgInfo_ = {
-                  emptyEventId, "-", "-", "-", QDateTime::currentDateTime().addYears(10)};
 }
 
 void
diff --git a/src/RoomList.cpp b/src/RoomList.cpp
index c5e056214..dfd4eff86 100644
--- a/src/RoomList.cpp
+++ b/src/RoomList.cpp
@@ -15,6 +15,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <limits>
+
 #include <QApplication>
 #include <QBuffer>
 #include <QObject>
@@ -191,6 +193,9 @@ RoomList::sync(const std::map<QString, RoomInfo> &info)
 {
         for (const auto &room : info)
                 updateRoom(room.first, room.second);
+
+        if (!info.empty())
+                sortRoomsByLastMessage();
 }
 
 void
@@ -270,7 +275,9 @@ RoomList::sortRoomsByLastMessage()
                         continue;
 
                 // Not a room message.
-                if (room->lastMessageInfo().userid.isEmpty())
+                if (room->isInvite())
+                        times.emplace(std::numeric_limits<uint64_t>::max(), room);
+                else if (room->lastMessageInfo().userid.isEmpty())
                         times.emplace(0, room);
                 else
                         times.emplace(room->lastMessageInfo().datetime.toMSecsSinceEpoch(), room);
-- 
GitLab