From f20c5a1d3c3b33fffc7e09375d82edac411f427f Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 29 Nov 2025 04:23:18 +0300 Subject: [PATCH] Added initial box as entry point for passkey creation. --- Telegram/Resources/animations/passkeys.tgs | Bin 0 -> 44400 bytes .../Resources/qrc/telegram/animations.qrc | 1 + Telegram/SourceFiles/settings/settings.style | 4 + .../settings/settings_passkeys.cpp | 144 ++++++++++++++++++ .../SourceFiles/settings/settings_passkeys.h | 8 + 5 files changed, 157 insertions(+) create mode 100644 Telegram/Resources/animations/passkeys.tgs diff --git a/Telegram/Resources/animations/passkeys.tgs b/Telegram/Resources/animations/passkeys.tgs new file mode 100644 index 0000000000000000000000000000000000000000..62e11b25406ed300336133b1f0c5ff79718715bf GIT binary patch literal 44400 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 z%0A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 M0ebyUnEB5G0E!1?{Qv*} literal 0 HcmV?d00001 diff --git a/Telegram/Resources/qrc/telegram/animations.qrc b/Telegram/Resources/qrc/telegram/animations.qrc index 5a52c5f380..34e0b4591e 100644 --- a/Telegram/Resources/qrc/telegram/animations.qrc +++ b/Telegram/Resources/qrc/telegram/animations.qrc @@ -50,6 +50,7 @@ ../../animations/rtmp.tgs ../../animations/show_or_premium_lastseen.tgs ../../animations/show_or_premium_readtime.tgs + ../../animations/passkeys.tgs ../../animations/profile/profile_muting.tgs ../../animations/profile/profile_unmuting.tgs diff --git a/Telegram/SourceFiles/settings/settings.style b/Telegram/SourceFiles/settings/settings.style index 6460e3c3d7..d0a7275782 100644 --- a/Telegram/SourceFiles/settings/settings.style +++ b/Telegram/SourceFiles/settings/settings.style @@ -715,6 +715,10 @@ settingsCreditsButton: SettingsButton(settingsButton) { settingsButtonIconGift: icon {{ "settings/gift", menuIconColor }}; settingsButtonIconEarn: icon {{ "settings/earn", menuIconColor }}; +settingsIconPasskeysAboutIcon1: icon {{ "menu/permissions", boxTextFg }}; +settingsIconPasskeysAboutIcon2: icon {{ "menu/passcode_winhello", boxTextFg }}; +settingsIconPasskeysAboutIcon3: icon {{ "menu/lock", boxTextFg }}; + settingsAgeVerifyBox: Box(filterInviteBox) { buttonPadding: margins(24px, 24px, 24px, 24px); } diff --git a/Telegram/SourceFiles/settings/settings_passkeys.cpp b/Telegram/SourceFiles/settings/settings_passkeys.cpp index 3fe0c507e3..b82fd35231 100644 --- a/Telegram/SourceFiles/settings/settings_passkeys.cpp +++ b/Telegram/SourceFiles/settings/settings_passkeys.cpp @@ -7,13 +7,157 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "settings/settings_passkeys.h" +#include "data/components/passkeys.h" +#include "data/data_session.h" +#include "window/window_session_controller.h" +#include "main/main_session.h" +#include "platform/platform_webauthn.h" +#include "ui/layers/generic_box.h" +#include "ui/painter.h" +#include "ui/rect.h" +#include "ui/text/text_utilities.h" #include "ui/vertical_list.h" +#include "ui/widgets/buttons.h" #include "ui/wrap/vertical_layout.h" #include "lang/lang_keys.h" +#include "lottie/lottie_icon.h" +#include "styles/style_channel_earn.h" +#include "styles/style_chat.h" +#include "styles/style_layers.h" +#include "styles/style_premium.h" #include "styles/style_settings.h" namespace Settings { +void PasskeysNoneBox( + not_null box, + not_null session) { + box->setWidth(st::boxWideWidth); + box->setNoContentMargin(true); + box->setCloseByEscape(true); + box->addTopButton(st::boxTitleClose, [=] { box->closeBox(); }); + + const auto content = box->verticalLayout().get(); + + Ui::AddSkip(content); + { + const auto &size = st::settingsCloudPasswordIconSize; + auto icon = CreateLottieIcon( + content, + { .name = u"passkeys"_q, .sizeOverride = { size, size } }, + st::settingLocalPasscodeIconPadding); + const auto animate = std::move(icon.animate); + box->addRow(std::move(icon.widget), style::al_top); + box->showFinishes() | rpl::take(1) | rpl::start_with_next([=] { + animate(anim::repeat::once); + }, content->lifetime()); + } + Ui::AddSkip(content); + Ui::AddSkip(content); + box->addRow( + object_ptr( + content, + tr::lng_settings_passkeys_none_title(), + st::boxTitle), + style::al_top); + Ui::AddSkip(content); + box->addRow( + object_ptr( + content, + tr::lng_settings_passkeys_none_about(), + st::channelEarnLearnDescription), + style::al_top); + Ui::AddSkip(content); + Ui::AddSkip(content); + Ui::AddSkip(content); + { + const auto padding = QMargins( + st::settingsButton.padding.left(), + st::boxRowPadding.top(), + st::boxRowPadding.right(), + st::boxRowPadding.bottom()); + const auto addEntry = [&]( + rpl::producer title, + rpl::producer about, + const style::icon &icon) { + const auto top = content->add( + object_ptr( + content, + std::move(title), + st::channelEarnSemiboldLabel), + padding); + Ui::AddSkip(content, st::channelEarnHistoryThreeSkip); + content->add( + object_ptr( + content, + std::move(about), + st::channelEarnHistoryRecipientLabel), + padding); + const auto left = Ui::CreateChild( + box->verticalLayout().get()); + left->paintRequest( + ) | rpl::start_with_next([=] { + auto p = Painter(left); + icon.paint(p, 0, 0, left->width()); + }, left->lifetime()); + left->resize(icon.size()); + top->geometryValue( + ) | rpl::start_with_next([=](const QRect &g) { + left->moveToLeft( + (g.left() - left->width()) / 2, + g.top() + st::channelEarnHistoryThreeSkip); + }, left->lifetime()); + }; + addEntry( + tr::lng_settings_passkeys_none_info1_title(), + tr::lng_settings_passkeys_none_info1_about(), + st::settingsIconPasskeysAboutIcon1); + Ui::AddSkip(content); + Ui::AddSkip(content); + addEntry( + tr::lng_settings_passkeys_none_info2_title(), + tr::lng_settings_passkeys_none_info2_about(), + st::settingsIconPasskeysAboutIcon2); + Ui::AddSkip(content); + Ui::AddSkip(content); + addEntry( + tr::lng_settings_passkeys_none_info3_title(), + tr::lng_settings_passkeys_none_info3_about(), + st::settingsIconPasskeysAboutIcon3); + Ui::AddSkip(content); + Ui::AddSkip(content); + } + Ui::AddSkip(content); + Ui::AddSkip(content); + { + const auto &st = st::premiumPreviewDoubledLimitsBox; + box->setStyle(st); + auto button = object_ptr( + box, + tr::lng_settings_passkeys_none_button(), + st::defaultActiveButton); + button->setTextTransform(Ui::RoundButton::TextTransform::NoTransform); + button->resizeToWidth(box->width() + - st.buttonPadding.left() + - st.buttonPadding.left()); + button->setClickedCallback([=] { + session->passkeys().initRegistration([=]( + const Data::Passkey::RegisterData &data) { + Platform::WebAuthn::RegisterKey(data, [=]( + Platform::WebAuthn::RegisterResult result) { + if (!result.success) { + return; + } + session->passkeys().registerPasskey(result, [=] { + box->closeBox(); + }); + }); + }); + }); + box->addButton(std::move(button)); + } +} + Passkeys::Passkeys( QWidget *parent, not_null controller) diff --git a/Telegram/SourceFiles/settings/settings_passkeys.h b/Telegram/SourceFiles/settings/settings_passkeys.h index 182e6b713b..999a768030 100644 --- a/Telegram/SourceFiles/settings/settings_passkeys.h +++ b/Telegram/SourceFiles/settings/settings_passkeys.h @@ -9,8 +9,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/settings_common_session.h" +namespace Ui { +class GenericBox; +} // namespace Ui + namespace Settings { +void PasskeysNoneBox( + not_null box, + not_null session); + class Passkeys : public Section { public: Passkeys(