diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 0315896bff..0bdd57a30d 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -3870,6 +3870,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_dialogs_suggestions_birthday_contacts_title#one" = "{count} contact have **birthdays** today! 🎂"; "lng_dialogs_suggestions_birthday_contacts_title#other" = "{count} contacts have **birthdays** today! 🎂"; "lng_dialogs_suggestions_birthday_contacts_about" = "Send them a Gift."; +"lng_dialogs_suggestions_birthday_contact_dismiss" = "You can send a Gift later in Settings"; "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 1697dd9eb6..a62402fd8e 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp @@ -52,31 +52,6 @@ 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( @@ -120,39 +95,43 @@ rpl::producer*> TopBarSuggestionValue( const auto wrap = state->wrap; using RightIcon = TopBarSuggestionContent::RightIcon; const auto config = &session->appConfig(); - if (config->suggestionCurrent(kSugBirthdayContacts.utf8())) { - using Users = std::vector>; - RequestBirthdays(session->user(), crl::guard(content, [=]( - Users users) { - const auto dismiss = [=] { - config->dismissSuggestion( - kSugBirthdayContacts.utf8()); + if (session->premiumCanBuy() + && config->suggestionCurrent(kSugBirthdayContacts.utf8())) { + session->data().contactBirthdays( + ) | rpl::start_with_next(crl::guard(content, [=]( + std::vector users) { + if (users.empty()) { repeat(repeat); - }; - if (!session->premiumCanBuy() || users.empty()) { - dismiss(); return; } const auto controller = FindSessionController(parent); - if (!controller || users.empty()) { - dismiss(); + if (!controller) { + repeat(repeat); return; } const auto isSingle = users.size() == 1; + const auto first = session->data().user(users.front()); content->setRightIcon(RightIcon::Close); content->setClickedCallback([=] { if (isSingle) { - Ui::ShowStarGiftBox(controller, users.front()); + Ui::ShowStarGiftBox(controller, first); } else { Ui::ChooseStarGiftRecipient(controller); } }); - content->setHideCallback(dismiss); + content->setHideCallback([=] { + config->dismissSuggestion( + kSugBirthdayContacts.utf8()); + controller->showToast( + tr::lng_dialogs_suggestions_birthday_contact_dismiss( + tr::now)); + repeat(repeat); + }); auto title = isSingle ? tr::lng_dialogs_suggestions_birthday_contact_title( tr::now, lt_text, - { users.front()->name() }, + { first->name() }, Ui::Text::RichLangValue) : tr::lng_dialogs_suggestions_birthday_contacts_title( tr::now, @@ -188,8 +167,10 @@ rpl::producer*> TopBarSuggestionValue( widget->show(); widget->raise(); }, widget->lifetime()); - for (const auto &user : users) { - s->inRow.push_back({ .peer = user }); + for (const auto &id : users) { + if (const auto user = session->data().user(id)) { + s->inRow.push_back({ .peer = user }); + } } widget->paintRequest() | rpl::start_with_next([=] { auto p = QPainter(widget); @@ -229,7 +210,7 @@ rpl::producer*> TopBarSuggestionValue( = state->giftsLifetime.template make_state( base::make_unique_q( content, - users.front(), + first, st::uploadUserpicButton)); const auto fake = ptr->get(); fake->setAttribute(Qt::WA_TransparentForMouseEvents); @@ -245,7 +226,7 @@ rpl::producer*> TopBarSuggestionValue( } wrap->toggle(true, anim::type::normal); - })); + }), state->giftsLifetime); return; } else if (config->suggestionCurrent(kSugSetBirthday.utf8()) && !Data::IsBirthdayToday(session->user()->birthday())) { diff --git a/Telegram/SourceFiles/main/main_app_config.cpp b/Telegram/SourceFiles/main/main_app_config.cpp index 594bad12da..0e74bc4261 100644 --- a/Telegram/SourceFiles/main/main_app_config.cpp +++ b/Telegram/SourceFiles/main/main_app_config.cpp @@ -10,6 +10,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "base/call_delayed.h" #include "main/main_account.h" +#include "main/main_session.h" +#include "data/data_session.h" #include "ui/chat/chat_style.h" namespace Main { @@ -136,6 +138,15 @@ void AppConfig::refresh(bool force) { } updateIgnoredRestrictionReasons(std::move(was)); + { + const auto dismissedSuggestions = get>( + u"dismissed_suggestions"_q, + std::vector()); + for (const auto &suggestion : dismissedSuggestions) { + _dismissedSuggestions.emplace(suggestion); + } + } + DEBUG_LOG(("getAppConfig result handled.")); _refreshed.fire({}); }, [](const MTPDhelp_appConfigNotModified &) {}); @@ -289,6 +300,18 @@ std::vector AppConfig::getIntArray( } bool AppConfig::suggestionCurrent(const QString &key) const { + if (key == u"BIRTHDAY_CONTACTS_TODAY"_q) { + if (_dismissedSuggestions.contains(key)) { + return false; + } else { + const auto known + = _account->session().data().knownContactBirthdays(); + if (!known) { + return true; + } + return !known->empty(); + } + } return !_dismissedSuggestions.contains(key) && ranges::contains( get>(