From 2db8a5d00a459cc9a9fc6f59f9334a2044789204 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sun, 30 Nov 2025 06:37:07 +0300 Subject: [PATCH] Added initial simple list of passkeys to section of settings. --- .../settings/settings_passkeys.cpp | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/Telegram/SourceFiles/settings/settings_passkeys.cpp b/Telegram/SourceFiles/settings/settings_passkeys.cpp index 994d6c1633..f2c067666c 100644 --- a/Telegram/SourceFiles/settings/settings_passkeys.cpp +++ b/Telegram/SourceFiles/settings/settings_passkeys.cpp @@ -23,6 +23,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/wrap/vertical_layout.h" #include "lang/lang_keys.h" #include "lottie/lottie_icon.h" +#include "base/unixtime.h" +#include "styles/style_boxes.h" #include "styles/style_channel_earn.h" #include "styles/style_chat.h" #include "styles/style_layers.h" @@ -197,6 +199,7 @@ rpl::producer Passkeys::title() { void Passkeys::setupContent( not_null controller) { const auto content = Ui::CreateChild(this); + const auto session = &controller->session(); CloudPassword::SetupHeader( content, @@ -205,6 +208,38 @@ void Passkeys::setupContent( rpl::single(QString()), tr::lng_settings_passkeys_about()); + const auto container = content->add( + object_ptr(content)); + + const auto &st = st::peerListBoxItem; + const auto rebuild = [=] { + while (container->count()) { + delete container->widgetAt(0); + } + for (const auto &passkey : session->passkeys().list()) { + const auto button = container->add( + object_ptr(container)); + button->resize(button->width(), st.height); + button->paintRequest() | rpl::start_with_next([=, name = passkey.name, date = passkey.date] { + auto p = QPainter(button); + p.setFont(st.nameStyle.font); + p.setPen(st.nameFg); + p.drawText(st.namePosition.x(), st.namePosition.y() + + st.nameStyle.font->ascent, name); + p.setFont(st::contactsStatusFont); + p.setPen(st.statusFg); + const auto dateStr = base::unixtime::parse( + date).toString(u"dd.MM.yyyy"_q); + p.drawText(st.statusPosition.x(), st.statusPosition.y() + + st::contactsStatusFont->ascent, dateStr); + }, button->lifetime()); + } + }; + + session->passkeys().requestList( + ) | rpl::start_with_next(rebuild, content->lifetime()); + rebuild(); + Ui::ResizeFitChild(this, content); }