From f83568c6c98002740e9e14fddcb8900cace356c7 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sun, 6 Apr 2025 23:41:44 +0300 Subject: [PATCH] Added birthday reminder of single contact to top bar in dialogs. --- Telegram/Resources/langs/lang.strings | 2 + .../dialogs/dialogs_top_bar_suggestion.cpp | 84 ++++++++++++++++++- 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 0871186847..e1fdf3dcbf 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -3865,6 +3865,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_dialogs_suggestions_birthday_title" = "Add your birthday! 🎂"; "lng_dialogs_suggestions_birthday_about" = "Let your contacts know when you’re celebrating."; +"lng_dialogs_suggestions_birthday_contact_title" = "It’s {text}'s **birthday** today! 🎂"; +"lng_dialogs_suggestions_birthday_contact_about" = "Send them a Gift."; "lng_dialogs_suggestions_premium_annual_title" = "Telegram Premium with a {text} discount"; "lng_dialogs_suggestions_premium_annual_about" = "Sign up for the annual payment plan for Telegram Premium now to get the discount."; "lng_dialogs_suggestions_premium_upgrade_title" = "Telegram Premium with a {text} discount"; diff --git a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp index 4f899240c8..1b489ffd07 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp @@ -11,10 +11,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_premium.h" #include "apiwrap.h" #include "base/call_delayed.h" +#include "boxes/star_gift_box.h" // ShowStarGiftBox. #include "core/application.h" #include "core/click_handler_types.h" #include "data/data_birthday.h" #include "data/data_changes.h" +#include "data/data_session.h" #include "data/data_user.h" #include "dialogs/ui/dialogs_top_bar_suggestion_content.h" #include "info/profile/info_profile_values.h" @@ -41,11 +43,37 @@ namespace { } constexpr auto kSugSetBirthday = "BIRTHDAY_SETUP"_cs; +constexpr auto kSugBirthdayContacts = "BIRTHDAY_CONTACTS_TODAY"_cs; constexpr auto kSugPremiumAnnual = "PREMIUM_ANNUAL"_cs; constexpr auto kSugPremiumUpgrade = "PREMIUM_UPGRADE"_cs; constexpr auto kSugPremiumRestore = "PREMIUM_RESTORE"_cs; constexpr auto kSugSetUserpic = "USERPIC_SETUP"_cs; +void RequestBirthdays( + not_null peer, + Fn>)> done) { + peer->session().api().request( + MTPcontacts_GetBirthdays() + ).done([=](const MTPcontacts_ContactBirthdays &result) { + auto users = std::vector>(); + peer->owner().processUsers(result.data().vusers()); + for (const auto &tlContact : result.data().vcontacts().v) { + const auto peerId = tlContact.data().vcontact_id().v; + if (const auto user = peer->owner().user(peerId)) { + const auto &data = tlContact.data().vbirthday().data(); + user->setBirthday(Data::Birthday( + data.vday().v, + data.vmonth().v, + data.vyear().value_or_empty())); + users.push_back(user); + } + } + done(std::move(users)); + }).fail([=](const MTP::Error &error) { + done({}); + }).send(); +} + } // namespace rpl::producer*> TopBarSuggestionValue( @@ -87,7 +115,61 @@ rpl::producer*> TopBarSuggestionValue( const auto wrap = state->wrap; using RightIcon = TopBarSuggestionContent::RightIcon; const auto config = &session->appConfig(); - if (config->suggestionCurrent(kSugSetBirthday.utf8()) + if (config->suggestionCurrent(kSugBirthdayContacts.utf8())) { + using Users = std::vector>; + RequestBirthdays(session->user(), crl::guard(content, [=]( + Users users) { + const auto dismiss = [=] { + config->dismissSuggestion( + kSugBirthdayContacts.utf8()); + repeat(repeat); + }; + if (!session->premiumCanBuy() || users.empty()) { + dismiss(); + return; + } + const auto controller = FindSessionController(parent); + if (!controller) { + dismiss(); + return; + } + if (users.size() != 1) { + return; + } + content->setRightIcon(RightIcon::Close); + content->setClickedCallback([=] { + Ui::ShowStarGiftBox(controller, users.front()); + }); + content->setHideCallback(dismiss); + content->setContent( + tr::lng_dialogs_suggestions_birthday_contact_title( + tr::now, + lt_text, + { users.front()->name() }, + Ui::Text::RichLangValue), + tr::lng_dialogs_suggestions_birthday_contact_about( + tr::now, + TextWithEntities::Simple)); + const auto upload = Ui::CreateChild( + content, + users.front(), + st::uploadUserpicButton); + upload->setAttribute(Qt::WA_TransparentForMouseEvents); + const auto leftPadding = st::defaultDialogRow.padding.left(); + content->sizeValue() | rpl::filter_size( + ) | rpl::start_with_next([=](const QSize &s) { + upload->raise(); + upload->show(); + upload->moveToLeft( + leftPadding, + (s.height() - upload->height()) / 2); + }, content->lifetime()); + content->setLeftPadding(upload->width() + leftPadding); + + wrap->toggle(true, anim::type::normal); + })); + return; + } else if (config->suggestionCurrent(kSugSetBirthday.utf8()) && !Data::IsBirthdayToday(session->user()->birthday())) { content->setRightIcon(RightIcon::Close); content->setClickedCallback([=] {