From 9262b773cbed4206dd71f191c2134a50e2d4ae51 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 5 Feb 2021 18:36:37 +0400 Subject: [PATCH] Fix invite link updates handling. --- Telegram/SourceFiles/api/api_invite_links.cpp | 17 +++++++++-------- Telegram/SourceFiles/api/api_invite_links.h | 13 ++++++++++--- .../boxes/peers/edit_peer_invite_link.cpp | 3 ++- .../boxes/peers/edit_peer_invite_links.cpp | 7 +++++-- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Telegram/SourceFiles/api/api_invite_links.cpp b/Telegram/SourceFiles/api/api_invite_links.cpp index 84719efb7..a4d007f2a 100644 --- a/Telegram/SourceFiles/api/api_invite_links.cpp +++ b/Telegram/SourceFiles/api/api_invite_links.cpp @@ -362,7 +362,7 @@ void InviteLinks::destroyAllRevoked( callback(); } } - _allRevokedDestroyed.fire_copy(peer); + _allRevokedDestroyed.fire({ peer, admin }); }).fail([=](const RPCError &error) { }).send(); } @@ -452,19 +452,20 @@ rpl::producer InviteLinks::joinedFirstSliceValue( } auto InviteLinks::updates( - not_null peer) const -> rpl::producer { + not_null peer, + not_null admin) const -> rpl::producer { return _updates.events() | rpl::filter([=](const Update &update) { - return update.peer == peer; + return update.peer == peer && update.admin == admin; }); } rpl::producer<> InviteLinks::allRevokedDestroyed( - not_null peer) const { - using namespace rpl::mappers; + not_null peer, + not_null admin) const { return _allRevokedDestroyed.events( - ) | rpl::filter( - _1 == peer - ) | rpl::to_empty; + ) | rpl::filter([=](const AllRevokedDestroyed &which) { + return which.peer == peer && which.admin == admin; + }) | rpl::to_empty; } void InviteLinks::requestJoinedFirstSlice(LinkKey key) { diff --git a/Telegram/SourceFiles/api/api_invite_links.h b/Telegram/SourceFiles/api/api_invite_links.h index 024f7510c..df29731e4 100644 --- a/Telegram/SourceFiles/api/api_invite_links.h +++ b/Telegram/SourceFiles/api/api_invite_links.h @@ -105,9 +105,11 @@ public: not_null peer, const QString &link) const; [[nodiscard]] rpl::producer updates( - not_null peer) const; + not_null peer, + not_null admin) const; [[nodiscard]] rpl::producer<> allRevokedDestroyed( - not_null peer) const; + not_null peer, + not_null admin) const; void requestMoreLinks( not_null peer, @@ -189,7 +191,12 @@ private: std::vector>> _deleteRevokedCallbacks; rpl::event_stream _updates; - rpl::event_stream> _allRevokedDestroyed; + + struct AllRevokedDestroyed { + not_null peer; + not_null admin; + }; + rpl::event_stream _allRevokedDestroyed; }; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp index fe6fc00af..035eaaf7b 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp @@ -583,7 +583,8 @@ void ShowInviteLinkBox( ? tr::lng_manage_peer_link_permanent() : tr::lng_manage_peer_link_invite()); peer->session().api().inviteLinks().updates( - peer + peer, + link.admin ) | rpl::start_with_next([=](const Api::InviteLinkUpdate &update) { if (update.was == link.link && (!update.now || (!link.revoked && update.now->revoked))) { diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp index a1c2ab3f2..8dec6db45 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp @@ -466,7 +466,8 @@ LinksController::LinksController( }, _lifetime); peer->session().api().inviteLinks().updates( - peer + peer, + admin ) | rpl::start_with_next([=](const Api::InviteLinkUpdate &update) { const auto now = base::unixtime::now(); if (!update.now || update.now->revoked != _revoked) { @@ -485,7 +486,8 @@ LinksController::LinksController( if (_revoked) { peer->session().api().inviteLinks().allRevokedDestroyed( - peer + peer, + admin ) | rpl::start_with_next([=] { _requesting = false; _allLoaded = true; @@ -621,6 +623,7 @@ void LinksController::updateRow(const InviteLinkData &data, TimeId now) { delegate()->peerListUpdateRow(row); } else if (_revoked) { prependRow(data, now); + delegate()->peerListRefreshRows(); } }