diff --git a/Telegram/SourceFiles/data/business/data_business_chatbots.cpp b/Telegram/SourceFiles/data/business/data_business_chatbots.cpp index 8862c4e84..5c8c9f895 100644 --- a/Telegram/SourceFiles/data/business/data_business_chatbots.cpp +++ b/Telegram/SourceFiles/data/business/data_business_chatbots.cpp @@ -43,10 +43,21 @@ void Chatbots::preload() { .recipients = FromMTP(_owner, bot.vrecipients()), .repliesAllowed = bot.is_can_reply(), }; + } else { + _settings.force_assign(ChatbotsSettings()); } + }).fail([=](const MTP::Error &error) { + _requestId = 0; + LOG(("API Error: Could not get connected bots %1 (%2)" + ).arg(error.code() + ).arg(error.type())); }).send(); } +bool Chatbots::loaded() const { + return _loaded; +} + const ChatbotsSettings &Chatbots::current() const { return _settings.current(); } diff --git a/Telegram/SourceFiles/data/business/data_business_chatbots.h b/Telegram/SourceFiles/data/business/data_business_chatbots.h index ca21baef6..6328b487d 100644 --- a/Telegram/SourceFiles/data/business/data_business_chatbots.h +++ b/Telegram/SourceFiles/data/business/data_business_chatbots.h @@ -31,6 +31,7 @@ public: ~Chatbots(); void preload(); + [[nodiscard]] bool loaded() const; [[nodiscard]] const ChatbotsSettings ¤t() const; [[nodiscard]] rpl::producer changes() const; [[nodiscard]] rpl::producer value() const; diff --git a/Telegram/SourceFiles/data/business/data_business_info.cpp b/Telegram/SourceFiles/data/business/data_business_info.cpp index 8a65201fe..151e36dcb 100644 --- a/Telegram/SourceFiles/data/business/data_business_info.cpp +++ b/Telegram/SourceFiles/data/business/data_business_info.cpp @@ -220,6 +220,10 @@ rpl::producer BusinessInfo::timezonesValue() const { return _timezones.value(); } +bool BusinessInfo::timezonesLoaded() const { + return !_timezones.current().list.empty(); +} + QString FindClosestTimezoneId(const std::vector &list) { const auto local = QDateTime::currentDateTime(); const auto utc = QDateTime(local.date(), local.time(), Qt::UTC); diff --git a/Telegram/SourceFiles/data/business/data_business_info.h b/Telegram/SourceFiles/data/business/data_business_info.h index adea50a17..933d86910 100644 --- a/Telegram/SourceFiles/data/business/data_business_info.h +++ b/Telegram/SourceFiles/data/business/data_business_info.h @@ -37,6 +37,7 @@ public: [[nodiscard]] rpl::producer<> greetingSettingsChanged() const; void preloadTimezones(); + [[nodiscard]] bool timezonesLoaded() const; [[nodiscard]] rpl::producer timezonesValue() const; private: diff --git a/Telegram/SourceFiles/settings/settings_business.cpp b/Telegram/SourceFiles/settings/settings_business.cpp index 157438868..c9123c528 100644 --- a/Telegram/SourceFiles/settings/settings_business.cpp +++ b/Telegram/SourceFiles/settings/settings_business.cpp @@ -12,8 +12,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/business/data_business_info.h" #include "data/business/data_business_chatbots.h" #include "data/business/data_shortcut_messages.h" +#include "data/data_changes.h" #include "data/data_peer_values.h" // AmPremiumValue. #include "data/data_session.h" +#include "data/data_user.h" #include "info/info_wrap_widget.h" // Info::Wrap. #include "info/settings/info_settings_widget.h" // SectionCustomTopBarData. #include "lang/lang_keys.h" @@ -317,6 +319,8 @@ private: rpl::event_stream<> _showFinished; rpl::variable _buttonText; + PremiumFeature _waitingToShow = PremiumFeature::Business; + }; Business::Business( @@ -355,20 +359,14 @@ void Business::setStepDataReference(std::any &data) { void Business::setupContent() { const auto content = Ui::CreateChild(this); - _controller->session().data().chatbots().preload(); - _controller->session().data().businessInfo().preload(); - _controller->session().data().shortcutMessages().preloadShortcuts(); + const auto owner = &_controller->session().data(); + owner->chatbots().preload(); + owner->businessInfo().preload(); + owner->shortcutMessages().preloadShortcuts(); Ui::AddSkip(content, st::settingsFromFileTop); - AddBusinessSummary(content, _controller, [=](PremiumFeature feature) { - if (!_controller->session().premium()) { - _setPaused(true); - const auto hidden = crl::guard(this, [=] { _setPaused(false); }); - - ShowPremiumPreviewToBuy(_controller, feature, hidden); - return; - } + const auto showFeature = [=](PremiumFeature feature) { showOther([&] { switch (feature) { case PremiumFeature::AwayMessage: return AwayMessageId(); @@ -378,8 +376,60 @@ void Business::setupContent() { case PremiumFeature::QuickReplies: return QuickRepliesId(); case PremiumFeature::BusinessBots: return ChatbotsId(); } - Unexpected("Feature in Business::setupContent."); + Unexpected("Feature in showFeature."); }()); + }; + const auto isReady = [=](PremiumFeature feature) { + switch (feature) { + case PremiumFeature::AwayMessage: + return owner->businessInfo().awaySettingsLoaded() + && owner->shortcutMessages().shortcutsLoaded(); + case PremiumFeature::BusinessHours: + return owner->session().user()->isFullLoaded() + && owner->businessInfo().timezonesLoaded(); + case PremiumFeature::BusinessLocation: + return owner->session().user()->isFullLoaded(); + case PremiumFeature::GreetingMessage: + return owner->businessInfo().greetingSettingsLoaded() + && owner->shortcutMessages().shortcutsLoaded(); + case PremiumFeature::QuickReplies: + return owner->shortcutMessages().shortcutsLoaded(); + case PremiumFeature::BusinessBots: + return owner->chatbots().loaded(); + } + Unexpected("Feature in isReady."); + }; + const auto check = [=] { + if (_waitingToShow != PremiumFeature::Business + && isReady(_waitingToShow)) { + showFeature( + std::exchange(_waitingToShow, PremiumFeature::Business)); + } + }; + + rpl::merge( + owner->businessInfo().awaySettingsChanged(), + owner->businessInfo().greetingSettingsChanged(), + owner->businessInfo().timezonesValue() | rpl::to_empty, + owner->shortcutMessages().shortcutsChanged(), + owner->chatbots().changes() | rpl::to_empty, + owner->session().changes().peerUpdates( + owner->session().user(), + Data::PeerUpdate::Flag::FullInfo) | rpl::to_empty + ) | rpl::start_with_next(check, content->lifetime()); + + AddBusinessSummary(content, _controller, [=](PremiumFeature feature) { + if (!_controller->session().premium()) { + _setPaused(true); + const auto hidden = crl::guard(this, [=] { _setPaused(false); }); + + ShowPremiumPreviewToBuy(_controller, feature, hidden); + return; + } else if (!isReady(feature)) { + _waitingToShow = feature; + } else { + showFeature(feature); + } }); Ui::ResizeFitChild(this, content);