diff --git a/Telegram/SourceFiles/boxes/self_destruction_box.cpp b/Telegram/SourceFiles/boxes/self_destruction_box.cpp index 210735063..c4a070c16 100644 --- a/Telegram/SourceFiles/boxes/self_destruction_box.cpp +++ b/Telegram/SourceFiles/boxes/self_destruction_box.cpp @@ -7,20 +7,89 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "boxes/self_destruction_box.h" +#include "api/api_authorizations.h" +#include "api/api_cloud_password.h" +#include "api/api_self_destruct.h" +#include "apiwrap.h" +#include "boxes/passcode_box.h" #include "lang/lang_keys.h" +#include "main/main_session.h" #include "ui/widgets/checkbox.h" #include "ui/widgets/labels.h" -#include "apiwrap.h" -#include "api/api_self_destruct.h" -#include "api/api_authorizations.h" -#include "main/main_session.h" -#include "styles/style_layers.h" +#include "ui/text/text_utilities.h" +#include "ui/widgets/menu/menu_add_action_callback.h" +#include "ui/widgets/menu/menu_add_action_callback_factory.h" +#include "ui/widgets/popup_menu.h" #include "styles/style_boxes.h" +#include "styles/style_info.h" +#include "styles/style_layers.h" +#include "styles/style_menu_icons.h" +#include "styles/style_widgets.h" namespace { using Type = SelfDestructionBox::Type; +void AddDeleteAccount( + not_null box, + not_null session) { + if (!session->isTestMode()) { + return; + } + const auto maybeState = session->api().cloudPassword().stateCurrent(); + if (!maybeState || !maybeState->hasPassword) { + return; + } + const auto top = box->addTopButton(st::infoTopBarMenu); + const auto menu + = top->lifetime().make_state>(); + const auto handler = [=] { + session->api().cloudPassword().state( + ) | rpl::take( + 1 + ) | rpl::start_with_next([=](const Core::CloudPasswordState &state) { + auto fields = PasscodeBox::CloudFields::From(state); + fields.customTitle = tr::lng_settings_destroy_title(); + fields.customDescription = tr::lng_context_mark_read_all_sure_2( + tr::now, + Ui::Text::RichLangValue).text; + fields.customSubmitButton = tr::lng_theme_delete(); + fields.customCheckCallback = [=]( + const Core::CloudPasswordResult &result, + QPointer box) { + session->api().request(MTPaccount_DeleteAccount( + MTP_flags(MTPaccount_DeleteAccount::Flag::f_password), + MTP_string("Manual"), + result.result + )).done([=] { + if (box) { + box->uiShow()->hideLayer(); + } + }).fail([=](const MTP::Error &error) { + if (box) { + box->handleCustomCheckError(error.type()); + } + }).send(); + }; + box->uiShow()->showBox(Box(session, fields)); + }, top->lifetime()); + }; + top->setClickedCallback([=] { + *menu = base::make_unique_q( + top, + st::popupMenuWithIcons); + + const auto addAction = Ui::Menu::CreateAddActionCallback(menu->get()); + addAction({ + .text = tr::lng_settings_destroy_title(tr::now), + .handler = handler, + .icon = &st::menuIconDeleteAttention, + .isAttention = true, + }); + (*menu)->popup(QCursor::pos()); + }); +} + [[nodiscard]] std::vector Values(Type type) { switch (type) { case Type::Account: return { 30, 90, 180, 365, 548, 720 }; @@ -151,4 +220,6 @@ void SelfDestructionBox::prepare() { } else { showContent(); } + + AddDeleteAccount(this, _session); }