diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index e1d5b87849..59e2c66f18 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -816,6 +816,7 @@ PRIVATE dialogs/suggestions/suggestion_gift_auctions.cpp dialogs/suggestions/suggestion_low_credits_subs.cpp dialogs/suggestions/suggestion_premium_grace.cpp + dialogs/suggestions/suggestion_premium_offer.cpp dialogs/suggestions/suggestion_unreviewed_auth.cpp dialogs/dialogs_widget.cpp dialogs/dialogs_widget.h diff --git a/Telegram/SourceFiles/dialogs/suggestions/suggestion.cpp b/Telegram/SourceFiles/dialogs/suggestions/suggestion.cpp index 0d0d3751ce..4294020daf 100644 --- a/Telegram/SourceFiles/dialogs/suggestions/suggestion.cpp +++ b/Telegram/SourceFiles/dialogs/suggestions/suggestion.cpp @@ -17,6 +17,7 @@ std::vector AllSpecs() { result.push_back(MakeGiftAuctionsSpec()); result.push_back(MakeLowCreditsSubsSpec()); result.push_back(MakePremiumGraceSpec()); + result.push_back(MakePremiumOfferSpec()); result.push_back(MakeUnreviewedAuthSpec()); return result; } diff --git a/Telegram/SourceFiles/dialogs/suggestions/suggestion.h b/Telegram/SourceFiles/dialogs/suggestions/suggestion.h index f99de9ad62..8c3fe20563 100644 --- a/Telegram/SourceFiles/dialogs/suggestions/suggestion.h +++ b/Telegram/SourceFiles/dialogs/suggestions/suggestion.h @@ -66,6 +66,7 @@ struct Spec { [[nodiscard]] Spec MakeGiftAuctionsSpec(); [[nodiscard]] Spec MakeLowCreditsSubsSpec(); [[nodiscard]] Spec MakePremiumGraceSpec(); +[[nodiscard]] Spec MakePremiumOfferSpec(); [[nodiscard]] Spec MakeUnreviewedAuthSpec(); } // namespace TopBarSuggestions diff --git a/Telegram/SourceFiles/dialogs/suggestions/suggestion_premium_offer.cpp b/Telegram/SourceFiles/dialogs/suggestions/suggestion_premium_offer.cpp new file mode 100644 index 0000000000..2adef5b5c7 --- /dev/null +++ b/Telegram/SourceFiles/dialogs/suggestions/suggestion_premium_offer.cpp @@ -0,0 +1,113 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "dialogs/suggestions/suggestion.h" + +#include "api/api_premium.h" +#include "apiwrap.h" +#include "data/components/promo_suggestions.h" +#include "dialogs/ui/dialogs_top_bar_suggestion_content.h" +#include "lang/lang_keys.h" +#include "main/main_session.h" +#include "settings/sections/settings_premium.h" +#include "ui/text/text_utilities.h" +#include "window/window_session_controller.h" + +namespace Dialogs::TopBarSuggestions { +namespace { + +constexpr auto kSugPremiumAnnual = "PREMIUM_ANNUAL"_cs; +constexpr auto kSugPremiumUpgrade = "PREMIUM_UPGRADE"_cs; +constexpr auto kSugPremiumRestore = "PREMIUM_RESTORE"_cs; + +[[nodiscard]] QString CurrentPremiumKey( + not_null promo) { + if (promo->current(kSugPremiumAnnual.utf8())) { + return kSugPremiumAnnual.utf8(); + } else if (promo->current(kSugPremiumRestore.utf8())) { + return kSugPremiumRestore.utf8(); + } else if (promo->current(kSugPremiumUpgrade.utf8())) { + return kSugPremiumUpgrade.utf8(); + } + return QString(); +} + +bool Available(const Context &context) { + const auto session = context.session.get(); + if (!session->premiumPossible() || session->premium()) { + return false; + } + return !CurrentPremiumKey(&session->promoSuggestions()).isEmpty(); +} + +void Activate(ActivateArgs args) { + const auto session = args.context.session.get(); + const auto promo = &session->promoSuggestions(); + const auto content = args.context.ensureContent(); + const auto findController = args.context.findController; + const auto recompute = args.recompute; + const auto done = args.done; + const auto key = CurrentPremiumKey(promo); + const auto isPremiumAnnual = (key == kSugPremiumAnnual.utf8()); + const auto isPremiumRestore = (key == kSugPremiumRestore.utf8()); + const auto premiumSub = args.lifetime->make_state(); + using RightIcon = TopBarSuggestionContent::RightIcon; + content->setRightIcon(RightIcon::Arrow); + content->setLeadingWidget(nullptr); + + const auto set = [=](QString discount) { + constexpr auto kMinus = QChar(0x2212); + const auto &title = isPremiumAnnual + ? tr::lng_dialogs_suggestions_premium_annual_title + : isPremiumRestore + ? tr::lng_dialogs_suggestions_premium_restore_title + : tr::lng_dialogs_suggestions_premium_upgrade_title; + const auto &description = isPremiumAnnual + ? tr::lng_dialogs_suggestions_premium_annual_about + : isPremiumRestore + ? tr::lng_dialogs_suggestions_premium_restore_about + : tr::lng_dialogs_suggestions_premium_upgrade_about; + content->setContent( + title( + tr::now, + lt_text, + { discount.replace(kMinus, QChar()) }, + tr::bold), + description(tr::now, TextWithEntities::Simple)); + content->setClickedCallback([=] { + const auto controller = findController(); + Settings::ShowPremium(controller, "dialogs_hint"); + promo->dismiss(key); + recompute(); + }); + done(content, [content] { content->prepareCollapseSnapshot(); }); + }; + + const auto api = &session->api().premium(); + api->statusTextValue() | rpl::on_next([=] { + for (const auto &o : api->subscriptionOptions()) { + if (o.months == 12) { + set(o.discount); + premiumSub->destroy(); + return; + } + } + }, *premiumSub); + api->reload(); +} + +} // namespace + +Spec MakePremiumOfferSpec() { + return { + .priority = Priority::PremiumOffer, + .available = Available, + .activate = Activate, + }; +} + +} // namespace Dialogs::TopBarSuggestions