summary refs log tree commit diff
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2018-04-22 14:19:05 +0300
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2018-04-22 14:19:05 +0300
commit1642f3cf40154e6183b7eae031a40d89c7eba948 (patch)
treea45add2aa5bb43625ced920c37c4573209ae5a05
parentProperly clean stale invites (diff)
downloadnheko-1642f3cf40154e6183b7eae031a40d89c7eba948.tar.xz
Update invites in the UI after sync
-rw-r--r--include/Cache.h1
-rw-r--r--include/RoomInfoListItem.h2
-rw-r--r--include/RoomList.h1
-rw-r--r--src/Cache.cc19
-rw-r--r--src/ChatPage.cc8
-rw-r--r--src/RoomList.cc14
6 files changed, 44 insertions, 1 deletions
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) {