From 1642f3cf40154e6183b7eae031a40d89c7eba948 Mon Sep 17 00:00:00 2001 From: Konstantinos Sideris Date: Sun, 22 Apr 2018 14:19:05 +0300 Subject: [PATCH] Update invites in the UI after sync --- include/Cache.h | 1 + include/RoomInfoListItem.h | 2 ++ include/RoomList.h | 1 + src/Cache.cc | 19 +++++++++++++++++++ src/ChatPage.cc | 8 +++++++- src/RoomList.cc | 14 ++++++++++++++ 6 files changed, 44 insertions(+), 1 deletion(-) 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 joinedRooms(); QMap roomInfo(bool withInvites = true); + std::map 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 room_ids); void updateRoom(const QString &room_id, const RoomInfo &info); + void cleanupInvites(const std::map &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 +Cache::invites() +{ + std::map 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 client, this, [this](const std::vector &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 @@ -180,6 +180,20 @@ RoomList::initialize(const QMap &info) emit roomChanged(room.first); } +void +RoomList::cleanupInvites(const std::map &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 &info)