From ba31bbace801eb15a8cc38340f2ce0f0d7789071 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 15 May 2025 09:21:29 +0300 Subject: [PATCH] Added refresh of top bar suggestion on day changed for birthdays. --- Telegram/SourceFiles/boxes/star_gift_box.cpp | 7 +- .../data/components/promo_suggestions.cpp | 88 +++++++++---------- .../data/components/promo_suggestions.h | 3 +- .../dialogs/dialogs_top_bar_suggestion.cpp | 5 +- 4 files changed, 49 insertions(+), 54 deletions(-) diff --git a/Telegram/SourceFiles/boxes/star_gift_box.cpp b/Telegram/SourceFiles/boxes/star_gift_box.cpp index 9a011b76c3..094fc133e1 100644 --- a/Telegram/SourceFiles/boxes/star_gift_box.cpp +++ b/Telegram/SourceFiles/boxes/star_gift_box.cpp @@ -3629,10 +3629,7 @@ void Controller::rowClicked(not_null row) { void ChooseStarGiftRecipient( not_null window) { const auto session = &window->session(); - const auto lifetime = std::make_shared(); - session->promoSuggestions().contactBirthdays( - ) | rpl::start_with_next(crl::guard(session, [=] { - lifetime->destroy(); + session->promoSuggestions().requestContactBirthdays([=] { auto controller = std::make_unique( session, [=](not_null peer, PickType type) { @@ -3657,7 +3654,7 @@ void ChooseStarGiftRecipient( window->show( Box(std::move(controller), std::move(initBox)), LayerOption::KeepOther); - }), *lifetime); + }); } void ShowStarGiftBox( diff --git a/Telegram/SourceFiles/data/components/promo_suggestions.cpp b/Telegram/SourceFiles/data/components/promo_suggestions.cpp index 493e97ab82..fd6613815c 100644 --- a/Telegram/SourceFiles/data/components/promo_suggestions.cpp +++ b/Telegram/SourceFiles/data/components/promo_suggestions.cpp @@ -134,9 +134,15 @@ void PromoSuggestions::refreshTopPromotion() { changedCustom = true; } + const auto changedContactBirthdaysLastDayRequest = + _contactBirthdaysLastDayRequest != -1 + && _contactBirthdaysLastDayRequest + != QDate::currentDate().day(); + if (changedPendingSuggestions || changedDismissedSuggestions - || changedCustom) { + || changedCustom + || changedContactBirthdaysLastDayRequest) { _refreshed.fire({}); } }); @@ -234,58 +240,52 @@ std::optional PromoSuggestions::custom() const { return _custom; } -rpl::producer PromoSuggestions::contactBirthdays(bool force) { +void PromoSuggestions::requestContactBirthdays(Fn done, bool force) { if ((_contactBirthdaysLastDayRequest != -1) && (_contactBirthdaysLastDayRequest == QDate::currentDate().day()) && !force) { - return rpl::single(_contactBirthdays); + return done(); } if (_contactBirthdaysRequestId) { _session->api().request(_contactBirthdaysRequestId).cancel(); } - return [=](auto consumer) { - auto lifetime = rpl::lifetime(); - - _contactBirthdaysRequestId = _session->api().request( - MTPcontacts_GetBirthdays() - ).done([=](const MTPcontacts_ContactBirthdays &result) { - _contactBirthdaysRequestId = 0; - _contactBirthdaysLastDayRequest = QDate::currentDate().day(); - auto users = UserIds(); - auto today = UserIds(); - _session->data().processUsers(result.data().vusers()); - for (const auto &tlContact : result.data().vcontacts().v) { - const auto peerId = tlContact.data().vcontact_id().v; - if (const auto user = _session->data().user(peerId)) { - const auto &data = tlContact.data().vbirthday().data(); - user->setBirthday(Data::Birthday( - data.vday().v, - data.vmonth().v, - data.vyear().value_or_empty())); - if (user->isSelf() - || user->isInaccessible() - || user->isBlocked()) { - continue; - } - if (Data::IsBirthdayToday(user->birthday())) { - today.push_back(peerToUser(user->id)); - } - users.push_back(peerToUser(user->id)); + _contactBirthdaysRequestId = _session->api().request( + MTPcontacts_GetBirthdays() + ).done([=](const MTPcontacts_ContactBirthdays &result) { + _contactBirthdaysRequestId = 0; + _contactBirthdaysLastDayRequest = QDate::currentDate().day(); + auto users = UserIds(); + auto today = UserIds(); + _session->data().processUsers(result.data().vusers()); + for (const auto &tlContact : result.data().vcontacts().v) { + const auto peerId = tlContact.data().vcontact_id().v; + if (const auto user = _session->data().user(peerId)) { + const auto &data = tlContact.data().vbirthday().data(); + user->setBirthday(Data::Birthday( + data.vday().v, + data.vmonth().v, + data.vyear().value_or_empty())); + if (user->isSelf() + || user->isInaccessible() + || user->isBlocked()) { + continue; } + if (Data::IsBirthdayToday(user->birthday())) { + today.push_back(peerToUser(user->id)); + } + users.push_back(peerToUser(user->id)); } - _contactBirthdays = std::move(users); - _contactBirthdaysToday = std::move(today); - consumer.put_next_copy(_contactBirthdays); - }).fail([=](const MTP::Error &error) { - _contactBirthdaysRequestId = 0; - _contactBirthdaysLastDayRequest = QDate::currentDate().day(); - _contactBirthdays = {}; - _contactBirthdaysToday = {}; - consumer.put_next({}); - }).send(); - - return lifetime; - }; + } + _contactBirthdays = std::move(users); + _contactBirthdaysToday = std::move(today); + done(); + }).fail([=](const MTP::Error &error) { + _contactBirthdaysRequestId = 0; + _contactBirthdaysLastDayRequest = QDate::currentDate().day(); + _contactBirthdays = {}; + _contactBirthdaysToday = {}; + done(); + }).send(); } std::optional PromoSuggestions::knownContactBirthdays() const { diff --git a/Telegram/SourceFiles/data/components/promo_suggestions.h b/Telegram/SourceFiles/data/components/promo_suggestions.h index cbc352ef1e..33f943a958 100644 --- a/Telegram/SourceFiles/data/components/promo_suggestions.h +++ b/Telegram/SourceFiles/data/components/promo_suggestions.h @@ -45,8 +45,7 @@ public: rpl::producer<> value() const; // Create rpl::producer<> refreshed() const; on memand. - [[nodiscard]] rpl::producer> contactBirthdays( - bool force = false); + void requestContactBirthdays(Fn done, bool force = false); [[nodiscard]] auto knownContactBirthdays() const -> std::optional>; [[nodiscard]] auto knownBirthdaysToday() const diff --git a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp index 0c6655dde7..50e41bdee0 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp @@ -240,8 +240,7 @@ rpl::producer*> TopBarSuggestionValue( return; } else if (session->premiumCanBuy() && promo->current(kSugBirthdayContacts.utf8())) { - promo->contactBirthdays( - ) | rpl::start_with_next(crl::guard(content, [=] { + promo->requestContactBirthdays(crl::guard(content, [=] { const auto users = promo->knownBirthdaysToday().value_or( std::vector()); if (users.empty()) { @@ -369,7 +368,7 @@ rpl::producer*> TopBarSuggestionValue( state->desiredWrapToggle.force_assign( Toggle{ true, anim::type::normal }); - }), state->giftsLifetime); + })); return; } else if (promo->current(kSugSetBirthday.utf8()) && !Data::IsBirthdayToday(session->user()->birthday())) {