diff --git a/Telegram/SourceFiles/intro/intro_code.cpp b/Telegram/SourceFiles/intro/intro_code.cpp index 15d25b1b80..35ea91156b 100644 --- a/Telegram/SourceFiles/intro/intro_code.cpp +++ b/Telegram/SourceFiles/intro/intro_code.cpp @@ -100,10 +100,13 @@ CodeWidget::CodeWidget( _code->setDigitsCountMax(getData()->codeLength); - setTitleText(getData()->codeByFragmentUrl.isEmpty() - ? rpl::single(Ui::FormatPhone(getData()->phone)) - : tr::lng_intro_fragment_title()); updateDescText(); + setTitleText(_isFragment.value( + ) | rpl::map([=](bool isFragment) { + return !isFragment + ? rpl::single(Ui::FormatPhone(getData()->phone)) + : tr::lng_intro_fragment_title(); + }) | rpl::flatten_latest()); account->setHandleLoginCode([=](const QString &code) { _code->setText(code); @@ -126,6 +129,7 @@ int CodeWidget::errorTop() const { void CodeWidget::updateDescText() { const auto byTelegram = getData()->codeByTelegram; const auto isFragment = !getData()->codeByFragmentUrl.isEmpty(); + _isFragment = isFragment; setDescriptionText( isFragment ? tr::lng_intro_fragment_about( @@ -136,8 +140,7 @@ void CodeWidget::updateDescText() { Ui::Text::RichLangValue) : (byTelegram ? tr::lng_code_from_telegram : tr::lng_code_desc)( Ui::Text::RichLangValue)); - if (isFragment) { - } else if (getData()->codeByTelegram) { + if (getData()->codeByTelegram) { _noTelegramCode->show(); _callTimer.cancel(); } else { @@ -420,15 +423,19 @@ void CodeWidget::submitCode() { } rpl::producer CodeWidget::nextButtonText() const { - return getData()->codeByFragmentUrl.isEmpty() - ? Step::nextButtonText() - : tr::lng_intro_fragment_button(); + return _isFragment.value( + ) | rpl::map([=](bool isFragment) { + return isFragment + ? tr::lng_intro_fragment_button() + : Step::nextButtonText(); + }) | rpl::flatten_latest(); } -const style::RoundButton *CodeWidget::nextButtonStyle() const { - return !getData()->codeByFragmentUrl.isEmpty() - ? &st::introFragmentButton - : nullptr; +rpl::producer CodeWidget::nextButtonStyle() const { + return _isFragment.value( + ) | rpl::map([](bool isFragment) { + return isFragment ? &st::introFragmentButton : nullptr; + }); } void CodeWidget::noTelegramCode() { diff --git a/Telegram/SourceFiles/intro/intro_code.h b/Telegram/SourceFiles/intro/intro_code.h index 95ae597a1a..93de745c14 100644 --- a/Telegram/SourceFiles/intro/intro_code.h +++ b/Telegram/SourceFiles/intro/intro_code.h @@ -56,7 +56,7 @@ public: void cancelled() override; void submit() override; rpl::producer nextButtonText() const override; - const style::RoundButton *nextButtonStyle() const override; + rpl::producer nextButtonStyle() const override; void updateDescText(); @@ -96,6 +96,8 @@ private: QString _sentCode; mtpRequestId _sentRequest = 0; + rpl::variable _isFragment = false; + base::Timer _callTimer; CallStatus _callStatus = CallStatus(); int _callTimeout; diff --git a/Telegram/SourceFiles/intro/intro_step.cpp b/Telegram/SourceFiles/intro/intro_step.cpp index 68ff6b40fe..257b599f26 100644 --- a/Telegram/SourceFiles/intro/intro_step.cpp +++ b/Telegram/SourceFiles/intro/intro_step.cpp @@ -119,8 +119,8 @@ rpl::producer Step::nextButtonText() const { return tr::lng_intro_next(); } -const style::RoundButton *Step::nextButtonStyle() const { - return nullptr; +rpl::producer Step::nextButtonStyle() const { + return rpl::single((const style::RoundButton*)(nullptr)); } void Step::goBack() { diff --git a/Telegram/SourceFiles/intro/intro_step.h b/Telegram/SourceFiles/intro/intro_step.h index 256396bf22..6261b454cf 100644 --- a/Telegram/SourceFiles/intro/intro_step.h +++ b/Telegram/SourceFiles/intro/intro_step.h @@ -81,7 +81,8 @@ public: virtual void submit() = 0; [[nodiscard]] virtual rpl::producer nextButtonText() const; - [[nodiscard]] virtual const style::RoundButton *nextButtonStyle() const; + [[nodiscard]] virtual auto nextButtonStyle() const + -> rpl::producer; [[nodiscard]] int contentLeft() const; [[nodiscard]] int contentTop() const; diff --git a/Telegram/SourceFiles/intro/intro_widget.cpp b/Telegram/SourceFiles/intro/intro_widget.cpp index e90cf82d0e..7f15c92f0b 100644 --- a/Telegram/SourceFiles/intro/intro_widget.cpp +++ b/Telegram/SourceFiles/intro/intro_widget.cpp @@ -342,17 +342,21 @@ void Widget::historyMove(StackAction action, Animate animate) { hideAndDestroy(std::exchange(_terms, { nullptr })); } { - const auto st = getStep()->nextButtonStyle(); - const auto nextStyle = st ? st : &st::introNextButton; - if (_nextStyle != nextStyle) { - _nextStyle = nextStyle; - _next = nullptr; - _next.create( - this, - object_ptr(this, nullptr, *nextStyle)); - showControls(); - updateControlsGeometry(); - } + getStep()->nextButtonStyle( + ) | rpl::start_with_next([=](const style::RoundButton *st) { + const auto nextStyle = st ? st : &st::introNextButton; + if (_nextStyle != nextStyle) { + _nextStyle = nextStyle; + const auto wasShown = _next->toggled(); + _next.destroy(); + _next.create( + this, + object_ptr(this, nullptr, *nextStyle)); + showControls(); + updateControlsGeometry(); + _next->toggle(wasShown, anim::type::instant); + } + }, _next->lifetime()); } getStep()->finishInit();