From 9a57347973fa2945b13ede44bea8a00a614ee3a1 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 6 May 2022 06:22:48 +0300 Subject: [PATCH] Added step section of email input to cloud password settings. --- Telegram/CMakeLists.txt | 2 + .../animations/cloud_password/email.tgs | Bin 0 -> 4597 bytes Telegram/Resources/langs/lang.strings | 4 +- .../Resources/qrc/telegram/animations.qrc | 1 + .../settings_cloud_password_common.cpp | 7 + .../settings_cloud_password_common.h | 8 + .../settings_cloud_password_email.cpp | 159 ++++++++++++++++++ .../settings_cloud_password_email.h | 17 ++ 8 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 Telegram/Resources/animations/cloud_password/email.tgs create mode 100644 Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email.cpp create mode 100644 Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 9149029ae..e9d46d619 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -1074,6 +1074,8 @@ PRIVATE profile/profile_cover_drop_area.h settings/cloud_password/settings_cloud_password_common.cpp settings/cloud_password/settings_cloud_password_common.h + settings/cloud_password/settings_cloud_password_email.cpp + settings/cloud_password/settings_cloud_password_email.h settings/cloud_password/settings_cloud_password_hint.cpp settings/cloud_password/settings_cloud_password_hint.h settings/cloud_password/settings_cloud_password_input.cpp diff --git a/Telegram/Resources/animations/cloud_password/email.tgs b/Telegram/Resources/animations/cloud_password/email.tgs new file mode 100644 index 0000000000000000000000000000000000000000..c8aa2e7b3b5f589de20398f1ab4ea8bfc769c1be GIT binary patch literal 4597 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 600a48a4c..7228bbccc 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -562,6 +562,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_cloud_password_manage_email_change" = "Change Recovery Email"; "lng_settings_cloud_password_manage_password_change" = "Change Password"; "lng_settings_cloud_password_skip_hint" = "Skip hint"; +"lng_settings_cloud_password_save" = "Save and Finish"; +"lng_settings_cloud_password_email_confirm" = "Confirm and Finish"; "lng_clear_payment_info_title" = "Clear payment info"; "lng_clear_payment_info_sure" = "Are you sure you want to clear your payment and shipping info?"; @@ -705,7 +707,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_cloud_password_hint" = "Enter Password Hint"; "lng_cloud_password_change_hint" = "Enter new password hint"; "lng_cloud_password_bad" = "Password and hint cannot be the same."; -"lng_cloud_password_email" = "Enter recovery email"; +"lng_cloud_password_email" = "Enter Email"; "lng_cloud_password_bad_email" = "Incorrect email, please try other."; "lng_cloud_password_about" = "This password will be asked when you log in on a new device in addition to the SMS code."; "lng_cloud_password_about_recover" = "Warning! Are you sure you don't want to\nadd a password recovery email?\n\nIf you forget your password, you will\nlose access to your Telegram account."; diff --git a/Telegram/Resources/qrc/telegram/animations.qrc b/Telegram/Resources/qrc/telegram/animations.qrc index f8590c6bb..4197f473f 100644 --- a/Telegram/Resources/qrc/telegram/animations.qrc +++ b/Telegram/Resources/qrc/telegram/animations.qrc @@ -7,5 +7,6 @@ ../../animations/cloud_password/intro.tgs ../../animations/cloud_password/password_input.tgs ../../animations/cloud_password/hint.tgs + ../../animations/cloud_password/email.tgs diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp index c1414a27a..7fba2db1e 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp @@ -7,13 +7,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "settings/cloud_password/settings_cloud_password_common.h" +#include "apiwrap.h" #include "lang/lang_keys.h" #include "lottie/lottie_icon.h" +#include "main/main_session.h" #include "settings/settings_common.h" #include "ui/widgets/buttons.h" #include "ui/widgets/input_fields.h" #include "ui/widgets/labels.h" #include "ui/wrap/vertical_layout.h" +#include "window/window_session_controller.h" #include "styles/style_boxes.h" #include "styles/style_layers.h" #include "styles/style_settings.h" @@ -223,6 +226,10 @@ not_null AbstractStep::controller() const { return _controller; } +Api::CloudPassword &AbstractStep::cloudPassword() { + return _controller->session().api().cloudPassword(); +} + void AbstractStep::showBack() { _showBack.fire({}); } diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h index cd226079d..ded3b1b5b 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h @@ -20,11 +20,18 @@ 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; }; void SetupHeader( @@ -96,6 +103,7 @@ public: protected: [[nodiscard]] not_null controller() const; + [[nodiscard]] Api::CloudPassword &cloudPassword(); void showBack(); void showOther(Type type); diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email.cpp new file mode 100644 index 000000000..c225e56df --- /dev/null +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email.cpp @@ -0,0 +1,159 @@ +/* +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 +*/ +#include "settings/cloud_password/settings_cloud_password_email.h" + +#include "api/api_cloud_password.h" +#include "lang/lang_keys.h" +#include "settings/cloud_password/settings_cloud_password_common.h" +#include "ui/boxes/confirm_box.h" +#include "ui/widgets/buttons.h" +#include "ui/widgets/input_fields.h" +#include "ui/wrap/padding_wrap.h" +#include "ui/wrap/vertical_layout.h" +#include "window/window_session_controller.h" +#include "styles/style_boxes.h" +#include "styles/style_layers.h" +#include "styles/style_settings.h" + +namespace Settings { +namespace CloudPassword { + +class Email : public TypedAbstractStep { +public: + using TypedAbstractStep::TypedAbstractStep; + + [[nodiscard]] rpl::producer title() override; + void setupContent(); + +private: + rpl::lifetime _requestLifetime; + +}; + +rpl::producer Email::title() { + return tr::lng_settings_cloud_password_email_title(); +} + +void Email::setupContent() { + const auto content = Ui::CreateChild(this); + auto currentStepData = stepData(); + const auto currentStepDataEmail = base::take(currentStepData.email); + setStepData(currentStepData); + + SetupHeader( + content, + u"cloud_password/email"_q, + showFinishes(), + tr::lng_settings_cloud_password_email_subtitle(), + tr::lng_settings_cloud_password_email_about()); + + AddSkip(content, st::settingLocalPasscodeDescriptionBottomSkip); + + const auto wrap = AddWrappedField( + content, + tr::lng_cloud_password_email(), + currentStepDataEmail); + const auto newInput = wrap->entity(); + AddSkipInsteadOfField(content); + AddSkipInsteadOfError(content); + + const auto send = [=](Fn close) { + Expects(!_requestLifetime); + + const auto data = stepData(); + + _requestLifetime = cloudPassword().set( + data.currentPassword, + data.password, + data.hint, + !data.email.isEmpty(), + data.email + ) | rpl::start_with_next_error_done([=](Api::CloudPassword::SetOk d) { + _requestLifetime.destroy(); + + auto data = stepData(); + data.unconfirmedEmailLengthCode = d.unconfirmedEmailLengthCode; + setStepData(std::move(data)); + }, [=](const QString &error) { + _requestLifetime.destroy(); + + }, [=] { + _requestLifetime.destroy(); + + auto empty = StepData(); + empty.currentPassword = stepData().password; + setStepData(std::move(empty)); + }); + + if (close) { + _requestLifetime.add(close); + } + }; + + const auto confirm = [=](const QString &email) { + if (_requestLifetime) { + return; + } + + auto data = stepData(); + data.email = email; + setStepData(std::move(data)); + + if (!email.isEmpty()) { + send(nullptr); + return; + } + + controller()->show(Ui::MakeConfirmBox({ + .text = { tr::lng_cloud_password_about_recover() }, + .confirmed = crl::guard(this, send), + .confirmText = tr::lng_cloud_password_skip_email(), + .confirmStyle = &st::attentionBoxButton, + })); + }; + + const auto skip = Ui::CreateChild( + this, + tr::lng_cloud_password_skip_email(tr::now)); + wrap->geometryValue( + ) | rpl::start_with_next([=](QRect r) { + r.translate(wrap->entity()->pos().x(), 0); + skip->moveToLeft(r.x(), r.y() + r.height() + st::passcodeTextLine); + }, skip->lifetime()); + skip->setClickedCallback([=] { + confirm(QString()); + }); + + const auto button = AddDoneButton( + content, + tr::lng_settings_cloud_password_save()); + button->setClickedCallback([=] { + const auto newText = newInput->getLastText(); + if (newText.isEmpty()) { + newInput->setFocus(); + newInput->showError(); + } else { + confirm(newText); + } + }); + + const auto submit = [=] { button->clicked({}, Qt::LeftButton); }; + QObject::connect(newInput, &Ui::InputField::submitted, submit); + + setFocusCallback([=] { newInput->setFocus(); }); + + Ui::ResizeFitChild(this, content); +} + +} // namespace CloudPassword + +Type CloudPasswordEmailId() { + return CloudPassword::Email::Id(); +} + +} // namespace Settings diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email.h b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email.h new file mode 100644 index 000000000..c018138a9 --- /dev/null +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_email.h @@ -0,0 +1,17 @@ +/* +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_type.h" + +namespace Settings { + +Type CloudPasswordEmailId(); + +} // namespace Settings +