From 067dcbfbebe4960f0858b0a49692779da4493772 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 5 Jun 2025 17:14:28 +0300 Subject: [PATCH] Added initial entry point for self statistics of credits. --- Telegram/Resources/langs/lang.strings | 3 + .../info/bot/earn/info_bot_earn_list.cpp | 30 +++--- Telegram/SourceFiles/settings/settings.style | 9 ++ .../SourceFiles/settings/settings_common.cpp | 6 +- .../SourceFiles/settings/settings_credits.cpp | 93 ++++++++++++++----- .../settings/settings_credits_graphics.cpp | 24 ++--- 6 files changed, 116 insertions(+), 49 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 86ddc9cc3e..d1a9784970 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -2780,6 +2780,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_credits_more_options" = "More Options"; "lng_credits_balance_me" = "your balance"; "lng_credits_buy_button" = "Buy More Stars"; +"lng_credits_buy_button_short" = "Top Up"; +"lng_credits_stats_button_short" = "Stats"; "lng_credits_gift_button" = "Gift Stars to Friends"; "lng_credits_box_out_title" = "Confirm Your Purchase"; "lng_credits_box_out_sure#one" = "Do you want to buy **\"{text}\"** in **{bot}** for **{count} Star**?"; @@ -6431,6 +6433,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_bot_earn_balance_button_locked" = "Withdraw"; "lng_bot_earn_balance_button_buy_ads" = "Buy Ads"; "lng_bot_earn_learn_credits_out_about" = "You can withdraw Stars using Fragment, or use Stars to advertise your bot. {link}"; +"lng_self_earn_learn_credits_out_about" = "You can withdraw from 10 Stars using Fragment. {link}"; "lng_bot_earn_out_ph" = "Enter amount to withdraw"; "lng_bot_earn_balance_password_title" = "Two-step verification"; "lng_bot_earn_balance_password_description" = "Please enter your password to collect."; diff --git a/Telegram/SourceFiles/info/bot/earn/info_bot_earn_list.cpp b/Telegram/SourceFiles/info/bot/earn/info_bot_earn_list.cpp index c8674009f0..ee71143124 100644 --- a/Telegram/SourceFiles/info/bot/earn/info_bot_earn_list.cpp +++ b/Telegram/SourceFiles/info/bot/earn/info_bot_earn_list.cpp @@ -128,6 +128,13 @@ void InnerWidget::fill() { return _state.availableBalance; }) ); + auto overallBalanceValue = rpl::single( + data.overallRevenue + ) | rpl::then( + _stateUpdated.events() | rpl::map([=] { + return _state.overallRevenue; + }) + ); auto valueToString = [](StarsAmount v) { return Lang::FormatStarsAmountDecimal(v); }; @@ -211,13 +218,7 @@ void InnerWidget::fill() { Ui::AddSkip(container); Ui::AddSkip(container); addOverview( - rpl::single( - data.overallRevenue - ) | rpl::then( - _stateUpdated.events() | rpl::map([=] { - return _state.overallRevenue; - }) - ), + rpl::duplicate(overallBalanceValue), tr::lng_bot_earn_total); Ui::AddSkip(container); Ui::AddSkip(container); @@ -245,17 +246,20 @@ void InnerWidget::fill() { return _state.buyAdsUrl; }) ), - rpl::duplicate(availableBalanceValue), + peer()->isSelf() + ? rpl::duplicate(overallBalanceValue) + : rpl::duplicate(availableBalanceValue), rpl::duplicate(dateValue), _state.isWithdrawalEnabled, - rpl::duplicate( - availableBalanceValue + (peer()->isSelf() + ? rpl::duplicate(overallBalanceValue) + : rpl::duplicate(availableBalanceValue) ) | rpl::map([=](StarsAmount v) { return v ? ToUsd(v, multiplier, kMinorLength) : QString(); })); container->resizeToWidth(container->width()); } - if (BotStarRef::Join::Allowed(peer())) { + if (BotStarRef::Join::Allowed(peer()) && !peer()->isSelf()) { const auto button = BotStarRef::AddViewListButton( container, tr::lng_credits_summary_earn_title(), @@ -267,7 +271,9 @@ void InnerWidget::fill() { Ui::AddSkip(container); Ui::AddDivider(container); } - fillHistory(); + if (!peer()->isSelf()) { + fillHistory(); + } } void InnerWidget::fillHistory() { diff --git a/Telegram/SourceFiles/settings/settings.style b/Telegram/SourceFiles/settings/settings.style index f28f04e777..6da9e1117f 100644 --- a/Telegram/SourceFiles/settings/settings.style +++ b/Telegram/SourceFiles/settings/settings.style @@ -696,3 +696,12 @@ settingsGiftIconEmoji: IconEmoji { icon: icon{{ "settings/mini_gift", windowFg }}; padding: margins(1px, 2px, 1px, 0px); } + +settingsCreditsButtonBuy: RoundButton(inviteLinkCopy) { + icon: icon {{ "settings/add", activeButtonFg, point(0px, 7px) }}; + iconOver: icon {{ "settings/add", activeButtonFgOver, point(0px, 7px) }}; +} +settingsCreditsButtonStats: RoundButton(inviteLinkCopy) { + icon: icon {{ "info/edit/links_share", activeButtonFg }}; + iconOver: icon {{ "info/edit/links_share", activeButtonFgOver }}; +} diff --git a/Telegram/SourceFiles/settings/settings_common.cpp b/Telegram/SourceFiles/settings/settings_common.cpp index 68bceccf38..d7f6139220 100644 --- a/Telegram/SourceFiles/settings/settings_common.cpp +++ b/Telegram/SourceFiles/settings/settings_common.cpp @@ -123,7 +123,11 @@ not_null AddButtonWithIcon( const style::SettingsButton &st, IconDescriptor &&descriptor) { return container->add( - CreateButtonWithIcon(container, std::move(text), st, std::move(descriptor))); + CreateButtonWithIcon( + container, + std::move(text), + st, + std::move(descriptor))); } void CreateRightLabel( diff --git a/Telegram/SourceFiles/settings/settings_credits.cpp b/Telegram/SourceFiles/settings/settings_credits.cpp index 0e132d82f3..9fd0ed483f 100644 --- a/Telegram/SourceFiles/settings/settings_credits.cpp +++ b/Telegram/SourceFiles/settings/settings_credits.cpp @@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_photo_media.h" #include "data/data_session.h" #include "data/data_user.h" +#include "info/bot/earn/info_bot_earn_widget.h" #include "info/bot/starref/info_bot_starref_common.h" #include "info/bot/starref/info_bot_starref_join_widget.h" #include "info/channel_statistics/boosts/giveaway/boost_badge.h" // InfiniteRadialAnimationWidget. @@ -433,32 +434,74 @@ void Credits::setupContent() { }; const auto state = content->lifetime().make_state(); - const auto button = content->add( - object_ptr( - content, - rpl::conditional( - state->buyStars.loadingValue(), - rpl::single(QString()), - tr::lng_credits_buy_button()), - st::creditsSettingsBigBalanceButton), - st::boxRowPadding); - button->setTextTransform(Ui::RoundButton::TextTransform::NoTransform); - const auto show = _controller->uiShow(); - button->setClickedCallback(state->buyStars.handler(show, paid)); - { - using namespace Info::Statistics; - const auto loadingAnimation = InfiniteRadialAnimationWidget( - button, - button->height() / 2); - AddChildToWidgetCenter(button, loadingAnimation); - loadingAnimation->showOn(state->buyStars.loadingValue()); - } const auto paddings = rect::m::sum::h(st::boxRowPadding); - button->widthValue() | rpl::filter([=] { - return (button->widthNoMargins() != (content->width() - paddings)); - }) | rpl::start_with_next([=] { - button->resizeToWidth(content->width() - paddings); - }, button->lifetime()); + if (!_controller->session().credits().statsEnabled()) { + const auto button = content->add( + object_ptr( + content, + rpl::conditional( + state->buyStars.loadingValue(), + rpl::single(QString()), + tr::lng_credits_buy_button()), + st::creditsSettingsBigBalanceButton), + st::boxRowPadding); + button->setTextTransform(Ui::RoundButton::TextTransform::NoTransform); + const auto show = _controller->uiShow(); + button->setClickedCallback(state->buyStars.handler(show, paid)); + { + using namespace Info::Statistics; + const auto loadingAnimation = InfiniteRadialAnimationWidget( + button, + button->height() / 2); + AddChildToWidgetCenter(button, loadingAnimation); + loadingAnimation->showOn(state->buyStars.loadingValue()); + } + button->widthValue() | rpl::filter([=] { + return button->widthNoMargins() != (content->width() - paddings); + }) | rpl::start_with_next([=] { + button->resizeToWidth(content->width() - paddings); + }, button->lifetime()); + } else { + const auto wrap = content->add( + object_ptr( + content, + st::inviteLinkButton.height), + st::boxRowPadding); + const auto buy = Ui::CreateChild( + wrap, + tr::lng_credits_buy_button_short(), + st::settingsCreditsButtonBuy); + buy->setTextTransform(Ui::RoundButton::TextTransform::NoTransform); + const auto show = _controller->uiShow(); + buy->setClickedCallback(state->buyStars.handler(show, paid)); + { + using namespace Info::Statistics; + const auto loadingAnimation = InfiniteRadialAnimationWidget( + buy, + buy->height() / 2); + AddChildToWidgetCenter(buy, loadingAnimation); + loadingAnimation->showOn(state->buyStars.loadingValue()); + } + const auto stats = Ui::CreateChild( + wrap, + tr::lng_credits_stats_button_short(), + st::settingsCreditsButtonStats); + stats->setTextTransform(Ui::RoundButton::TextTransform::NoTransform); + const auto self = _controller->session().user(); + const auto controller = _controller->parentController(); + stats->setClickedCallback([=] { + controller->showSection(Info::BotEarn::Make(self)); + }); + + wrap->widthValue( + ) | rpl::start_with_next([=](int width) { + const auto buttonWidth = (width - st::inviteLinkButtonsSkip) / 2; + buy->setFullWidth(buttonWidth); + stats->setFullWidth(buttonWidth); + buy->moveToLeft(0, 0, width); + stats->moveToRight(0, 0, width); + }, wrap->lifetime()); + } Ui::AddSkip(content); diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp index dcbe5c3705..d14773c7d3 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp @@ -2789,17 +2789,19 @@ void AddWithdrawalWidget( const auto arrow = Ui::Text::IconEmoji(&st::textMoreIconEmoji); auto about = Ui::CreateLabelWithCustomEmoji( container, - tr::lng_bot_earn_learn_credits_out_about( - lt_link, - tr::lng_channel_earn_about_link( - lt_emoji, - rpl::single(arrow), - Ui::Text::RichLangValue - ) | rpl::map([](TextWithEntities text) { - return Ui::Text::Link( - std::move(text), - tr::lng_bot_earn_balance_about_url(tr::now)); - }), + (peer->isSelf() + ? tr::lng_self_earn_learn_credits_out_about + : tr::lng_bot_earn_learn_credits_out_about)( + lt_link, + tr::lng_channel_earn_about_link( + lt_emoji, + rpl::single(arrow), + Ui::Text::RichLangValue + ) | rpl::map([](TextWithEntities text) { + return Ui::Text::Link( + std::move(text), + tr::lng_bot_earn_balance_about_url(tr::now)); + }), Ui::Text::RichLangValue), Core::TextContext({ .session = session }), st::boxDividerLabel);