diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index e8366f8f7..f13454d7d 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -2285,6 +2285,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_chatbots_remove" = "Remove Bot"; "lng_chatbots_not_found" = "Chatbot not found."; "lng_chatbots_add" = "Add"; +"lng_chatbots_info_url" = "https://telegram.org/privacy"; "lng_boost_channel_button" = "Boost Channel"; "lng_boost_group_button" = "Boost Group"; diff --git a/Telegram/SourceFiles/core/local_url_handlers.cpp b/Telegram/SourceFiles/core/local_url_handlers.cpp index 92ed6c9e8..d94187094 100644 --- a/Telegram/SourceFiles/core/local_url_handlers.cpp +++ b/Telegram/SourceFiles/core/local_url_handlers.cpp @@ -669,17 +669,6 @@ bool ShowSearchTagsPromo( return true; } -bool ShowAboutBusinessChatbots( - Window::SessionController *controller, - const Match &match, - const QVariant &context) { - if (!controller) { - return false; - } - controller->showToast(u"Cool feature, yeah.."_q); AssertIsDebug(); - return true; -} - void ExportTestChatTheme( not_null controller, not_null theme) { @@ -1048,10 +1037,6 @@ const std::vector &InternalUrlHandlers() { u"about_tags"_q, ShowSearchTagsPromo }, - { - u"about_business_chatbots"_q, - ShowAboutBusinessChatbots - }, }; return Result; } diff --git a/Telegram/SourceFiles/data/business/data_business_common.h b/Telegram/SourceFiles/data/business/data_business_common.h index dd66bb770..151d534e1 100644 --- a/Telegram/SourceFiles/data/business/data_business_common.h +++ b/Telegram/SourceFiles/data/business/data_business_common.h @@ -30,6 +30,10 @@ struct BusinessChats { BusinessChatTypes types; std::vector> list; + [[nodiscard]] bool empty() const { + return !types && list.empty(); + } + friend inline bool operator==( const BusinessChats &a, const BusinessChats &b) = default; @@ -193,7 +197,7 @@ enum class AwayScheduleType : uchar { }; struct AwaySchedule { - AwayScheduleType type = AwayScheduleType::Always; + AwayScheduleType type = AwayScheduleType::Never; WorkingInterval customInterval; friend inline bool operator==( diff --git a/Telegram/SourceFiles/data/business/data_business_info.cpp b/Telegram/SourceFiles/data/business/data_business_info.cpp index b6cf5ac36..8a65201fe 100644 --- a/Telegram/SourceFiles/data/business/data_business_info.cpp +++ b/Telegram/SourceFiles/data/business/data_business_info.cpp @@ -109,20 +109,20 @@ void BusinessInfo::saveAwaySettings( const auto &was = _awaySettings; if (was == data) { return; + } else if (!data || data.shortcutId) { + using Flag = MTPaccount_UpdateBusinessAwayMessage::Flag; + const auto session = &_owner->session(); + session->api().request(MTPaccount_UpdateBusinessAwayMessage( + MTP_flags(data ? Flag::f_message : Flag()), + data ? ToMTP(data) : MTPInputBusinessAwayMessage() + )).fail([=](const MTP::Error &error) { + _awaySettings = was; + _awaySettingsChanged.fire({}); + if (fail) { + fail(error.type()); + } + }).send(); } - using Flag = MTPaccount_UpdateBusinessAwayMessage::Flag; - const auto session = &_owner->session(); - session->api().request(MTPaccount_UpdateBusinessAwayMessage( - MTP_flags(data ? Flag::f_message : Flag()), - data ? ToMTP(data) : MTPInputBusinessAwayMessage() - )).fail([=](const MTP::Error &error) { - _awaySettings = was; - _awaySettingsChanged.fire({}); - if (fail) { - fail(error.type()); - } - }).send(); - _awaySettings = std::move(data); _awaySettingsChanged.fire({}); } @@ -153,20 +153,20 @@ void BusinessInfo::saveGreetingSettings( const auto &was = _greetingSettings; if (was == data) { return; + } else if (!data || data.shortcutId) { + using Flag = MTPaccount_UpdateBusinessGreetingMessage::Flag; + _owner->session().api().request( + MTPaccount_UpdateBusinessGreetingMessage( + MTP_flags(data ? Flag::f_message : Flag()), + data ? ToMTP(data) : MTPInputBusinessGreetingMessage()) + ).fail([=](const MTP::Error &error) { + _greetingSettings = was; + _greetingSettingsChanged.fire({}); + if (fail) { + fail(error.type()); + } + }).send(); } - using Flag = MTPaccount_UpdateBusinessGreetingMessage::Flag; - _owner->session().api().request( - MTPaccount_UpdateBusinessGreetingMessage( - MTP_flags(data ? Flag::f_message : Flag()), - data ? ToMTP(data) : MTPInputBusinessGreetingMessage()) - ).fail([=](const MTP::Error &error) { - _greetingSettings = was; - _greetingSettingsChanged.fire({}); - if (fail) { - fail(error.type()); - } - }).send(); - _greetingSettings = std::move(data); _greetingSettingsChanged.fire({}); } diff --git a/Telegram/SourceFiles/info/info_content_widget.h b/Telegram/SourceFiles/info/info_content_widget.h index 29d947c66..7f7cd0f2f 100644 --- a/Telegram/SourceFiles/info/info_content_widget.h +++ b/Telegram/SourceFiles/info/info_content_widget.h @@ -101,6 +101,12 @@ public: } virtual void fillTopBarMenu(const Ui::Menu::MenuCallback &addAction); + [[nodiscard]] virtual bool closeByOutsideClick() const { + return true; + } + virtual void checkBeforeClose(Fn close) { + close(); + } [[nodiscard]] virtual rpl::producer title() = 0; [[nodiscard]] virtual rpl::producer subtitle() { return nullptr; diff --git a/Telegram/SourceFiles/info/info_wrap_widget.cpp b/Telegram/SourceFiles/info/info_wrap_widget.cpp index a2c6a781c..50eb99333 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.cpp +++ b/Telegram/SourceFiles/info/info_wrap_widget.cpp @@ -410,8 +410,10 @@ void WrapWidget::setupTopBarMenuToggle() { } void WrapWidget::checkBeforeClose(Fn close) { - _controller->parentController()->hideLayer(); - close(); + _content->checkBeforeClose(crl::guard(this, [=] { + _controller->parentController()->hideLayer(); + close(); + })); } void WrapWidget::addTopBarMenuButton() { @@ -438,7 +440,7 @@ void WrapWidget::addTopBarMenuButton() { } bool WrapWidget::closeByOutsideClick() const { - return true; + return _content->closeByOutsideClick(); } void WrapWidget::addProfileCallsButton() { @@ -872,8 +874,12 @@ void WrapWidget::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Escape || e->key() == Qt::Key_Back) { if (hasStackHistory() || wrap() != Wrap::Layer) { checkBeforeClose([=] { _controller->showBackFromStack(); }); - return; + } else { + checkBeforeClose([=] { + _controller->parentController()->hideSpecialLayer(); + }); } + return; } SectionWidget::keyPressEvent(e); } diff --git a/Telegram/SourceFiles/info/settings/info_settings_widget.cpp b/Telegram/SourceFiles/info/settings/info_settings_widget.cpp index 5bc315aa1..bbc0ca717 100644 --- a/Telegram/SourceFiles/info/settings/info_settings_widget.cpp +++ b/Telegram/SourceFiles/info/settings/info_settings_widget.cpp @@ -232,6 +232,14 @@ rpl::producer Widget::desiredShadowVisibility() const { : rpl::single(true); } +bool Widget::closeByOutsideClick() const { + return _inner->closeByOutsideClick();; +} + +void Widget::checkBeforeClose(Fn close) { + _inner->checkBeforeClose(std::move(close)); +} + rpl::producer Widget::title() { return _inner->title(); } diff --git a/Telegram/SourceFiles/info/settings/info_settings_widget.h b/Telegram/SourceFiles/info/settings/info_settings_widget.h index 09fca4419..23b4e7c93 100644 --- a/Telegram/SourceFiles/info/settings/info_settings_widget.h +++ b/Telegram/SourceFiles/info/settings/info_settings_widget.h @@ -76,6 +76,8 @@ public: rpl::producer desiredShadowVisibility() const override; + bool closeByOutsideClick() const override; + void checkBeforeClose(Fn close) override; rpl::producer title() override; void enableBackButton() override; diff --git a/Telegram/SourceFiles/settings/business/settings_away_message.cpp b/Telegram/SourceFiles/settings/business/settings_away_message.cpp index a31e2958f..a5fef26a2 100644 --- a/Telegram/SourceFiles/settings/business/settings_away_message.cpp +++ b/Telegram/SourceFiles/settings/business/settings_away_message.cpp @@ -38,6 +38,7 @@ public: not_null controller); ~AwayMessage(); + [[nodiscard]] bool closeByOutsideClick() const override; [[nodiscard]] rpl::producer title() override; private: @@ -199,6 +200,10 @@ AwayMessage::~AwayMessage() { } } +bool AwayMessage::closeByOutsideClick() const { + return false; +} + rpl::producer AwayMessage::title() { return tr::lng_away_title(); } diff --git a/Telegram/SourceFiles/settings/business/settings_chatbots.cpp b/Telegram/SourceFiles/settings/business/settings_chatbots.cpp index d9b17f260..78d446200 100644 --- a/Telegram/SourceFiles/settings/business/settings_chatbots.cpp +++ b/Telegram/SourceFiles/settings/business/settings_chatbots.cpp @@ -53,6 +53,7 @@ public: not_null controller); ~Chatbots(); + [[nodiscard]] bool closeByOutsideClick() const override; [[nodiscard]] rpl::producer title() override; const Ui::RoundRect *bottomSkipRounding() const override { @@ -380,6 +381,10 @@ Chatbots::~Chatbots() { } } +bool Chatbots::closeByOutsideClick() const { + return false; +} + rpl::producer Chatbots::title() { return tr::lng_chatbots_title(); } @@ -402,7 +407,7 @@ void Chatbots::setupContent( .about = tr::lng_chatbots_about( lt_link, tr::lng_chatbots_about_link( - ) | Ui::Text::ToLink(u"internal:about_business_chatbots"_q), + ) | Ui::Text::ToLink(tr::lng_chatbots_info_url(tr::now)), Ui::Text::WithEntities), .aboutMargins = st::peerAppearanceCoverLabelMargin, }); @@ -485,7 +490,7 @@ void Chatbots::save() { .recipients = _recipients.current(), .repliesAllowed = _repliesAllowed.current(), }, [=] { - }, [=](QString error) { show->showToast(error); }); + }, fail); } } // namespace diff --git a/Telegram/SourceFiles/settings/business/settings_greeting.cpp b/Telegram/SourceFiles/settings/business/settings_greeting.cpp index 932c1d980..9809c1b71 100644 --- a/Telegram/SourceFiles/settings/business/settings_greeting.cpp +++ b/Telegram/SourceFiles/settings/business/settings_greeting.cpp @@ -42,6 +42,7 @@ public: not_null controller); ~Greeting(); + [[nodiscard]] bool closeByOutsideClick() const override; [[nodiscard]] rpl::producer title() override; const Ui::RoundRect *bottomSkipRounding() const override { @@ -105,6 +106,10 @@ Greeting::~Greeting() { } } +bool Greeting::closeByOutsideClick() const { + return false; +} + rpl::producer Greeting::title() { return tr::lng_greeting_title(); } diff --git a/Telegram/SourceFiles/settings/business/settings_recipients_helper.cpp b/Telegram/SourceFiles/settings/business/settings_recipients_helper.cpp index 960c354b2..fb2ac16e9 100644 --- a/Telegram/SourceFiles/settings/business/settings_recipients_helper.cpp +++ b/Telegram/SourceFiles/settings/business/settings_recipients_helper.cpp @@ -168,8 +168,10 @@ void AddBusinessRecipientsSelector( modify(now); *data = std::move(now); }; + const auto ¤t = data->current(); + const auto all = current.allButExcluded || current.included.empty(); const auto group = std::make_shared( - data->current().allButExcluded ? kAllExcept : kSelectedOnly); + all ? kAllExcept : kSelectedOnly); const auto everyone = container->add( object_ptr( container, @@ -281,6 +283,12 @@ void AddBusinessRecipientsSelector( }, lifetime); SetupBusinessChatsPreview(includeInner, included); + included->value( + ) | rpl::start_with_next([=](const Data::BusinessChats &value) { + if (value.empty() && group->current() == kSelectedOnly) { + group->setValue(kAllExcept); + } + }, lifetime); includeWrap->toggleOn(data->value( ) | rpl::map([](const Data::BusinessRecipients &value) { @@ -289,6 +297,20 @@ void AddBusinessRecipientsSelector( includeWrap->finishAnimating(); group->setChangedCallback([=](int value) { + if (value == kSelectedOnly && data->current().included.empty()) { + group->setValue(kAllExcept); + const auto save = [=](Data::BusinessChats value) { + change([&](Data::BusinessRecipients &data) { + data.included = std::move(value); + }); + group->setValue(kSelectedOnly); + }; + EditBusinessChats(controller, { + .save = crl::guard(includeAdd, save), + .include = true, + }); + return; + } change([&](Data::BusinessRecipients &data) { data.allButExcluded = (value == kAllExcept); }); diff --git a/Telegram/SourceFiles/settings/business/settings_working_hours.cpp b/Telegram/SourceFiles/settings/business/settings_working_hours.cpp index bae1b6b3d..1d06c99ce 100644 --- a/Telegram/SourceFiles/settings/business/settings_working_hours.cpp +++ b/Telegram/SourceFiles/settings/business/settings_working_hours.cpp @@ -44,6 +44,7 @@ public: not_null controller); ~WorkingHours(); + [[nodiscard]] bool closeByOutsideClick() const override; [[nodiscard]] rpl::producer title() override; private: @@ -529,6 +530,10 @@ WorkingHours::~WorkingHours() { } } +bool WorkingHours::closeByOutsideClick() const { + return false; +} + rpl::producer WorkingHours::title() { return tr::lng_hours_title(); } diff --git a/Telegram/SourceFiles/settings/settings_common.h b/Telegram/SourceFiles/settings/settings_common.h index c279640a5..c36927978 100644 --- a/Telegram/SourceFiles/settings/settings_common.h +++ b/Telegram/SourceFiles/settings/settings_common.h @@ -70,6 +70,12 @@ public: [[nodiscard]] virtual rpl::producer> removeFromStack() { return nullptr; } + [[nodiscard]] virtual bool closeByOutsideClick() const { + return true; + } + virtual void checkBeforeClose(Fn close) { + close(); + } [[nodiscard]] virtual rpl::producer title() = 0; virtual void sectionSaveChanges(FnMut done) { done();