Added refresh of top bar suggestion on day changed for birthdays.

This commit is contained in:
23rd 2025-05-15 09:21:29 +03:00
parent 606dfd29d3
commit ba31bbace8
4 changed files with 49 additions and 54 deletions

View file

@ -3629,10 +3629,7 @@ void Controller::rowClicked(not_null<PeerListRow*> row) {
void ChooseStarGiftRecipient( void ChooseStarGiftRecipient(
not_null<Window::SessionController*> window) { not_null<Window::SessionController*> window) {
const auto session = &window->session(); const auto session = &window->session();
const auto lifetime = std::make_shared<rpl::lifetime>(); session->promoSuggestions().requestContactBirthdays([=] {
session->promoSuggestions().contactBirthdays(
) | rpl::start_with_next(crl::guard(session, [=] {
lifetime->destroy();
auto controller = std::make_unique<Controller>( auto controller = std::make_unique<Controller>(
session, session,
[=](not_null<PeerData*> peer, PickType type) { [=](not_null<PeerData*> peer, PickType type) {
@ -3657,7 +3654,7 @@ void ChooseStarGiftRecipient(
window->show( window->show(
Box<PeerListBox>(std::move(controller), std::move(initBox)), Box<PeerListBox>(std::move(controller), std::move(initBox)),
LayerOption::KeepOther); LayerOption::KeepOther);
}), *lifetime); });
} }
void ShowStarGiftBox( void ShowStarGiftBox(

View file

@ -134,9 +134,15 @@ void PromoSuggestions::refreshTopPromotion() {
changedCustom = true; changedCustom = true;
} }
const auto changedContactBirthdaysLastDayRequest =
_contactBirthdaysLastDayRequest != -1
&& _contactBirthdaysLastDayRequest
!= QDate::currentDate().day();
if (changedPendingSuggestions if (changedPendingSuggestions
|| changedDismissedSuggestions || changedDismissedSuggestions
|| changedCustom) { || changedCustom
|| changedContactBirthdaysLastDayRequest) {
_refreshed.fire({}); _refreshed.fire({});
} }
}); });
@ -234,58 +240,52 @@ std::optional<CustomSuggestion> PromoSuggestions::custom() const {
return _custom; return _custom;
} }
rpl::producer<UserIds> PromoSuggestions::contactBirthdays(bool force) { void PromoSuggestions::requestContactBirthdays(Fn<void()> done, bool force) {
if ((_contactBirthdaysLastDayRequest != -1) if ((_contactBirthdaysLastDayRequest != -1)
&& (_contactBirthdaysLastDayRequest == QDate::currentDate().day()) && (_contactBirthdaysLastDayRequest == QDate::currentDate().day())
&& !force) { && !force) {
return rpl::single(_contactBirthdays); return done();
} }
if (_contactBirthdaysRequestId) { if (_contactBirthdaysRequestId) {
_session->api().request(_contactBirthdaysRequestId).cancel(); _session->api().request(_contactBirthdaysRequestId).cancel();
} }
return [=](auto consumer) { _contactBirthdaysRequestId = _session->api().request(
auto lifetime = rpl::lifetime(); MTPcontacts_GetBirthdays()
).done([=](const MTPcontacts_ContactBirthdays &result) {
_contactBirthdaysRequestId = _session->api().request( _contactBirthdaysRequestId = 0;
MTPcontacts_GetBirthdays() _contactBirthdaysLastDayRequest = QDate::currentDate().day();
).done([=](const MTPcontacts_ContactBirthdays &result) { auto users = UserIds();
_contactBirthdaysRequestId = 0; auto today = UserIds();
_contactBirthdaysLastDayRequest = QDate::currentDate().day(); _session->data().processUsers(result.data().vusers());
auto users = UserIds(); for (const auto &tlContact : result.data().vcontacts().v) {
auto today = UserIds(); const auto peerId = tlContact.data().vcontact_id().v;
_session->data().processUsers(result.data().vusers()); if (const auto user = _session->data().user(peerId)) {
for (const auto &tlContact : result.data().vcontacts().v) { const auto &data = tlContact.data().vbirthday().data();
const auto peerId = tlContact.data().vcontact_id().v; user->setBirthday(Data::Birthday(
if (const auto user = _session->data().user(peerId)) { data.vday().v,
const auto &data = tlContact.data().vbirthday().data(); data.vmonth().v,
user->setBirthday(Data::Birthday( data.vyear().value_or_empty()));
data.vday().v, if (user->isSelf()
data.vmonth().v, || user->isInaccessible()
data.vyear().value_or_empty())); || user->isBlocked()) {
if (user->isSelf() continue;
|| user->isInaccessible()
|| user->isBlocked()) {
continue;
}
if (Data::IsBirthdayToday(user->birthday())) {
today.push_back(peerToUser(user->id));
}
users.push_back(peerToUser(user->id));
} }
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); _contactBirthdays = std::move(users);
consumer.put_next_copy(_contactBirthdays); _contactBirthdaysToday = std::move(today);
}).fail([=](const MTP::Error &error) { done();
_contactBirthdaysRequestId = 0; }).fail([=](const MTP::Error &error) {
_contactBirthdaysLastDayRequest = QDate::currentDate().day(); _contactBirthdaysRequestId = 0;
_contactBirthdays = {}; _contactBirthdaysLastDayRequest = QDate::currentDate().day();
_contactBirthdaysToday = {}; _contactBirthdays = {};
consumer.put_next({}); _contactBirthdaysToday = {};
}).send(); done();
}).send();
return lifetime;
};
} }
std::optional<UserIds> PromoSuggestions::knownContactBirthdays() const { std::optional<UserIds> PromoSuggestions::knownContactBirthdays() const {

View file

@ -45,8 +45,7 @@ public:
rpl::producer<> value() const; rpl::producer<> value() const;
// Create rpl::producer<> refreshed() const; on memand. // Create rpl::producer<> refreshed() const; on memand.
[[nodiscard]] rpl::producer<std::vector<UserId>> contactBirthdays( void requestContactBirthdays(Fn<void()> done, bool force = false);
bool force = false);
[[nodiscard]] auto knownContactBirthdays() const [[nodiscard]] auto knownContactBirthdays() const
-> std::optional<std::vector<UserId>>; -> std::optional<std::vector<UserId>>;
[[nodiscard]] auto knownBirthdaysToday() const [[nodiscard]] auto knownBirthdaysToday() const

View file

@ -240,8 +240,7 @@ rpl::producer<Ui::SlideWrap<Ui::RpWidget>*> TopBarSuggestionValue(
return; return;
} else if (session->premiumCanBuy() } else if (session->premiumCanBuy()
&& promo->current(kSugBirthdayContacts.utf8())) { && promo->current(kSugBirthdayContacts.utf8())) {
promo->contactBirthdays( promo->requestContactBirthdays(crl::guard(content, [=] {
) | rpl::start_with_next(crl::guard(content, [=] {
const auto users = promo->knownBirthdaysToday().value_or( const auto users = promo->knownBirthdaysToday().value_or(
std::vector<UserId>()); std::vector<UserId>());
if (users.empty()) { if (users.empty()) {
@ -369,7 +368,7 @@ rpl::producer<Ui::SlideWrap<Ui::RpWidget>*> TopBarSuggestionValue(
state->desiredWrapToggle.force_assign( state->desiredWrapToggle.force_assign(
Toggle{ true, anim::type::normal }); Toggle{ true, anim::type::normal });
}), state->giftsLifetime); }));
return; return;
} else if (promo->current(kSugSetBirthday.utf8()) } else if (promo->current(kSugSetBirthday.utf8())
&& !Data::IsBirthdayToday(session->user()->birthday())) { && !Data::IsBirthdayToday(session->user()->birthday())) {