diff --git a/include/Cache.h b/include/Cache.h
index 78a35a65..1faf0677 100644
--- a/include/Cache.h
+++ b/include/Cache.h
@@ -137,6 +137,7 @@ public:
std::vector<std::string> joinedRooms();
QMap<QString, RoomInfo> roomInfo(bool withInvites = true);
+ std::map<QString, bool> invites();
//! Calculate & return the name of the room.
QString getRoomName(lmdb::txn &txn, lmdb::dbi &statesdb, lmdb::dbi &membersdb);
diff --git a/include/RoomInfoListItem.h b/include/RoomInfoListItem.h
index d06a759e..cc0acc7e 100644
--- a/include/RoomInfoListItem.h
+++ b/include/RoomInfoListItem.h
@@ -129,6 +129,8 @@ public:
roomType_ = RoomType::Joined;
}
+ bool isInvite() { return roomType_ == RoomType::Invited; }
+
signals:
void clicked(const QString &room_id);
void leaveRoom(const QString &room_id);
diff --git a/include/RoomList.h b/include/RoomList.h
index 53549cb4..a2df0380 100644
--- a/include/RoomList.h
+++ b/include/RoomList.h
@@ -56,6 +56,7 @@ public:
void setFilterRooms(bool filterRooms);
void setRoomFilter(std::vector<QString> room_ids);
void updateRoom(const QString &room_id, const RoomInfo &info);
+ void cleanupInvites(const std::map<QString, bool> &invites);
signals:
void roomChanged(const QString &room_id);
diff --git a/src/Cache.cc b/src/Cache.cc
index 2e210f6b..129b6696 100644
--- a/src/Cache.cc
+++ b/src/Cache.cc
@@ -579,6 +579,25 @@ Cache::roomInfo(bool withInvites)
return result;
}
+std::map<QString, bool>
+Cache::invites()
+{
+ std::map<QString, bool> result;
+
+ auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
+ auto cursor = lmdb::cursor::open(txn, invitesDb_);
+
+ std::string room_id, unused;
+
+ while (cursor.get(room_id, unused, MDB_NEXT))
+ result.emplace(QString::fromStdString(std::move(room_id)), true);
+
+ cursor.close();
+ txn.commit();
+
+ return result;
+}
+
QString
Cache::getRoomAvatarUrl(lmdb::txn &txn,
lmdb::dbi &statesdb,
diff --git a/src/ChatPage.cc b/src/ChatPage.cc
index ae3079a3..110b8131 100644
--- a/src/ChatPage.cc
+++ b/src/ChatPage.cc
@@ -420,6 +420,12 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client,
this,
[this](const std::vector<std::string> &rooms) { view_manager_->initialize(rooms); });
connect(this, &ChatPage::syncUI, this, [this](const mtx::responses::Rooms &rooms) {
+ try {
+ room_list_->cleanupInvites(cache_->invites());
+ } catch (const lmdb::error &e) {
+ qWarning() << "failed to retrieve invites" << e.what();
+ }
+
view_manager_->initialize(rooms);
removeLeftRooms(rooms.leave);
@@ -528,6 +534,7 @@ ChatPage::syncCompleted(const mtx::responses::Sync &response)
auto promise = QtConcurrent::run([this, res = std::move(response)]() {
try {
cache_->saveState(res);
+ emit syncUI(res.rooms);
emit syncRoomlist(cache_->roomUpdates(res));
} catch (const lmdb::error &e) {
std::cout << "save cache error:" << e.what() << '\n';
@@ -535,7 +542,6 @@ ChatPage::syncCompleted(const mtx::responses::Sync &response)
return;
}
- emit syncUI(std::move(res.rooms));
emit continueSync(cache_->nextBatchToken());
});
}
diff --git a/src/RoomList.cc b/src/RoomList.cc
index caa4adae..cfc8fecc 100644
--- a/src/RoomList.cc
+++ b/src/RoomList.cc
@@ -181,6 +181,20 @@ RoomList::initialize(const QMap<QString, RoomInfo> &info)
}
void
+RoomList::cleanupInvites(const std::map<QString, bool> &invites)
+{
+ if (invites.empty())
+ return;
+
+ for (auto it = rooms_.begin(); it != rooms_.end();) {
+ if (it->second->isInvite() && (invites.find(it->first) == invites.end()))
+ it = rooms_.erase(it);
+ else
+ ++it;
+ }
+}
+
+void
RoomList::sync(const std::map<QString, RoomInfo> &info)
{
|