/* 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 */ #pragma once #include "settings/settings_common.h" #include "ui/widgets/box_content_divider.h" namespace Ui { template class CenterWrap; class FlatLabel; class InputField; class LinkButton; class PasswordInput; class RoundButton; class VerticalLayout; } // namespace Ui namespace Api { class CloudPassword; } // namespace Api namespace Settings::CloudPassword { struct StepData { QString currentPassword; QString password; QString hint; QString email; int unconfirmedEmailLengthCode; bool setOnlyRecoveryEmail = false; struct ProcessRecover { bool setNewPassword = false; QString checkedCode; QString emailPattern; }; ProcessRecover processRecover; }; void SetupAutoCloseTimer(rpl::lifetime &lifetime, Fn callback); void SetupHeader( not_null content, const QString &lottie, rpl::producer<> &&showFinished, rpl::producer &&subtitle, rpl::producer &&about); [[nodiscard]] not_null AddPasswordField( not_null content, rpl::producer &&placeholder, const QString &text); [[nodiscard]] not_null*> AddWrappedField( not_null content, rpl::producer &&placeholder, const QString &text); [[nodiscard]] not_null AddError( not_null content, Ui::PasswordInput *input); [[nodiscard]] not_null AddDoneButton( not_null content, rpl::producer &&text); [[nodiscard]] not_null AddLinkButton( not_null*> wrap, rpl::producer &&text); void AddSkipInsteadOfField(not_null content); void AddSkipInsteadOfError(not_null content); struct BottomButton { QPointer content; rpl::producer isBottomFillerShown; }; BottomButton CreateBottomDisableButton( not_null parent, rpl::producer &§ionGeometryValue, rpl::producer &&buttonText, Fn &&callback); class OneEdgeBoxContentDivider : public Ui::BoxContentDivider { public: using Ui::BoxContentDivider::BoxContentDivider; void skipEdge(Qt::Edge edge, bool skip); protected: void paintEvent(QPaintEvent *e) override; private: Qt::Edges _skipEdges; }; class AbstractStep : public AbstractSection { public: using Types = std::vector; AbstractStep( QWidget *parent, not_null controller); ~AbstractStep(); void showFinished() override final; void setInnerFocus() override final; [[nodiscard]] rpl::producer sectionShowOther() override final; [[nodiscard]] rpl::producer<> sectionShowBack() override final; [[nodiscard]] rpl::producer removeFromStack() override final; void setStepDataReference(std::any &data) override; protected: [[nodiscard]] not_null controller() const; [[nodiscard]] Api::CloudPassword &cloudPassword(); [[nodiscard]] virtual rpl::producer removeTypes(); bool isPasswordInvalidError(const QString &type); void showBack(); void showOther(Type type); void setFocusCallback(Fn callback); [[nodiscard]] rpl::producer<> showFinishes() const; StepData stepData() const; void setStepData(StepData data); private: const not_null _controller; Fn _setInnerFocusCallback; rpl::event_stream<> _showFinished; rpl::event_stream _showOther; rpl::event_stream<> _showBack; rpl::event_stream _quits; std::any *_stepData; }; template class TypedAbstractStep : public AbstractStep { public: using AbstractStep::AbstractStep; void setStepDataReference(std::any &data) override final { AbstractStep::setStepDataReference(data); static_cast(this)->setupContent(); } [[nodiscard]] static Type Id() { return SectionFactory::Instance(); } [[nodiscard]] Type id() const final override { return Id(); } }; } // namespace Settings::CloudPassword