Excluded non-today birthdays from reminder in top bar from dialogs.

This commit is contained in:
23rd 2025-04-18 12:39:52 +03:00 committed by John Preston
parent 868c7b170e
commit d1898b9a0b
3 changed files with 30 additions and 8 deletions

View file

@ -85,6 +85,7 @@ namespace Data {
namespace {
using ViewElement = HistoryView::Element;
using UserIds = std::vector<UserId>;
// s: box 100x100
// m: box 320x320
@ -4985,7 +4986,7 @@ void Session::clearLocalStorage() {
_bigFileCache->clear();
}
rpl::producer<std::vector<UserId>> Session::contactBirthdays(bool force) {
rpl::producer<UserIds> Session::contactBirthdays(bool force) {
if ((_contactBirthdaysLastDayRequest != -1)
&& (_contactBirthdaysLastDayRequest == QDate::currentDate().day())
&& !force) {
@ -5002,7 +5003,8 @@ rpl::producer<std::vector<UserId>> Session::contactBirthdays(bool force) {
).done([=](const MTPcontacts_ContactBirthdays &result) {
_contactBirthdaysRequestId = 0;
_contactBirthdaysLastDayRequest = QDate::currentDate().day();
auto users = std::vector<UserId>();
auto users = UserIds();
auto today = UserIds();
Session::processUsers(result.data().vusers());
for (const auto &tlContact : result.data().vcontacts().v) {
const auto peerId = tlContact.data().vcontact_id().v;
@ -5012,15 +5014,20 @@ rpl::producer<std::vector<UserId>> Session::contactBirthdays(bool force) {
data.vday().v,
data.vmonth().v,
data.vyear().value_or_empty()));
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();
@ -5028,7 +5035,7 @@ rpl::producer<std::vector<UserId>> Session::contactBirthdays(bool force) {
};
}
std::optional<std::vector<UserId>> Session::knownContactBirthdays() const {
std::optional<UserIds> Session::knownContactBirthdays() const {
if ((_contactBirthdaysLastDayRequest == -1)
|| (_contactBirthdaysLastDayRequest != QDate::currentDate().day())) {
return std::nullopt;
@ -5036,4 +5043,12 @@ std::optional<std::vector<UserId>> Session::knownContactBirthdays() const {
return _contactBirthdays;
}
std::optional<UserIds> Session::knownBirthdaysToday() const {
if ((_contactBirthdaysLastDayRequest == -1)
|| (_contactBirthdaysLastDayRequest != QDate::currentDate().day())) {
return std::nullopt;
}
return _contactBirthdaysToday;
}
} // namespace Data

View file

@ -835,8 +835,10 @@ public:
[[nodiscard]] rpl::producer<std::vector<UserId>> contactBirthdays(
bool force = false);
[[nodiscard]] std::optional<std::vector<UserId>> knownContactBirthdays(
) const;
[[nodiscard]] auto knownContactBirthdays() const
-> std::optional<std::vector<UserId>>;
[[nodiscard]] auto knownBirthdaysToday() const
-> std::optional<std::vector<UserId>>;
void clearLocalStorage();
@ -1156,6 +1158,7 @@ private:
mtpRequestId _contactBirthdaysRequestId = 0;
int _contactBirthdaysLastDayRequest = -1;
std::vector<UserId> _contactBirthdays;
std::vector<UserId> _contactBirthdaysToday;
Groups _groups;
const std::unique_ptr<ChatFilters> _chatsFilters;

View file

@ -218,10 +218,14 @@ rpl::producer<Ui::SlideWrap<Ui::RpWidget>*> TopBarSuggestionValue(
return;
} else if (session->premiumCanBuy()
&& config->suggestionCurrent(kSugBirthdayContacts.utf8())) {
&& config->suggestionCurrent(kSugBirthdayContacts.utf8())
&& (!session->data().knownBirthdaysToday()
|| !session->data().knownBirthdaysToday()->size())) {
session->data().contactBirthdays(
) | rpl::start_with_next(crl::guard(content, [=](
std::vector<UserId> users) {
) | rpl::start_with_next(crl::guard(content, [=] {
const auto users = session->data()
.knownBirthdaysToday().value_or(
std::vector<UserId>());
if (users.empty()) {
repeat(repeat);
return;