diff --git a/Telegram/SourceFiles/boxes/background_preview_box.cpp b/Telegram/SourceFiles/boxes/background_preview_box.cpp index 048362638..d445ce1f5 100644 --- a/Telegram/SourceFiles/boxes/background_preview_box.cpp +++ b/Telegram/SourceFiles/boxes/background_preview_box.cpp @@ -776,7 +776,7 @@ void BackgroundPreviewBox::applyForPeer() { } else { ShowPremiumPreviewBox( _controller->uiShow(), - PremiumPreview::Wallpapers); + PremiumFeature::Wallpapers); } }); const auto cancel = CreateChild( diff --git a/Telegram/SourceFiles/boxes/edit_caption_box.cpp b/Telegram/SourceFiles/boxes/edit_caption_box.cpp index 0c4b212c5..5ffdfb6f3 100644 --- a/Telegram/SourceFiles/boxes/edit_caption_box.cpp +++ b/Telegram/SourceFiles/boxes/edit_caption_box.cpp @@ -682,7 +682,7 @@ void EditCaptionBox::setupEmojiPanel() { && !_controller->session().premium()) { ShowPremiumPreviewBox( _controller, - PremiumPreview::AnimatedEmoji); + PremiumFeature::AnimatedEmoji); } else { Data::InsertCustomEmoji(_field.get(), data.document); } diff --git a/Telegram/SourceFiles/boxes/gift_premium_box.cpp b/Telegram/SourceFiles/boxes/gift_premium_box.cpp index f544b5647..41f9cc097 100644 --- a/Telegram/SourceFiles/boxes/gift_premium_box.cpp +++ b/Telegram/SourceFiles/boxes/gift_premium_box.cpp @@ -587,7 +587,7 @@ void GiftsBox( const auto content = box->addRow( object_ptr(box), {}); - auto buttonCallback = [=](PremiumPreview section) { + auto buttonCallback = [=](PremiumFeature section) { stars->setPaused(true); const auto previewBoxShown = [=]( not_null previewBox) { diff --git a/Telegram/SourceFiles/boxes/language_box.cpp b/Telegram/SourceFiles/boxes/language_box.cpp index aa69a6fee..98c49900a 100644 --- a/Telegram/SourceFiles/boxes/language_box.cpp +++ b/Telegram/SourceFiles/boxes/language_box.cpp @@ -1216,7 +1216,7 @@ void LanguageBox::setupTop(not_null container) { if (checked && !premium) { ShowPremiumPreviewToBuy( _controller, - PremiumPreview::RealTimeTranslation); + PremiumFeature::RealTimeTranslation); _translateChatTurnOff.fire(false); } return premium diff --git a/Telegram/SourceFiles/boxes/premium_preview_box.cpp b/Telegram/SourceFiles/boxes/premium_preview_box.cpp index c3ce95189..76df0c2d7 100644 --- a/Telegram/SourceFiles/boxes/premium_preview_box.cpp +++ b/Telegram/SourceFiles/boxes/premium_preview_box.cpp @@ -60,7 +60,7 @@ constexpr auto kStarPeriod = 3 * crl::time(1000); using Data::ReactionId; struct Descriptor { - PremiumPreview section = PremiumPreview::Stickers; + PremiumFeature section = PremiumFeature::Stickers; DocumentData *requestedSticker = nullptr; bool fromSettings = false; Fn hiddenCallback; @@ -91,92 +91,118 @@ void PreloadSticker(const std::shared_ptr &media) { media->videoThumbnailWanted(origin); } -[[nodiscard]] rpl::producer SectionTitle(PremiumPreview section) { +[[nodiscard]] rpl::producer SectionTitle(PremiumFeature section) { switch (section) { - case PremiumPreview::Wallpapers: + case PremiumFeature::Wallpapers: return tr::lng_premium_summary_subtitle_wallpapers(); - case PremiumPreview::Stories: + case PremiumFeature::Stories: return tr::lng_premium_summary_subtitle_stories(); - case PremiumPreview::DoubleLimits: + case PremiumFeature::DoubleLimits: return tr::lng_premium_summary_subtitle_double_limits(); - case PremiumPreview::MoreUpload: + case PremiumFeature::MoreUpload: return tr::lng_premium_summary_subtitle_more_upload(); - case PremiumPreview::FasterDownload: + case PremiumFeature::FasterDownload: return tr::lng_premium_summary_subtitle_faster_download(); - case PremiumPreview::VoiceToText: + case PremiumFeature::VoiceToText: return tr::lng_premium_summary_subtitle_voice_to_text(); - case PremiumPreview::NoAds: + case PremiumFeature::NoAds: return tr::lng_premium_summary_subtitle_no_ads(); - case PremiumPreview::EmojiStatus: + case PremiumFeature::EmojiStatus: return tr::lng_premium_summary_subtitle_emoji_status(); - case PremiumPreview::InfiniteReactions: + case PremiumFeature::InfiniteReactions: return tr::lng_premium_summary_subtitle_infinite_reactions(); - case PremiumPreview::TagsForMessages: + case PremiumFeature::TagsForMessages: return tr::lng_premium_summary_subtitle_tags_for_messages(); - case PremiumPreview::LastSeen: + case PremiumFeature::LastSeen: return tr::lng_premium_summary_subtitle_last_seen(); - case PremiumPreview::MessagePrivacy: + case PremiumFeature::MessagePrivacy: return tr::lng_premium_summary_subtitle_message_privacy(); - case PremiumPreview::Stickers: + case PremiumFeature::Stickers: return tr::lng_premium_summary_subtitle_premium_stickers(); - case PremiumPreview::AnimatedEmoji: + case PremiumFeature::AnimatedEmoji: return tr::lng_premium_summary_subtitle_animated_emoji(); - case PremiumPreview::AdvancedChatManagement: + case PremiumFeature::AdvancedChatManagement: return tr::lng_premium_summary_subtitle_advanced_chat_management(); - case PremiumPreview::ProfileBadge: + case PremiumFeature::ProfileBadge: return tr::lng_premium_summary_subtitle_profile_badge(); - case PremiumPreview::AnimatedUserpics: + case PremiumFeature::AnimatedUserpics: return tr::lng_premium_summary_subtitle_animated_userpics(); - case PremiumPreview::RealTimeTranslation: + case PremiumFeature::RealTimeTranslation: return tr::lng_premium_summary_subtitle_translation(); - case PremiumPreview::Business: + case PremiumFeature::Business: return tr::lng_premium_summary_subtitle_business(); + + case PremiumFeature::BusinessLocation: + return tr::lng_business_subtitle_location(); + case PremiumFeature::BusinessHours: + return tr::lng_business_subtitle_opening_hours(); + case PremiumFeature::QuickReplies: + return tr::lng_business_subtitle_quick_replies(); + case PremiumFeature::GreetingMessage: + return tr::lng_business_subtitle_greeting_messages(); + case PremiumFeature::AwayMessage: + return tr::lng_business_subtitle_away_messages(); + case PremiumFeature::BusinessBots: + return tr::lng_business_subtitle_chatbots(); } - Unexpected("PremiumPreview in SectionTitle."); + Unexpected("PremiumFeature in SectionTitle."); } -[[nodiscard]] rpl::producer SectionAbout(PremiumPreview section) { +[[nodiscard]] rpl::producer SectionAbout(PremiumFeature section) { switch (section) { - case PremiumPreview::Wallpapers: + case PremiumFeature::Wallpapers: return tr::lng_premium_summary_about_wallpapers(); - case PremiumPreview::Stories: + case PremiumFeature::Stories: return tr::lng_premium_summary_about_stories(); - case PremiumPreview::DoubleLimits: + case PremiumFeature::DoubleLimits: return tr::lng_premium_summary_about_double_limits(); - case PremiumPreview::MoreUpload: + case PremiumFeature::MoreUpload: return tr::lng_premium_summary_about_more_upload(); - case PremiumPreview::FasterDownload: + case PremiumFeature::FasterDownload: return tr::lng_premium_summary_about_faster_download(); - case PremiumPreview::VoiceToText: + case PremiumFeature::VoiceToText: return tr::lng_premium_summary_about_voice_to_text(); - case PremiumPreview::NoAds: + case PremiumFeature::NoAds: return tr::lng_premium_summary_about_no_ads(); - case PremiumPreview::EmojiStatus: + case PremiumFeature::EmojiStatus: return tr::lng_premium_summary_about_emoji_status(); - case PremiumPreview::InfiniteReactions: + case PremiumFeature::InfiniteReactions: return tr::lng_premium_summary_about_infinite_reactions(); - case PremiumPreview::TagsForMessages: + case PremiumFeature::TagsForMessages: return tr::lng_premium_summary_about_tags_for_messages(); - case PremiumPreview::LastSeen: + case PremiumFeature::LastSeen: return tr::lng_premium_summary_about_last_seen(); - case PremiumPreview::MessagePrivacy: + case PremiumFeature::MessagePrivacy: return tr::lng_premium_summary_about_message_privacy(); - case PremiumPreview::Stickers: + case PremiumFeature::Stickers: return tr::lng_premium_summary_about_premium_stickers(); - case PremiumPreview::AnimatedEmoji: + case PremiumFeature::AnimatedEmoji: return tr::lng_premium_summary_about_animated_emoji(); - case PremiumPreview::AdvancedChatManagement: + case PremiumFeature::AdvancedChatManagement: return tr::lng_premium_summary_about_advanced_chat_management(); - case PremiumPreview::ProfileBadge: + case PremiumFeature::ProfileBadge: return tr::lng_premium_summary_about_profile_badge(); - case PremiumPreview::AnimatedUserpics: + case PremiumFeature::AnimatedUserpics: return tr::lng_premium_summary_about_animated_userpics(); - case PremiumPreview::RealTimeTranslation: + case PremiumFeature::RealTimeTranslation: return tr::lng_premium_summary_about_translation(); - case PremiumPreview::Business: + case PremiumFeature::Business: return tr::lng_premium_summary_about_business(); + + case PremiumFeature::BusinessLocation: + return tr::lng_business_about_location(); + case PremiumFeature::BusinessHours: + return tr::lng_business_about_opening_hours(); + case PremiumFeature::QuickReplies: + return tr::lng_business_about_quick_replies(); + case PremiumFeature::GreetingMessage: + return tr::lng_business_about_greeting_messages(); + case PremiumFeature::AwayMessage: + return tr::lng_business_about_away_messages(); + case PremiumFeature::BusinessBots: + return tr::lng_business_about_chatbots(); } - Unexpected("PremiumPreview in SectionTitle."); + Unexpected("PremiumFeature in SectionTitle."); } [[nodiscard]] object_ptr ChatBackPreview( @@ -468,33 +494,40 @@ struct VideoPreviewDocument { RectPart align = RectPart::Bottom; }; -[[nodiscard]] bool VideoAlignToTop(PremiumPreview section) { - return (section == PremiumPreview::MoreUpload) - || (section == PremiumPreview::NoAds) - || (section == PremiumPreview::AnimatedEmoji); +[[nodiscard]] bool VideoAlignToTop(PremiumFeature section) { + return (section == PremiumFeature::MoreUpload) + || (section == PremiumFeature::NoAds) + || (section == PremiumFeature::AnimatedEmoji); } [[nodiscard]] DocumentData *LookupVideo( not_null session, - PremiumPreview section) { + PremiumFeature section) { const auto name = [&] { switch (section) { - case PremiumPreview::MoreUpload: return "more_upload"; - case PremiumPreview::FasterDownload: return "faster_download"; - case PremiumPreview::VoiceToText: return "voice_to_text"; - case PremiumPreview::NoAds: return "no_ads"; - case PremiumPreview::AnimatedEmoji: return "animated_emoji"; - case PremiumPreview::AdvancedChatManagement: + case PremiumFeature::MoreUpload: return "more_upload"; + case PremiumFeature::FasterDownload: return "faster_download"; + case PremiumFeature::VoiceToText: return "voice_to_text"; + case PremiumFeature::NoAds: return "no_ads"; + case PremiumFeature::AnimatedEmoji: return "animated_emoji"; + case PremiumFeature::AdvancedChatManagement: return "advanced_chat_management"; - case PremiumPreview::EmojiStatus: return "emoji_status"; - case PremiumPreview::InfiniteReactions: return "infinite_reactions"; - case PremiumPreview::TagsForMessages: return "saved_tags"; - case PremiumPreview::ProfileBadge: return "profile_badge"; - case PremiumPreview::AnimatedUserpics: return "animated_userpics"; - case PremiumPreview::RealTimeTranslation: return "translations"; - case PremiumPreview::Wallpapers: return "wallpapers"; - case PremiumPreview::LastSeen: return "last_seen"; - case PremiumPreview::MessagePrivacy: return "message_privacy"; + case PremiumFeature::EmojiStatus: return "emoji_status"; + case PremiumFeature::InfiniteReactions: return "infinite_reactions"; + case PremiumFeature::TagsForMessages: return "saved_tags"; + case PremiumFeature::ProfileBadge: return "profile_badge"; + case PremiumFeature::AnimatedUserpics: return "animated_userpics"; + case PremiumFeature::RealTimeTranslation: return "translations"; + case PremiumFeature::Wallpapers: return "wallpapers"; + case PremiumFeature::LastSeen: return "last_seen"; + case PremiumFeature::MessagePrivacy: return "message_privacy"; + + case PremiumFeature::BusinessLocation: return "business_location"; + case PremiumFeature::BusinessHours: return "business_hours"; + case PremiumFeature::QuickReplies: return "quick_replies"; + case PremiumFeature::GreetingMessage: return "greeting_message"; + case PremiumFeature::AwayMessage: return "away_message"; + case PremiumFeature::BusinessBots: return "business_bots"; } return ""; }(); @@ -721,7 +754,7 @@ struct VideoPreviewDocument { [[nodiscard]] not_null GenericPreview( not_null parent, std::shared_ptr show, - PremiumPreview section, + PremiumFeature section, Fn readyCallback) { const auto result = Ui::CreateChild(parent.get()); result->show(); @@ -762,10 +795,10 @@ struct VideoPreviewDocument { [[nodiscard]] not_null GenerateDefaultPreview( not_null parent, std::shared_ptr show, - PremiumPreview section, + PremiumFeature section, Fn readyCallback) { switch (section) { - case PremiumPreview::Stickers: + case PremiumFeature::Stickers: return StickersPreview(parent, std::move(show), readyCallback); default: return GenericPreview( @@ -789,8 +822,8 @@ struct VideoPreviewDocument { [[nodiscard]] object_ptr CreateSwitch( not_null parent, - not_null*> selected, - std::vector order) { + not_null*> selected, + std::vector order) { const auto padding = st::premiumDotPadding; const auto width = padding.left() + st::premiumDot + padding.right(); const auto height = padding.top() + st::premiumDot + padding.bottom(); @@ -861,14 +894,20 @@ void PreviewBox( Ui::Animations::Simple animation; Fn preload; std::vector hiding; - rpl::variable selected; - std::vector order; + rpl::variable selected; + std::vector order; }; const auto state = outer->lifetime().make_state(); state->selected = descriptor.section; - state->order = Settings::PremiumPreviewOrder(&show->session()); + auto premiumOrder = Settings::PremiumFeaturesOrder(&show->session()); + auto businessOrder = Settings::BusinessFeaturesOrder(&show->session()); + state->order = ranges::contains(businessOrder, descriptor.section) + ? std::move(businessOrder) + : ranges::contains(businessOrder, descriptor.section) + ? std::move(premiumOrder) + : std::vector{ descriptor.section }; - const auto index = [=](PremiumPreview section) { + const auto index = [=](PremiumFeature section) { const auto it = ranges::find(state->order, section); return (it == end(state->order)) ? 0 @@ -911,7 +950,7 @@ void PreviewBox( return; } const auto now = state->selected.current(); - if (now != PremiumPreview::Stickers && !state->stickersPreload) { + if (now != PremiumFeature::Stickers && !state->stickersPreload) { const auto ready = [=] { if (state->stickersPreload) { state->stickersPreloadReady = true; @@ -922,14 +961,14 @@ void PreviewBox( state->stickersPreload = GenerateDefaultPreview( outer, show, - PremiumPreview::Stickers, + PremiumFeature::Stickers, ready); state->stickersPreload->hide(); } }; switch (descriptor.section) { - case PremiumPreview::Stickers: + case PremiumFeature::Stickers: state->content = media ? StickerPreview(outer, show, media, state->preload) : StickersPreview(outer, show, state->preload); @@ -945,7 +984,7 @@ void PreviewBox( state->selected.value( ) | rpl::combine_previous( - ) | rpl::start_with_next([=](PremiumPreview was, PremiumPreview now) { + ) | rpl::start_with_next([=](PremiumFeature was, PremiumFeature now) { const auto animationCallback = [=] { if (!state->animation.animating()) { for (const auto &hiding : base::take(state->hiding)) { @@ -987,7 +1026,7 @@ void PreviewBox( .leftTill = state->content->x() - start, }); state->leftFrom = start; - if (now == PremiumPreview::Stickers && state->stickersPreload) { + if (now == PremiumFeature::Stickers && state->stickersPreload) { state->content = base::take(state->stickersPreload); state->content->show(); if (base::take(state->stickersPreloadReady)) { @@ -1058,14 +1097,14 @@ void PreviewBox( return Settings::LookupPremiumRef(state->selected.current()); }; auto unlock = state->selected.value( - ) | rpl::map([=](PremiumPreview section) { - return (section == PremiumPreview::InfiniteReactions) + ) | rpl::map([=](PremiumFeature section) { + return (section == PremiumFeature::InfiniteReactions) ? tr::lng_premium_unlock_reactions() - : (section == PremiumPreview::Stickers) + : (section == PremiumFeature::Stickers) ? tr::lng_premium_unlock_stickers() - : (section == PremiumPreview::AnimatedEmoji) + : (section == PremiumFeature::AnimatedEmoji) ? tr::lng_premium_unlock_emoji() - : (section == PremiumPreview::EmojiStatus) + : (section == PremiumFeature::EmojiStatus) ? tr::lng_premium_unlock_status() : tr::lng_premium_more_about(); }) | rpl::flatten_latest(); @@ -1212,19 +1251,19 @@ void Show( descriptor.shownCallback(raw); } return; - } else if (descriptor.section == PremiumPreview::DoubleLimits) { + } else if (descriptor.section == PremiumFeature::DoubleLimits) { show->showBox(Box([=](not_null box) { DoubledLimitsPreviewBox(box, &show->session()); DecorateListPromoBox(box, show, descriptor); })); return; - } else if (descriptor.section == PremiumPreview::Stories) { + } else if (descriptor.section == PremiumFeature::Stories) { show->showBox(Box([=](not_null box) { UpgradedStoriesPreviewBox(box, &show->session()); DecorateListPromoBox(box, show, descriptor); })); return; - } else if (descriptor.section == PremiumPreview::Business) { + } else if (descriptor.section == PremiumFeature::Business) { const auto window = show->resolveWindow( ChatHelpers::WindowUsage::PremiumPromo); if (window) { @@ -1298,21 +1337,21 @@ void ShowStickerPreviewBox( std::shared_ptr show, not_null document) { Show(std::move(show), Descriptor{ - .section = PremiumPreview::Stickers, + .section = PremiumFeature::Stickers, .requestedSticker = document, }); } void ShowPremiumPreviewBox( not_null controller, - PremiumPreview section, + PremiumFeature section, Fn)> shown) { ShowPremiumPreviewBox(controller->uiShow(), section, std::move(shown)); } void ShowPremiumPreviewBox( std::shared_ptr show, - PremiumPreview section, + PremiumFeature section, Fn)> shown, bool hideSubscriptionButton) { Show(std::move(show), Descriptor{ @@ -1324,7 +1363,7 @@ void ShowPremiumPreviewBox( void ShowPremiumPreviewToBuy( not_null controller, - PremiumPreview section, + PremiumFeature section, Fn hiddenCallback) { Show(controller->uiShow(), Descriptor{ .section = section, diff --git a/Telegram/SourceFiles/boxes/premium_preview_box.h b/Telegram/SourceFiles/boxes/premium_preview_box.h index 9fc4da279..80400a6ee 100644 --- a/Telegram/SourceFiles/boxes/premium_preview_box.h +++ b/Telegram/SourceFiles/boxes/premium_preview_box.h @@ -45,7 +45,8 @@ void UpgradedStoriesPreviewBox( not_null box, not_null session); -enum class PremiumPreview { +enum class PremiumFeature { + // Premium features. Stories, DoubleLimits, MoreUpload, @@ -66,23 +67,31 @@ enum class PremiumPreview { MessagePrivacy, Business, + // Business features. + BusinessLocation, + BusinessHours, + QuickReplies, + GreetingMessage, + AwayMessage, + BusinessBots, + kCount, }; void ShowPremiumPreviewBox( not_null controller, - PremiumPreview section, + PremiumFeature section, Fn)> shown = nullptr); void ShowPremiumPreviewBox( std::shared_ptr show, - PremiumPreview section, + PremiumFeature section, Fn)> shown = nullptr, bool hideSubscriptionButton = false); void ShowPremiumPreviewToBuy( not_null controller, - PremiumPreview section, + PremiumFeature section, Fn hiddenCallback = nullptr); void PremiumUnavailableBox(not_null box); diff --git a/Telegram/SourceFiles/boxes/send_files_box.cpp b/Telegram/SourceFiles/boxes/send_files_box.cpp index 455630fb1..ea208d42f 100644 --- a/Telegram/SourceFiles/boxes/send_files_box.cpp +++ b/Telegram/SourceFiles/boxes/send_files_box.cpp @@ -1135,7 +1135,7 @@ void SendFilesBox::setupEmojiPanel() { _captionToPeer, data.document) : (_limits & SendFilesAllow::EmojiWithoutPremium))) { - ShowPremiumPreviewBox(_show, PremiumPreview::AnimatedEmoji); + ShowPremiumPreviewBox(_show, PremiumFeature::AnimatedEmoji); } else { Data::InsertCustomEmoji(_caption.data(), data.document); } diff --git a/Telegram/SourceFiles/core/local_url_handlers.cpp b/Telegram/SourceFiles/core/local_url_handlers.cpp index 82c115774..92ed6c9e8 100644 --- a/Telegram/SourceFiles/core/local_url_handlers.cpp +++ b/Telegram/SourceFiles/core/local_url_handlers.cpp @@ -665,7 +665,7 @@ bool ShowSearchTagsPromo( if (!controller) { return false; } - ShowPremiumPreviewBox(controller, PremiumPreview::TagsForMessages); + ShowPremiumPreviewBox(controller, PremiumFeature::TagsForMessages); return true; } diff --git a/Telegram/SourceFiles/dialogs/dialogs_search_tags.cpp b/Telegram/SourceFiles/dialogs/dialogs_search_tags.cpp index a3d1264ff..276d4e5b6 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_search_tags.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_search_tags.cpp @@ -47,7 +47,7 @@ namespace { if (const auto controller = my.sessionWindow.get()) { ShowPremiumPreviewBox( controller, - PremiumPreview::TagsForMessages); + PremiumFeature::TagsForMessages); } }); } diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 0943e3ac1..a2188d7d5 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -160,7 +160,7 @@ void FillSponsoredMessagesMenu( menu->addSeparator(&st::expandedMenuSeparator); } menu->addAction(tr::lng_sponsored_hide_ads(tr::now), [=] { - ShowPremiumPreviewBox(controller, PremiumPreview::NoAds); + ShowPremiumPreviewBox(controller, PremiumFeature::NoAds); }, &st::menuIconCancel); } diff --git a/Telegram/SourceFiles/history/history_item_helpers.cpp b/Telegram/SourceFiles/history/history_item_helpers.cpp index 65153bf86..e6c9b1e5a 100644 --- a/Telegram/SourceFiles/history/history_item_helpers.cpp +++ b/Telegram/SourceFiles/history/history_item_helpers.cpp @@ -362,7 +362,7 @@ ClickHandlerPtr HideSponsoredClickHandler() { return std::make_shared([=](ClickContext context) { const auto my = context.other.value(); if (const auto controller = my.sessionWindow.get()) { - ShowPremiumPreviewBox(controller, PremiumPreview::NoAds); + ShowPremiumPreviewBox(controller, PremiumFeature::NoAds); } }); } @@ -793,7 +793,7 @@ void ShowTrialTranscribesToast(int left, TimeId until) { } const auto filter = [=](const auto &...) { if (const auto controller = window->sessionController()) { - ShowPremiumPreviewBox(controller, PremiumPreview::VoiceToText); + ShowPremiumPreviewBox(controller, PremiumFeature::VoiceToText); window->activate(); } return false; diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index f08ed8414..0c88e71e6 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -3031,7 +3031,7 @@ void Message::refreshReactions() { = ExtractController(context)) { ShowPremiumPreviewBox( controller, - PremiumPreview::TagsForMessages); + PremiumFeature::TagsForMessages); } return; } diff --git a/Telegram/SourceFiles/history/view/history_view_sticker_toast.cpp b/Telegram/SourceFiles/history/view/history_view_sticker_toast.cpp index f10d8e328..fc4f41b73 100644 --- a/Telegram/SourceFiles/history/view/history_view_sticker_toast.cpp +++ b/Telegram/SourceFiles/history/view/history_view_sticker_toast.cpp @@ -238,7 +238,7 @@ void StickerToast::showWithTitle(const QString &title) { && (i->second->flags & Data::StickersSetFlag::Installed)) { ShowPremiumPreviewBox( _controller, - PremiumPreview::AnimatedEmoji); + PremiumFeature::AnimatedEmoji); } else { _controller->show(Box( _controller->uiShow(), diff --git a/Telegram/SourceFiles/history/view/history_view_transcribe_button.cpp b/Telegram/SourceFiles/history/view/history_view_transcribe_button.cpp index dccca0f3a..1688b8f6c 100644 --- a/Telegram/SourceFiles/history/view/history_view_transcribe_button.cpp +++ b/Telegram/SourceFiles/history/view/history_view_transcribe_button.cpp @@ -272,7 +272,7 @@ ClickHandlerPtr TranscribeButton::link() { if (const auto controller = my.sessionWindow.get()) { ShowPremiumPreviewBox( controller, - PremiumPreview::VoiceToText); + PremiumFeature::VoiceToText); } } else { const auto max = session->api().transcribes().trialsMaxLengthMs(); diff --git a/Telegram/SourceFiles/info/profile/info_profile_emoji_status_panel.cpp b/Telegram/SourceFiles/info/profile/info_profile_emoji_status_panel.cpp index 8881dbc99..c7f26b4ef 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_emoji_status_panel.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_emoji_status_panel.cpp @@ -281,7 +281,7 @@ bool EmojiStatusPanel::filter( if (_chooseFilter) { return _chooseFilter(chosenId); } else if (chosenId && !controller->session().premium()) { - ShowPremiumPreviewBox(controller, PremiumPreview::EmojiStatus); + ShowPremiumPreviewBox(controller, PremiumFeature::EmojiStatus); return false; } return true; diff --git a/Telegram/SourceFiles/media/stories/media_stories_stealth.cpp b/Telegram/SourceFiles/media/stories/media_stories_stealth.cpp index 404ff1aea..80d4f20a7 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_stealth.cpp +++ b/Telegram/SourceFiles/media/stories/media_stories_stealth.cpp @@ -352,7 +352,7 @@ struct Feature { data->requested = false; const auto usage = ChatHelpers::WindowUsage::PremiumPromo; if (const auto window = show->resolveWindow(usage)) { - ShowPremiumPreviewBox(window, PremiumPreview::Stories); + ShowPremiumPreviewBox(window, PremiumFeature::Stories); window->window().activate(); } } else if (now.mode.cooldownTill > now.now) { diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 3bbc98fb9..4c8a0cf70 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -1254,7 +1254,7 @@ void OverlayWidget::showPremiumDownloadPromo() { const auto filter = [=](const auto &...) { const auto usage = ChatHelpers::WindowUsage::PremiumPromo; if (const auto window = uiShow()->resolveWindow(usage)) { - ShowPremiumPreviewBox(window, PremiumPreview::Stories); + ShowPremiumPreviewBox(window, PremiumFeature::Stories); window->window().activate(); } return false; diff --git a/Telegram/SourceFiles/settings/settings_business.cpp b/Telegram/SourceFiles/settings/settings_business.cpp index c94c63464..c0848e341 100644 --- a/Telegram/SourceFiles/settings/settings_business.cpp +++ b/Telegram/SourceFiles/settings/settings_business.cpp @@ -53,7 +53,7 @@ struct Entry { const style::icon *icon; rpl::producer title; rpl::producer description; - BusinessFeature feature = BusinessFeature::Location; + PremiumFeature feature = PremiumFeature::BusinessLocation; }; using Order = std::vector; @@ -77,7 +77,7 @@ using Order = std::vector; &st::settingsBusinessIconLocation, tr::lng_business_subtitle_location(), tr::lng_business_about_location(), - BusinessFeature::Location, + PremiumFeature::BusinessLocation, }, }, { @@ -86,7 +86,7 @@ using Order = std::vector; &st::settingsBusinessIconHours, tr::lng_business_subtitle_opening_hours(), tr::lng_business_about_opening_hours(), - BusinessFeature::OpeningHours, + PremiumFeature::BusinessHours, }, }, { @@ -95,7 +95,7 @@ using Order = std::vector; &st::settingsBusinessIconReplies, tr::lng_business_subtitle_quick_replies(), tr::lng_business_about_quick_replies(), - BusinessFeature::QuickReplies, + PremiumFeature::QuickReplies, }, }, { @@ -104,7 +104,7 @@ using Order = std::vector; &st::settingsBusinessIconGreeting, tr::lng_business_subtitle_greeting_messages(), tr::lng_business_about_greeting_messages(), - BusinessFeature::GreetingMessages, + PremiumFeature::GreetingMessage, }, }, { @@ -113,7 +113,7 @@ using Order = std::vector; &st::settingsBusinessIconAway, tr::lng_business_subtitle_away_messages(), tr::lng_business_about_away_messages(), - BusinessFeature::AwayMessages, + PremiumFeature::AwayMessage, }, }, { @@ -122,7 +122,7 @@ using Order = std::vector; &st::settingsBusinessIconChatbots, tr::lng_business_subtitle_chatbots(), tr::lng_business_about_chatbots(), - BusinessFeature::Chatbots, + PremiumFeature::BusinessBots, }, }, }; @@ -131,7 +131,7 @@ using Order = std::vector; void AddBusinessSummary( not_null content, not_null controller, - Fn buttonCallback) { + Fn buttonCallback) { const auto &stDefault = st::settingsButton; const auto &stLabel = st::defaultFlatLabel; const auto iconSize = st::settingsPremiumIconDouble.size(); @@ -359,15 +359,22 @@ void Business::setupContent() { Ui::AddSkip(content, st::settingsFromFileTop); - AddBusinessSummary(content, _controller, [=](BusinessFeature feature) { + AddBusinessSummary(content, _controller, [=](PremiumFeature feature) { + if (!_controller->session().premium()) { + _setPaused(true); + const auto hidden = crl::guard(this, [=] { _setPaused(false); }); + + ShowPremiumPreviewToBuy(_controller, feature, hidden); + return; + } showOther([&] { switch (feature) { - case BusinessFeature::AwayMessages: return AwayMessageId(); - case BusinessFeature::OpeningHours: return WorkingHoursId(); - case BusinessFeature::Location: return LocationId(); - case BusinessFeature::GreetingMessages: return GreetingId(); - case BusinessFeature::QuickReplies: return QuickRepliesId(); - case BusinessFeature::Chatbots: return ChatbotsId(); + case PremiumFeature::AwayMessage: return AwayMessageId(); + case PremiumFeature::BusinessHours: return WorkingHoursId(); + case PremiumFeature::BusinessLocation: return LocationId(); + case PremiumFeature::GreetingMessage: return GreetingId(); + case PremiumFeature::QuickReplies: return QuickRepliesId(); + case PremiumFeature::BusinessBots: return ChatbotsId(); } Unexpected("Feature in Business::setupContent."); }()); @@ -591,7 +598,7 @@ void ShowBusiness(not_null controller) { controller->showSettings(Settings::BusinessId()); } -std::vector BusinessFeaturesOrder( +std::vector BusinessFeaturesOrder( not_null<::Main::Session*> session) { const auto mtpOrder = session->account().appConfig().get( "business_promo_order", @@ -600,21 +607,21 @@ std::vector BusinessFeaturesOrder( mtpOrder ) | ranges::views::transform([](const QString &s) { if (s == u"greeting_message"_q) { - return BusinessFeature::GreetingMessages; + return PremiumFeature::GreetingMessage; } else if (s == u"away_message"_q) { - return BusinessFeature::AwayMessages; + return PremiumFeature::AwayMessage; } else if (s == u"quick_replies"_q) { - return BusinessFeature::QuickReplies; + return PremiumFeature::QuickReplies; } else if (s == u"business_hours"_q) { - return BusinessFeature::OpeningHours; + return PremiumFeature::BusinessHours; } else if (s == u"business_location"_q) { - return BusinessFeature::Location; + return PremiumFeature::BusinessLocation; } else if (s == u"business_bots"_q) { - return BusinessFeature::Chatbots; + return PremiumFeature::BusinessBots; } - return BusinessFeature::kCount; - }) | ranges::views::filter([](BusinessFeature feature) { - return (feature != BusinessFeature::kCount); + return PremiumFeature::kCount; + }) | ranges::views::filter([](PremiumFeature feature) { + return (feature != PremiumFeature::kCount); }) | ranges::to_vector; } diff --git a/Telegram/SourceFiles/settings/settings_business.h b/Telegram/SourceFiles/settings/settings_business.h index 47bc2bca3..6bd077af0 100644 --- a/Telegram/SourceFiles/settings/settings_business.h +++ b/Telegram/SourceFiles/settings/settings_business.h @@ -9,6 +9,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/settings_type.h" +enum class PremiumFeature; + namespace Main { class Session; } // namespace Main @@ -19,22 +21,11 @@ class SessionController; namespace Settings { -enum class BusinessFeature { - Location, - OpeningHours, - QuickReplies, - GreetingMessages, - AwayMessages, - Chatbots, - - kCount, -}; - [[nodiscard]] Type BusinessId(); void ShowBusiness(not_null controller); -[[nodiscard]] std::vector BusinessFeaturesOrder( +[[nodiscard]] std::vector BusinessFeaturesOrder( not_null<::Main::Session*> session); } // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_premium.cpp b/Telegram/SourceFiles/settings/settings_premium.cpp index 3e3b8abac..2b9d5e35a 100644 --- a/Telegram/SourceFiles/settings/settings_premium.cpp +++ b/Telegram/SourceFiles/settings/settings_premium.cpp @@ -169,7 +169,7 @@ struct Entry { const style::icon *icon; rpl::producer title; rpl::producer description; - PremiumPreview section = PremiumPreview::DoubleLimits; + PremiumFeature section = PremiumFeature::DoubleLimits; bool newBadge = false; }; @@ -209,7 +209,7 @@ using Order = std::vector; &st::settingsPremiumIconTags, tr::lng_premium_summary_subtitle_tags_for_messages(), tr::lng_premium_summary_about_tags_for_messages(), - PremiumPreview::TagsForMessages, + PremiumFeature::TagsForMessages, true, }, }, @@ -219,7 +219,7 @@ using Order = std::vector; &st::settingsPremiumIconLastSeen, tr::lng_premium_summary_subtitle_last_seen(), tr::lng_premium_summary_about_last_seen(), - PremiumPreview::LastSeen, + PremiumFeature::LastSeen, true, }, }, @@ -229,7 +229,7 @@ using Order = std::vector; &st::settingsPremiumIconPrivacy, tr::lng_premium_summary_subtitle_message_privacy(), tr::lng_premium_summary_about_message_privacy(), - PremiumPreview::MessagePrivacy, + PremiumFeature::MessagePrivacy, true, }, }, @@ -239,7 +239,7 @@ using Order = std::vector; &st::settingsPremiumIconWallpapers, tr::lng_premium_summary_subtitle_wallpapers(), tr::lng_premium_summary_about_wallpapers(), - PremiumPreview::Wallpapers, + PremiumFeature::Wallpapers, }, }, { @@ -248,7 +248,7 @@ using Order = std::vector; &st::settingsPremiumIconStories, tr::lng_premium_summary_subtitle_stories(), tr::lng_premium_summary_about_stories(), - PremiumPreview::Stories, + PremiumFeature::Stories, }, }, { @@ -257,7 +257,7 @@ using Order = std::vector; &st::settingsPremiumIconDouble, tr::lng_premium_summary_subtitle_double_limits(), tr::lng_premium_summary_about_double_limits(), - PremiumPreview::DoubleLimits, + PremiumFeature::DoubleLimits, }, }, { @@ -266,7 +266,7 @@ using Order = std::vector; &st::settingsPremiumIconFiles, tr::lng_premium_summary_subtitle_more_upload(), tr::lng_premium_summary_about_more_upload(), - PremiumPreview::MoreUpload, + PremiumFeature::MoreUpload, }, }, { @@ -275,7 +275,7 @@ using Order = std::vector; &st::settingsPremiumIconSpeed, tr::lng_premium_summary_subtitle_faster_download(), tr::lng_premium_summary_about_faster_download(), - PremiumPreview::FasterDownload, + PremiumFeature::FasterDownload, }, }, { @@ -284,7 +284,7 @@ using Order = std::vector; &st::settingsPremiumIconVoice, tr::lng_premium_summary_subtitle_voice_to_text(), tr::lng_premium_summary_about_voice_to_text(), - PremiumPreview::VoiceToText, + PremiumFeature::VoiceToText, }, }, { @@ -293,7 +293,7 @@ using Order = std::vector; &st::settingsPremiumIconChannelsOff, tr::lng_premium_summary_subtitle_no_ads(), tr::lng_premium_summary_about_no_ads(), - PremiumPreview::NoAds, + PremiumFeature::NoAds, }, }, { @@ -302,7 +302,7 @@ using Order = std::vector; &st::settingsPremiumIconStatus, tr::lng_premium_summary_subtitle_emoji_status(), tr::lng_premium_summary_about_emoji_status(), - PremiumPreview::EmojiStatus, + PremiumFeature::EmojiStatus, }, }, { @@ -311,7 +311,7 @@ using Order = std::vector; &st::settingsPremiumIconLike, tr::lng_premium_summary_subtitle_infinite_reactions(), tr::lng_premium_summary_about_infinite_reactions(), - PremiumPreview::InfiniteReactions, + PremiumFeature::InfiniteReactions, }, }, { @@ -320,7 +320,7 @@ using Order = std::vector; &st::settingsIconStickers, tr::lng_premium_summary_subtitle_premium_stickers(), tr::lng_premium_summary_about_premium_stickers(), - PremiumPreview::Stickers, + PremiumFeature::Stickers, }, }, { @@ -329,7 +329,7 @@ using Order = std::vector; &st::settingsIconEmoji, tr::lng_premium_summary_subtitle_animated_emoji(), tr::lng_premium_summary_about_animated_emoji(), - PremiumPreview::AnimatedEmoji, + PremiumFeature::AnimatedEmoji, }, }, { @@ -338,7 +338,7 @@ using Order = std::vector; &st::settingsIconChat, tr::lng_premium_summary_subtitle_advanced_chat_management(), tr::lng_premium_summary_about_advanced_chat_management(), - PremiumPreview::AdvancedChatManagement, + PremiumFeature::AdvancedChatManagement, }, }, { @@ -347,7 +347,7 @@ using Order = std::vector; &st::settingsPremiumIconStar, tr::lng_premium_summary_subtitle_profile_badge(), tr::lng_premium_summary_about_profile_badge(), - PremiumPreview::ProfileBadge, + PremiumFeature::ProfileBadge, }, }, { @@ -356,7 +356,7 @@ using Order = std::vector; &st::settingsPremiumIconPlay, tr::lng_premium_summary_subtitle_animated_userpics(), tr::lng_premium_summary_about_animated_userpics(), - PremiumPreview::AnimatedUserpics, + PremiumFeature::AnimatedUserpics, }, }, { @@ -365,7 +365,7 @@ using Order = std::vector; &st::settingsPremiumIconTranslations, tr::lng_premium_summary_subtitle_translation(), tr::lng_premium_summary_about_translation(), - PremiumPreview::RealTimeTranslation, + PremiumFeature::RealTimeTranslation, }, }, { @@ -374,7 +374,7 @@ using Order = std::vector; &st::settingsPremiumIconPlay, AssertIsDebug() tr::lng_premium_summary_subtitle_business(), tr::lng_premium_summary_about_business(), - PremiumPreview::Business, + PremiumFeature::Business, true, }, }, @@ -971,7 +971,7 @@ void Premium::setupContent() { setupSubscriptionOptions(content); - auto buttonCallback = [=](PremiumPreview section) { + auto buttonCallback = [=](PremiumFeature section) { _setPaused(true); const auto hidden = crl::guard(this, [=] { _setPaused(false); }); @@ -1350,7 +1350,7 @@ void StartPremiumPayment( } } -QString LookupPremiumRef(PremiumPreview section) { +QString LookupPremiumRef(PremiumFeature section) { for (const auto &[ref, entry] : EntryMap()) { if (entry.section == section) { return ref; @@ -1537,7 +1537,7 @@ not_null CreateSubscribeButton( return result; } -std::vector PremiumPreviewOrder( +std::vector PremiumFeaturesOrder( not_null session) { const auto mtpOrder = session->account().appConfig().get( "premium_promo_order", @@ -1546,41 +1546,41 @@ std::vector PremiumPreviewOrder( mtpOrder ) | ranges::views::transform([](const QString &s) { if (s == u"more_upload"_q) { - return PremiumPreview::MoreUpload; + return PremiumFeature::MoreUpload; } else if (s == u"faster_download"_q) { - return PremiumPreview::FasterDownload; + return PremiumFeature::FasterDownload; } else if (s == u"voice_to_text"_q) { - return PremiumPreview::VoiceToText; + return PremiumFeature::VoiceToText; } else if (s == u"no_ads"_q) { - return PremiumPreview::NoAds; + return PremiumFeature::NoAds; } else if (s == u"emoji_status"_q) { - return PremiumPreview::EmojiStatus; + return PremiumFeature::EmojiStatus; } else if (s == u"infinite_reactions"_q) { - return PremiumPreview::InfiniteReactions; + return PremiumFeature::InfiniteReactions; } else if (s == u"saved_tags"_q) { - return PremiumPreview::TagsForMessages; + return PremiumFeature::TagsForMessages; } else if (s == u"last_seen"_q) { - return PremiumPreview::LastSeen; + return PremiumFeature::LastSeen; } else if (s == u"message_privacy"_q) { - return PremiumPreview::MessagePrivacy; + return PremiumFeature::MessagePrivacy; } else if (s == u"premium_stickers"_q) { - return PremiumPreview::Stickers; + return PremiumFeature::Stickers; } else if (s == u"animated_emoji"_q) { - return PremiumPreview::AnimatedEmoji; + return PremiumFeature::AnimatedEmoji; } else if (s == u"advanced_chat_management"_q) { - return PremiumPreview::AdvancedChatManagement; + return PremiumFeature::AdvancedChatManagement; } else if (s == u"profile_badge"_q) { - return PremiumPreview::ProfileBadge; + return PremiumFeature::ProfileBadge; } else if (s == u"animated_userpics"_q) { - return PremiumPreview::AnimatedUserpics; + return PremiumFeature::AnimatedUserpics; } else if (s == u"translations"_q) { - return PremiumPreview::RealTimeTranslation; + return PremiumFeature::RealTimeTranslation; } else if (s == u"wallpapers"_q) { - return PremiumPreview::Wallpapers; + return PremiumFeature::Wallpapers; } - return PremiumPreview::kCount; - }) | ranges::views::filter([](PremiumPreview type) { - return (type != PremiumPreview::kCount); + return PremiumFeature::kCount; + }) | ranges::views::filter([](PremiumFeature type) { + return (type != PremiumFeature::kCount); }) | ranges::to_vector; } @@ -1588,7 +1588,7 @@ void AddSummaryPremium( not_null content, not_null controller, const QString &ref, - Fn buttonCallback) { + Fn buttonCallback) { const auto &stDefault = st::settingsButton; const auto &stLabel = st::defaultFlatLabel; const auto iconSize = st::settingsPremiumIconDouble.size(); diff --git a/Telegram/SourceFiles/settings/settings_premium.h b/Telegram/SourceFiles/settings/settings_premium.h index a8603aca6..6dd571812 100644 --- a/Telegram/SourceFiles/settings/settings_premium.h +++ b/Telegram/SourceFiles/settings/settings_premium.h @@ -9,7 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/settings_type.h" -enum class PremiumPreview; +enum class PremiumFeature; namespace style { struct RoundButton; @@ -57,7 +57,7 @@ void StartPremiumPayment( not_null controller, const QString &ref); -[[nodiscard]] QString LookupPremiumRef(PremiumPreview section); +[[nodiscard]] QString LookupPremiumRef(PremiumFeature section); void ShowPremiumPromoToast( std::shared_ptr show, @@ -91,14 +91,14 @@ struct SubscribeButtonArgs final { [[nodiscard]] not_null CreateSubscribeButton( SubscribeButtonArgs &&args); -[[nodiscard]] std::vector PremiumPreviewOrder( +[[nodiscard]] std::vector PremiumFeaturesOrder( not_null<::Main::Session*> session); void AddSummaryPremium( not_null content, not_null controller, const QString &ref, - Fn buttonCallback); + Fn buttonCallback); } // namespace Settings diff --git a/Telegram/SourceFiles/window/section_widget.cpp b/Telegram/SourceFiles/window/section_widget.cpp index dcba6476c..4d7a48c7f 100644 --- a/Telegram/SourceFiles/window/section_widget.cpp +++ b/Telegram/SourceFiles/window/section_widget.cpp @@ -529,7 +529,7 @@ bool ShowReactPremiumError( if (controller->session().premium()) { return false; } - ShowPremiumPreviewBox(controller, PremiumPreview::TagsForMessages); + ShowPremiumPreviewBox(controller, PremiumFeature::TagsForMessages); return true; } else if (controller->session().premium() || ranges::contains(item->chosenReactions(), id) @@ -538,7 +538,7 @@ bool ShowReactPremiumError( } else if (!id.custom()) { return false; } - ShowPremiumPreviewBox(controller, PremiumPreview::InfiniteReactions); + ShowPremiumPreviewBox(controller, PremiumFeature::InfiniteReactions); return true; } diff --git a/Telegram/SourceFiles/window/window_main_menu.cpp b/Telegram/SourceFiles/window/window_main_menu.cpp index 051a99d8b..e4f941d9e 100644 --- a/Telegram/SourceFiles/window/window_main_menu.cpp +++ b/Telegram/SourceFiles/window/window_main_menu.cpp @@ -1031,7 +1031,7 @@ void MainMenu::chooseEmojiStatus() { if (const auto widget = _badge->widget()) { _emojiStatusPanel->show(_controller, widget, _badge->sizeTag()); } else { - ShowPremiumPreviewBox(_controller, PremiumPreview::EmojiStatus); + ShowPremiumPreviewBox(_controller, PremiumFeature::EmojiStatus); } }