From 1e15764bb9fd719c59cb2a0c9df03c719e6a9a30 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 28 Nov 2024 11:39:05 +0400 Subject: [PATCH] Initial starref setup section implementation. --- Telegram/CMakeLists.txt | 2 + Telegram/Resources/art/affiliate_logo.png | Bin 0 -> 79980 bytes Telegram/Resources/qrc/telegram/telegram.qrc | 1 + .../boxes/peers/edit_peer_info_box.cpp | 28 + Telegram/SourceFiles/data/data_changes.h | 31 +- Telegram/SourceFiles/data/data_user.cpp | 14 + Telegram/SourceFiles/data/data_user.h | 12 + .../bot/starref/info_bot_starref_widget.cpp | 681 ++++++++++++++++++ .../bot/starref/info_bot_starref_widget.h | 82 +++ Telegram/SourceFiles/info/info.style | 3 + .../SourceFiles/info/info_content_widget.cpp | 12 +- .../SourceFiles/info/info_content_widget.h | 9 + Telegram/SourceFiles/info/info_controller.cpp | 13 +- Telegram/SourceFiles/info/info_controller.h | 18 + .../SourceFiles/info/info_wrap_widget.cpp | 5 +- .../ui/effects/premium_top_bar.cpp | 4 + Telegram/SourceFiles/ui/menu_icons.style | 2 + 17 files changed, 896 insertions(+), 21 deletions(-) create mode 100644 Telegram/Resources/art/affiliate_logo.png create mode 100644 Telegram/SourceFiles/info/bot/starref/info_bot_starref_widget.cpp create mode 100644 Telegram/SourceFiles/info/bot/starref/info_bot_starref_widget.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 279a526a8..5b86db84b 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -918,6 +918,8 @@ PRIVATE info/bot/earn/info_bot_earn_list.h info/bot/earn/info_bot_earn_widget.cpp info/bot/earn/info_bot_earn_widget.h + info/bot/starref/info_bot_starref_widget.cpp + info/bot/starref/info_bot_starref_widget.h info/channel_statistics/boosts/create_giveaway_box.cpp info/channel_statistics/boosts/create_giveaway_box.h info/channel_statistics/boosts/giveaway/giveaway_list_controllers.cpp diff --git a/Telegram/Resources/art/affiliate_logo.png b/Telegram/Resources/art/affiliate_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f9b5087d556480526a3fab1823e00ccede4469 GIT binary patch literal 79980 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�FLUhZgqxbY`bCLkB9E{4(?2kVE>~nNi zt4Tuu-Hjla^%5HOc?}>xJ?88Er@(RsP=iwjCILWZcX1>6jRSR$2TQV3Yz<;&H<2S84BKQBy+An*(w_I_jH(iQ*x9oKHtl8{Z7k6^sz2!XtfX)F6CxJ)5o?!l@ z1miUyi^}URrPe#~aOwFjy&mw&K`Os^ApY2am*~T@GqfdRGIwiMbJpk40Xe1>ezT(A zw=JAY&-fX@(yS1$tQ5B0zRxrCtWaGKzm{iyK`o$`{#_)^BLd+10A2rY;Bf!<0>JQ? zdujbPd~5yIp%q&=zgcmn$D5@$rcO3xgb-p)R-mB|_XDZz;aQHA44j+kbI&vhs`RJ>3U8jRO0Knny z@Z4Z-iVFW;t$~q#kb=J?Q)7SGU$bj)vf~_{8?>y>Uxd8(_lkf5xjw%&+-E8tJkEYE zKq!`6WA$3>TfIK{;nW5^G_}EXFYeyH_shEu00Cfr+F||_N{u;JY|NqCm~*Yg8A7KO zERGW}I8LaKAg&FgJTMGbAEDO7214P7>%9O_A9P2j*1Jch z*1LzMHe&zyD)+8CIDfIc`SPv=z<#CM0UrMAgpR+IMqgY2KKKg}h9<(v&&ATOEH4wL zr%^a{GP-Q~1a?iIq{~j9qD#76s%Na}?)>*!VW+Eoc5D4|8XWS>3{XIrU+-fU3cYqG zOtjy0ST;(q*8wON(HtFjFN{y(*@@Ne$+1=L+3`tqD{t{rl`oceW_iy5AOM_r#o_yZ znNE+_T}p);KN)r3W|iL6B}ss}S;FblG(0~?Tju9!../../art/bg_thumbnail.png ../../art/bg_initial.jpg ../../art/business_logo.png + ../../art/affiliate_logo.png ../../art/logo_256.png ../../art/logo_256_no_margin.png ../../art/themeimage.jpg diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp index dbfcead1a..de763fb3d 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp @@ -46,6 +46,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_user.h" #include "history/admin_log/history_admin_log_section.h" #include "info/bot/earn/info_bot_earn_widget.h" +#include "info/bot/starref/info_bot_starref_widget.h" #include "info/channel_statistics/boosts/info_boosts_widget.h" #include "info/channel_statistics/earn/earn_format.h" #include "info/channel_statistics/earn/earn_icons.h" @@ -358,6 +359,7 @@ private: void fillBotUsernamesButton(); void fillBotCurrencyButton(); void fillBotCreditsButton(); + void fillBotAffiliateProgram(); void fillBotEditIntroButton(); void fillBotEditCommandsButton(); void fillBotEditSettingsButton(); @@ -1181,6 +1183,7 @@ void Controller::fillManageSection() { fillBotUsernamesButton(); fillBotCurrencyButton(); fillBotCreditsButton(); + fillBotAffiliateProgram(); fillBotEditIntroButton(); fillBotEditCommandsButton(); fillBotEditSettingsButton(); @@ -1711,6 +1714,31 @@ void Controller::fillBotCreditsButton() { } +void Controller::fillBotAffiliateProgram() { + Expects(_isBot); + + const auto user = _peer->asUser(); + auto label = user->session().changes().peerFlagsValue( + user, + Data::PeerUpdate::Flag::StarRefProgram + ) | rpl::map([=] { + const auto commission = user->botInfo + ? user->botInfo->starRefProgram.commission + : 0; + return commission + ? u"%1%"_q.arg(commission) + : tr::lng_manage_peer_bot_star_ref_off(tr::now); + }); + AddButtonWithCount( + _controls.buttonsLayout, + tr::lng_manage_peer_bot_star_ref(), + std::move(label), + [controller = _navigation->parentController(), user] { + controller->showSection(Info::BotStarRef::Make(user)); + }, + { &st::menuIconSharing }); +} + void Controller::fillBotEditIntroButton() { Expects(_isBot); diff --git a/Telegram/SourceFiles/data/data_changes.h b/Telegram/SourceFiles/data/data_changes.h index a2c45bb2a..66c0fb9b3 100644 --- a/Telegram/SourceFiles/data/data_changes.h +++ b/Telegram/SourceFiles/data/data_changes.h @@ -92,27 +92,28 @@ struct PeerUpdate { BusinessDetails = (1ULL << 30), Birthday = (1ULL << 31), PersonalChannel = (1ULL << 32), + StarRefProgram = (1ULL << 33), // For chats and channels - InviteLinks = (1ULL << 33), - Members = (1ULL << 34), - Admins = (1ULL << 35), - BannedUsers = (1ULL << 36), - Rights = (1ULL << 37), - PendingRequests = (1ULL << 38), - Reactions = (1ULL << 39), + InviteLinks = (1ULL << 34), + Members = (1ULL << 35), + Admins = (1ULL << 36), + BannedUsers = (1ULL << 37), + Rights = (1ULL << 38), + PendingRequests = (1ULL << 39), + Reactions = (1ULL << 40), // For channels - ChannelAmIn = (1ULL << 40), - StickersSet = (1ULL << 41), - EmojiSet = (1ULL << 42), - ChannelLinkedChat = (1ULL << 43), - ChannelLocation = (1ULL << 44), - Slowmode = (1ULL << 45), - GroupCall = (1ULL << 46), + ChannelAmIn = (1ULL << 41), + StickersSet = (1ULL << 42), + EmojiSet = (1ULL << 43), + ChannelLinkedChat = (1ULL << 44), + ChannelLocation = (1ULL << 45), + Slowmode = (1ULL << 46), + GroupCall = (1ULL << 47), // For iteration - LastUsedBit = (1ULL << 46), + LastUsedBit = (1ULL << 47), }; using Flags = base::flags; friend inline constexpr auto is_flag_type(Flag) { return true; } diff --git a/Telegram/SourceFiles/data/data_user.cpp b/Telegram/SourceFiles/data/data_user.cpp index c8e5466b9..e73f5fecb 100644 --- a/Telegram/SourceFiles/data/data_user.cpp +++ b/Telegram/SourceFiles/data/data_user.cpp @@ -600,6 +600,20 @@ void ApplyUserUpdate(not_null user, const MTPDuserFull &update) { } if (const auto info = user->botInfo.get()) { info->canManageEmojiStatus = update.is_bot_can_manage_emoji_status(); + auto starRefProgram = StarRefProgram(); + if (const auto program = update.vstarref_program()) { + const auto &data = program->data(); + starRefProgram.commission = data.vcommission_permille().v; + starRefProgram.durationMonths + = data.vduration_months().value_or_empty(); + starRefProgram.endDate = data.vend_date().value_or_empty(); + } + if (info->starRefProgram != starRefProgram) { + info->starRefProgram = starRefProgram; + user->session().changes().peerUpdated( + user, + Data::PeerUpdate::Flag::StarRefProgram); + } } if (const auto pinned = update.vpinned_msg_id()) { SetTopPinnedMessageId(user, pinned->v); diff --git a/Telegram/SourceFiles/data/data_user.h b/Telegram/SourceFiles/data/data_user.h index 63f03549a..f8d7ba48a 100644 --- a/Telegram/SourceFiles/data/data_user.h +++ b/Telegram/SourceFiles/data/data_user.h @@ -19,6 +19,16 @@ struct BotCommand; struct BusinessDetails; } // namespace Data +struct StarRefProgram { + TimeId endDate = 0; + ushort commission = 0; + uint8 durationMonths = 0; + + friend inline constexpr bool operator==( + StarRefProgram, + StarRefProgram) = default; +}; + struct BotInfo { BotInfo(); @@ -44,6 +54,8 @@ struct BotInfo { ChatAdminRights groupAdminRights; ChatAdminRights channelAdminRights; + StarRefProgram starRefProgram; + int version = 0; int descriptionVersion = 0; int activeUsers = 0; diff --git a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_widget.cpp b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_widget.cpp new file mode 100644 index 000000000..00e0e7d5c --- /dev/null +++ b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_widget.cpp @@ -0,0 +1,681 @@ +/* +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 "info/bot/starref/info_bot_starref_widget.h" + +#include "apiwrap.h" +#include "base/timer_rpl.h" +#include "base/unixtime.h" +#include "core/click_handler_types.h" +#include "data/data_user.h" +#include "info/profile/info_profile_icon.h" +#include "info/info_controller.h" +#include "info/info_memento.h" +#include "lang/lang_keys.h" +#include "main/main_session.h" +#include "settings/settings_common.h" +#include "ui/effects/premium_top_bar.h" +#include "ui/text/text_utilities.h" +#include "ui/widgets/buttons.h" +#include "ui/widgets/continuous_sliders.h" +#include "ui/widgets/labels.h" +#include "ui/wrap/fade_wrap.h" +#include "ui/wrap/vertical_layout.h" +#include "ui/ui_utility.h" +#include "ui/vertical_list.h" +#include "styles/style_info.h" +#include "styles/style_layers.h" +#include "styles/style_menu_icons.h" +#include "styles/style_premium.h" +#include "styles/style_settings.h" + +namespace Info::BotStarRef { +namespace { + +constexpr auto kDurationForeverValue = 999; +constexpr auto kCommissionDefault = 20; +constexpr auto kDurationDefault = 12; + +} // namespace + +struct State { + not_null user; + StarRefProgram program; + bool exists = false; +}; + +class InnerWidget final : public Ui::RpWidget { +public: + InnerWidget(QWidget *parent, not_null controller); + + [[nodiscard]] not_null peer() const; + [[nodiscard]] not_null state(); + + void showFinished(); + void setInnerFocus(); + + void saveState(not_null memento); + void restoreState(not_null memento); + +private: + void prepare(); + void setupInfo(); + void setupCommission(); + void setupDuration(); + void setupViewExisting(); + void setupEnd(); + + [[nodiscard]] object_ptr infoRow( + rpl::producer title, + rpl::producer text, + not_null icon); + + const not_null _controller; + State _state; + const not_null _container; + +}; + +[[nodiscard]] int ValueForCommission(const State &state) { + return state.program.commission + ? state.program.commission + : kCommissionDefault; +} + +[[nodiscard]] int ValueForDurationMonths(const State &state) { + return state.program.durationMonths + ? state.program.durationMonths + : state.exists + ? kDurationForeverValue + : kDurationDefault; +} + +[[nodiscard]] State StateForPeer(not_null peer) { + const auto user = peer->asUser(); + const auto program = user->botInfo->starRefProgram; + return State{ + .user = user, + .program = program, + .exists = (program.commission > 0), + }; +} + +InnerWidget::InnerWidget(QWidget *parent, not_null controller) +: RpWidget(parent) +, _controller(controller) +, _state(StateForPeer(_controller->key().starrefPeer())) +, _container(Ui::CreateChild(this)) { + prepare(); +} + +not_null InnerWidget::state() { + return &_state; +} + +void InnerWidget::prepare() { + Ui::ResizeFitChild(this, _container); + + setupInfo(); + Ui::AddSkip(_container); + Ui::AddDivider(_container); + setupCommission(); + setupDuration(); + Ui::AddSkip(_container); + setupViewExisting(); + Ui::AddSkip(_container); + Ui::AddDivider(_container); + Ui::AddSkip(_container); + setupEnd(); +} + +void InnerWidget::setupInfo() { + AddSkip(_container, st::defaultVerticalListSkip * 2); + + _container->add(infoRow( + tr::lng_star_ref_share_title(), + tr::lng_star_ref_share_about(), + &st::menuIconPremium)); + + _container->add(infoRow( + tr::lng_star_ref_launch_title(), + tr::lng_star_ref_launch_about(), + &st::menuIconChannel)); + + _container->add(infoRow( + tr::lng_star_ref_let_title(), + tr::lng_star_ref_let_about(), + &st::menuIconStarRefLink)); +} + +void InnerWidget::setupCommission() { + Ui::AddSkip(_container); + Ui::AddSubsectionTitle(_container, tr::lng_star_ref_commission_title()); + + auto values = std::vector(); + for (auto i = 1; i != 91; ++i) { + values.push_back(i); + } + const auto valuesCount = int(values.size()); + + auto sliderWithLabel = ::Settings::MakeSliderWithLabel( + _container, + st::settingsScale, + st::settingsScaleLabel, + st::normalFont->spacew * 2, + st::settingsScaleLabel.style.font->width("90%"), + true); + _container->add( + std::move(sliderWithLabel.widget), + st::settingsBigScalePadding); + const auto slider = sliderWithLabel.slider; + const auto label = sliderWithLabel.label; + + const auto updateLabel = [=](int value) { + const auto labelText = QString::number(value) + '%'; + label->setText(labelText); + }; + const auto commission = ValueForCommission(_state); + const auto setCommission = [=](int value) { + _state.program.commission = value; + updateLabel(value); + }; + updateLabel(commission); + + slider->setPseudoDiscrete( + valuesCount, + [=](int index) { return values[index]; }, + commission, + setCommission, + setCommission); + + Ui::AddSkip(_container); + Ui::AddDividerText(_container, tr::lng_star_ref_commission_about()); +} + +void InnerWidget::setupDuration() { + Ui::AddSkip(_container); + Ui::AddSubsectionTitle(_container, tr::lng_star_ref_duration_title()); + + auto values = std::vector{ 1, 3, 6, 12, 24, 36, 999 }; + const auto valuesCount = int(values.size()); + + auto sliderWithLabel = ::Settings::MakeSliderWithLabel( + _container, + st::settingsScale, + st::settingsScaleLabel, + st::normalFont->spacew * 2, + st::settingsScaleLabel.style.font->width("3y"), + true); + _container->add( + std::move(sliderWithLabel.widget), + st::settingsBigScalePadding); + const auto slider = sliderWithLabel.slider; + const auto label = sliderWithLabel.label; + + const auto updateLabel = [=](int value) { + const auto labelText = (value < 12) + ? (QString::number(value) + 'm') + : (value < 999) + ? (QString::number(value / 12) + 'y') + : u"inf"_q; + label->setText(labelText); + }; + const auto durationMonths = ValueForDurationMonths(_state); + const auto setDurationMonths = [=](int value) { + _state.program.durationMonths = (value == kDurationForeverValue) + ? 0 + : value; + updateLabel(durationMonths); + }; + updateLabel(durationMonths); + + slider->setPseudoDiscrete( + valuesCount, + [=](int index) { return values[index]; }, + durationMonths, + setDurationMonths, + setDurationMonths); + + Ui::AddSkip(_container); + Ui::AddDividerText(_container, tr::lng_star_ref_duration_about()); +} + +void InnerWidget::setupViewExisting() { + const auto &stLabel = st::defaultFlatLabel; + const auto iconSize = st::settingsPremiumIconDouble.size(); + const auto &titlePadding = st::settingsPremiumRowTitlePadding; + const auto &descriptionPadding = st::settingsPremiumRowAboutPadding; + + const auto content = _container; + const auto labelAscent = stLabel.style.font->ascent; + const auto button = Ui::CreateChild( + content.get(), + rpl::single(QString())); + + const auto label = content->add( + object_ptr( + content, + tr::lng_star_ref_existing_title() | Ui::Text::ToBold(), + stLabel), + titlePadding); + label->setAttribute(Qt::WA_TransparentForMouseEvents); + const auto description = content->add( + object_ptr( + content, + tr::lng_star_ref_existing_about(), + st::boxDividerLabel), + descriptionPadding); + description->setAttribute(Qt::WA_TransparentForMouseEvents); + + const auto dummy = Ui::CreateChild(content.get()); + dummy->setAttribute(Qt::WA_TransparentForMouseEvents); + + content->sizeValue( + ) | rpl::start_with_next([=](const QSize &s) { + dummy->resize(s.width(), iconSize.height()); + }, dummy->lifetime()); + + label->geometryValue( + ) | rpl::start_with_next([=](const QRect &r) { + dummy->moveToLeft(0, r.y() + (r.height() - labelAscent)); + }, dummy->lifetime()); + + ::Settings::AddButtonIcon(dummy, st::settingsButton, { + .icon = &st::settingsPremiumIconStar, + .backgroundBrush = st::premiumIconBg3, + }); + + rpl::combine( + content->widthValue(), + label->heightValue(), + description->heightValue() + ) | rpl::start_with_next([=, + topPadding = titlePadding, + bottomPadding = descriptionPadding]( + int width, + int topHeight, + int bottomHeight) { + button->resize( + width, + topPadding.top() + + topHeight + + topPadding.bottom() + + bottomPadding.top() + + bottomHeight + + bottomPadding.bottom()); + }, button->lifetime()); + label->topValue( + ) | rpl::start_with_next([=, padding = titlePadding.top()](int top) { + button->moveToLeft(0, top - padding); + }, button->lifetime()); + const auto arrow = Ui::CreateChild( + button, + st::backButton); + arrow->setIconOverride( + &st::settingsPremiumArrow, + &st::settingsPremiumArrowOver); + arrow->setAttribute(Qt::WA_TransparentForMouseEvents); + button->sizeValue( + ) | rpl::start_with_next([=](const QSize &s) { + const auto &point = st::settingsPremiumArrowShift; + arrow->moveToRight( + -point.x(), + point.y() + (s.height() - arrow->height()) / 2); + }, arrow->lifetime()); + + button->setClickedCallback([=] { + _controller->showToast(u"List or smth.."_q); + }); +} + +void InnerWidget::setupEnd() { + if (!_state.exists) { + return; + } + const auto end = _container->add(object_ptr( + _container, + tr::lng_star_ref_end(), + st::settingsAttentionButton)); + end->setClickedCallback([=] { + using Flag = MTPbots_UpdateStarRefProgram::Flag; + const auto user = _state.user; + const auto weak = Ui::MakeWeak(this); + user->session().api().request(MTPbots_UpdateStarRefProgram( + MTP_flags(0), + user->inputUser, + MTP_int(0), + MTP_int(0) + )).done([=] { + user->botInfo->starRefProgram.commission = 0; + user->botInfo->starRefProgram.durationMonths = 0; + user->updateFullForced(); + if (weak) { + _controller->showToast("Removed!"); + _controller->showBackFromStack(); + } + }).fail(crl::guard(weak, [=] { + _controller->showToast("Remove failed!"); + })).send(); + }); +} + +object_ptr InnerWidget::infoRow( + rpl::producer title, + rpl::producer text, + not_null icon) { + auto result = object_ptr(_container); + const auto raw = result.data(); + + raw->add( + object_ptr( + raw, + std::move(title) | Ui::Text::ToBold(), + st::defaultFlatLabel), + st::settingsPremiumRowTitlePadding); + raw->add( + object_ptr( + raw, + std::move(text), + st::boxDividerLabel), + st::settingsPremiumRowAboutPadding); + object_ptr( + raw, + *icon, + st::starrefInfoIconPosition); + + return result; +} + +not_null InnerWidget::peer() const { + return _controller->key().starrefPeer(); +} + +void InnerWidget::showFinished() { + +} + +void InnerWidget::setInnerFocus() { + setFocus(); +} + +void InnerWidget::saveState(not_null memento) { + +} + +void InnerWidget::restoreState(not_null memento) { + +} + +Memento::Memento(not_null controller) +: ContentMemento(Tag(controller->starrefPeer())) { +} + +Memento::Memento(not_null peer) +: ContentMemento(Tag(peer)) { +} + +Memento::~Memento() = default; + +Section Memento::section() const { + return Section(Section::Type::BotStarRef); +} + +object_ptr Memento::createWidget( + QWidget *parent, + not_null controller, + const QRect &geometry) { + auto result = object_ptr(parent, controller); + result->setInternalState(geometry, this); + return result; +} + +Widget::Widget( + QWidget *parent, + not_null controller) +: ContentWidget(parent, controller) +, _inner(setInnerWidget(object_ptr(this, controller))) +, _state(_inner->state()) { + _top = setupTop(); + _bottom = setupBottom(); +} + +not_null Widget::peer() const { + return _inner->peer(); +} + +bool Widget::showInternal(not_null memento) { + return (memento->starrefPeer() == peer()); +} + +rpl::producer Widget::title() { + return tr::lng_star_ref_title(); +} + +void Widget::setInternalState( + const QRect &geometry, + not_null memento) { + setGeometry(geometry); + Ui::SendPendingMoveResizeEvents(this); + restoreState(memento); +} + +rpl::producer Widget::desiredShadowVisibility() const { + return rpl::single(true); +} + +void Widget::showFinished() { + _inner->showFinished(); +} + +void Widget::setInnerFocus() { + _inner->setInnerFocus(); +} + +void Widget::enableBackButton() { + _backEnabled = true; +} + +std::shared_ptr Widget::doCreateMemento() { + auto result = std::make_shared(controller()); + saveState(result.get()); + return result; +} + +void Widget::saveState(not_null memento) { + memento->setScrollTop(scrollTopSave()); + _inner->saveState(memento); +} + +void Widget::restoreState(not_null memento) { + _inner->restoreState(memento); + scrollTopRestore(memento->scrollTop()); +} + +std::unique_ptr Widget::setupTop() { + auto title = tr::lng_star_ref_title(); + auto about = tr::lng_star_ref_about() | Ui::Text::ToWithEntities(); + + const auto controller = this->controller(); + const auto weak = base::make_weak(controller->parentController()); + const auto clickContextOther = [=] { + return QVariant::fromValue(ClickHandlerContext{ + .sessionWindow = weak, + .botStartAutoSubmit = true, + }); + }; + auto result = std::make_unique( + this, + st::userPremiumCover, + Ui::Premium::TopBarDescriptor{ + .clickContextOther = clickContextOther, + .logo = u"affiliate"_q, + .title = std::move(title), + .about = std::move(about), + .light = true, + }); + const auto raw = result.get(); + + controller->wrapValue( + ) | rpl::start_with_next([=](Info::Wrap wrap) { + raw->setRoundEdges(wrap == Info::Wrap::Layer); + }, raw->lifetime()); + + const auto calculateMaximumHeight = [=] { + return st::settingsPremiumTopHeight; + }; + + raw->setMaximumHeight(st::settingsPremiumTopHeight); + raw->setMinimumHeight(st::settingsPremiumTopHeight); + + raw->resize(width(), raw->maximumHeight()); + + setPaintPadding({ 0, st::settingsPremiumTopHeight, 0, 0 }); + + controller->wrapValue( + ) | rpl::start_with_next([=](Info::Wrap wrap) { + const auto isLayer = (wrap == Info::Wrap::Layer); + _back = base::make_unique_q>( + raw, + object_ptr( + raw, + (isLayer + ? st::infoLayerTopBar.back + : st::infoTopBar.back)), + st::infoTopBarScale); + _back->setDuration(0); + _back->toggleOn(isLayer + ? _backEnabled.value() | rpl::type_erased() + : rpl::single(true)); + _back->entity()->addClickHandler([=] { + controller->showBackFromStack(); + }); + _back->toggledValue( + ) | rpl::start_with_next([=](bool toggled) { + const auto &st = isLayer ? st::infoLayerTopBar : st::infoTopBar; + raw->setTextPosition( + toggled ? st.back.width : st.titlePosition.x(), + st.titlePosition.y()); + }, _back->lifetime()); + + if (!isLayer) { + _close = nullptr; + } else { + _close = base::make_unique_q( + raw, + st::settingsPremiumTopBarClose); + _close->addClickHandler([=] { + controller->parentController()->hideLayer(); + controller->parentController()->hideSpecialLayer(); + }); + raw->widthValue( + ) | rpl::start_with_next([=] { + _close->moveToRight(0, 0); + }, _close->lifetime()); + } + }, raw->lifetime()); + + raw->move(0, 0); + widthValue() | rpl::start_with_next([=](int width) { + raw->resizeToWidth(width); + setScrollTopSkip(raw->height()); + }, raw->lifetime()); + + return result; +} + +std::unique_ptr Widget::setupBottom() { + auto result = std::make_unique(this); + const auto raw = result.get(); + + auto text = base::timer_each(100) | rpl::map([=] { + const auto till = _state->user->botInfo->starRefProgram.endDate; + const auto now = base::unixtime::now(); + const auto left = (till > now) ? (till - now) : 0; + return left + ? tr::lng_star_ref_start_disabled( + tr::now, + lt_time, + QString::number(left)) + : _state->exists + ? tr::lng_star_ref_update(tr::now) + : tr::lng_star_ref_start(tr::now); + }); + const auto save = raw->add( + object_ptr( + raw, + rpl::duplicate(text), + st::defaultActiveButton), + st::starrefButtonMargin); + std::move(text) | rpl::start_with_next([=] { + save->resizeToWidth(raw->width() + - st::starrefButtonMargin.left() + - st::starrefButtonMargin.right()); + }, save->lifetime()); + save->setTextTransform(Ui::RoundButton::TextTransform::NoTransform); + const auto &margins = st::defaultBoxDividerLabelPadding; + raw->add( + object_ptr( + raw, + (_state->exists + ? tr::lng_star_ref_update_info + : tr::lng_star_ref_start_info)( + lt_terms, + tr::lng_star_ref_button_link() | Ui::Text::ToLink(), + Ui::Text::WithEntities), + st::boxDividerLabel), + QMargins(margins.left(), 0, margins.right(), 0)); + save->setClickedCallback([=] { + using Flag = MTPbots_UpdateStarRefProgram::Flag; + const auto weak = Ui::MakeWeak(this); + const auto user = _state->user; + auto program = StarRefProgram{ + .commission = _state->program.commission, + .durationMonths = _state->program.durationMonths, + }; + user->session().api().request(MTPbots_UpdateStarRefProgram( + MTP_flags((program.commission > 0 && program.durationMonths > 0) + ? Flag::f_duration_months + : Flag()), + user->inputUser, + MTP_int(program.commission), + MTP_int(program.durationMonths) + )).done([=] { + user->botInfo->starRefProgram.commission = program.commission; + user->botInfo->starRefProgram.durationMonths + = program.durationMonths; + if (weak) { + controller()->showBackFromStack(); + } + }).fail(crl::guard(weak, [=] { + controller()->showToast("Failed!"); + })).send(); + }); + + widthValue() | rpl::start_with_next([=](int width) { + raw->resizeToWidth(width); + }, raw->lifetime()); + + rpl::combine( + raw->heightValue(), + heightValue() + ) | rpl::start_with_next([=](int height, int fullHeight) { + setScrollBottomSkip(height); + raw->move(0, fullHeight - height); + }, raw->lifetime()); + + return result; +} + +std::shared_ptr Make(not_null peer) { + return std::make_shared( + std::vector>( + 1, + std::make_shared(peer))); +} + +} // namespace Info::BotStarRef + diff --git a/Telegram/SourceFiles/info/bot/starref/info_bot_starref_widget.h b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_widget.h new file mode 100644 index 000000000..bbcd4ae7c --- /dev/null +++ b/Telegram/SourceFiles/info/bot/starref/info_bot_starref_widget.h @@ -0,0 +1,82 @@ +/* +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 "info/info_content_widget.h" + +namespace Ui::Premium { +class TopBarAbstract; +} // namespace Ui::Premium + +namespace Ui { +template +class FadeWrap; +class IconButton; +} // namespace Ui + +namespace Info::BotStarRef { + +struct State; +class InnerWidget; + +class Memento final : public ContentMemento { +public: + Memento(not_null controller); + Memento(not_null peer); + ~Memento(); + + object_ptr createWidget( + QWidget *parent, + not_null controller, + const QRect &geometry) override; + + Section section() const override; + +}; + +class Widget final : public ContentWidget { +public: + Widget(QWidget *parent, not_null controller); + + bool showInternal(not_null memento) override; + rpl::producer title() override; + rpl::producer desiredShadowVisibility() const override; + void showFinished() override; + void setInnerFocus() override; + void enableBackButton() override; + + [[nodiscard]] not_null peer() const; + + void setInternalState( + const QRect &geometry, + not_null memento); + +private: + void saveState(not_null memento); + void restoreState(not_null memento); + + [[nodiscard]] std::unique_ptr setupTop(); + [[nodiscard]] std::unique_ptr setupBottom(); + + std::shared_ptr doCreateMemento() override; + + const not_null _inner; + const not_null _state; + + std::unique_ptr _top; + base::unique_qptr> _back; + base::unique_qptr _close; + rpl::variable _backEnabled; + + std::unique_ptr _bottom; + +}; + +[[nodiscard]] std::shared_ptr Make(not_null peer); + +} // namespace Info::BotStarRef diff --git a/Telegram/SourceFiles/info/info.style b/Telegram/SourceFiles/info/info.style index 05796c024..fe90ea190 100644 --- a/Telegram/SourceFiles/info/info.style +++ b/Telegram/SourceFiles/info/info.style @@ -1144,3 +1144,6 @@ infoHoursOuter: RoundButton(defaultActiveButton) { } infoHoursOuterMargin: margins(8px, 4px, 8px, 4px); infoHoursDaySkip: 6px; + +starrefInfoIconPosition: point(16px, 8px); +starrefButtonMargin: margins(12px, 12px, 12px, 12px); diff --git a/Telegram/SourceFiles/info/info_content_widget.cpp b/Telegram/SourceFiles/info/info_content_widget.cpp index 15583240a..b33417bab 100644 --- a/Telegram/SourceFiles/info/info_content_widget.cpp +++ b/Telegram/SourceFiles/info/info_content_widget.cpp @@ -374,10 +374,12 @@ Key ContentMemento::key() const { return Key(poll, pollContextId()); } else if (const auto self = settingsSelf()) { return Settings::Tag{ self }; - } else if (const auto peer = storiesPeer()) { - return Stories::Tag{ peer, storiesTab() }; - } else if (const auto peer = statisticsTag().peer) { + } else if (const auto stories = storiesPeer()) { + return Stories::Tag{ stories, storiesTab() }; + } else if (statisticsTag().peer) { return statisticsTag(); + } else if (const auto starref = starrefPeer()) { + return BotStarRef::Tag(starref); } else if (const auto who = reactionsWhoReadIds()) { return Key(who, _reactionsSelected, _pollReactionsContextId); } else { @@ -420,6 +422,10 @@ ContentMemento::ContentMemento(Statistics::Tag statistics) : _statisticsTag(statistics) { } +ContentMemento::ContentMemento(BotStarRef::Tag starref) +: _starrefPeer(starref.peer) { +} + ContentMemento::ContentMemento( std::shared_ptr whoReadIds, FullMsgId contextId, diff --git a/Telegram/SourceFiles/info/info_content_widget.h b/Telegram/SourceFiles/info/info_content_widget.h index f0c46da5a..12ac85074 100644 --- a/Telegram/SourceFiles/info/info_content_widget.h +++ b/Telegram/SourceFiles/info/info_content_widget.h @@ -52,6 +52,10 @@ namespace Info::Statistics { struct Tag; } // namespace Info::Statistics +namespace Info::BotStarRef { +struct Tag; +} // namespace Info::BotStarRef + namespace Info { class ContentMemento; @@ -191,6 +195,7 @@ public: explicit ContentMemento(Downloads::Tag downloads); explicit ContentMemento(Stories::Tag stories); explicit ContentMemento(Statistics::Tag statistics); + explicit ContentMemento(BotStarRef::Tag starref); ContentMemento(not_null poll, FullMsgId contextId) : _poll(poll) , _pollReactionsContextId(contextId) { @@ -226,6 +231,9 @@ public: Statistics::Tag statisticsTag() const { return _statisticsTag; } + PeerData *starrefPeer() const { + return _starrefPeer; + } PollData *poll() const { return _poll; } @@ -280,6 +288,7 @@ private: PeerData * const _storiesPeer = nullptr; Stories::Tab _storiesTab = {}; Statistics::Tag _statisticsTag; + PeerData * const _starrefPeer = nullptr; PollData * const _poll = nullptr; std::shared_ptr _reactionsWhoReadIds; Data::ReactionId _reactionsSelected; diff --git a/Telegram/SourceFiles/info/info_controller.cpp b/Telegram/SourceFiles/info/info_controller.cpp index 388f870fe..38ef2852f 100644 --- a/Telegram/SourceFiles/info/info_controller.cpp +++ b/Telegram/SourceFiles/info/info_controller.cpp @@ -46,6 +46,9 @@ Key::Key(Stories::Tag stories) : _value(stories) { Key::Key(Statistics::Tag statistics) : _value(statistics) { } +Key::Key(BotStarRef::Tag starref) : _value(starref) { +} + Key::Key(not_null poll, FullMsgId contextId) : _value(PollKey{ poll, contextId }) { } @@ -106,6 +109,13 @@ Statistics::Tag Key::statisticsTag() const { return Statistics::Tag(); } +PeerData *Key::starrefPeer() const { + if (const auto tag = std::get_if(&_value)) { + return tag->peer; + } + return nullptr; +} + PollData *Key::poll() const { if (const auto data = std::get_if(&_value)) { return data->poll; @@ -319,7 +329,8 @@ bool Controller::validateMementoPeer( && memento->migratedPeerId() == migratedPeerId() && memento->settingsSelf() == settingsSelf() && memento->storiesPeer() == storiesPeer() - && memento->statisticsTag().peer == statisticsTag().peer; + && memento->statisticsTag().peer == statisticsTag().peer + && memento->starrefPeer() == starrefPeer(); } void Controller::setSection(not_null memento) { diff --git a/Telegram/SourceFiles/info/info_controller.h b/Telegram/SourceFiles/info/info_controller.h index 4fad8ca05..39f2d2bb1 100644 --- a/Telegram/SourceFiles/info/info_controller.h +++ b/Telegram/SourceFiles/info/info_controller.h @@ -61,6 +61,17 @@ struct Tag { } // namespace Info::Stories +namespace Info::BotStarRef { + +struct Tag { + explicit Tag(not_null peer) : peer(peer) { + } + + not_null peer; +}; + +} // namespace Info::BotStarRef + namespace Info { class Key { @@ -71,6 +82,7 @@ public: Key(Downloads::Tag downloads); Key(Stories::Tag stories); Key(Statistics::Tag statistics); + Key(BotStarRef::Tag starref); Key(not_null poll, FullMsgId contextId); Key( std::shared_ptr whoReadIds, @@ -84,6 +96,7 @@ public: PeerData *storiesPeer() const; Stories::Tab storiesTab() const; Statistics::Tag statisticsTag() const; + PeerData *starrefPeer() const; PollData *poll() const; FullMsgId pollContextId() const; std::shared_ptr reactionsWhoReadIds() const; @@ -107,6 +120,7 @@ private: Downloads::Tag, Stories::Tag, Statistics::Tag, + BotStarRef::Tag, PollKey, ReactionsKey> _value; @@ -134,6 +148,7 @@ public: Stories, PollResults, Statistics, + BotStarRef, Boosts, ChannelEarn, BotEarn, @@ -202,6 +217,9 @@ public: [[nodiscard]] Statistics::Tag statisticsTag() const { return key().statisticsTag(); } + [[nodiscard]] PeerData *starrefPeer() const { + return key().starrefPeer(); + } [[nodiscard]] PollData *poll() const; [[nodiscard]] FullMsgId pollContextId() const { return key().pollContextId(); diff --git a/Telegram/SourceFiles/info/info_wrap_widget.cpp b/Telegram/SourceFiles/info/info_wrap_widget.cpp index a638537b1..4bd0dc12b 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.cpp +++ b/Telegram/SourceFiles/info/info_wrap_widget.cpp @@ -64,8 +64,9 @@ const style::InfoTopBar &TopBarStyle(Wrap wrap) { [[nodiscard]] bool HasCustomTopBar(not_null controller) { const auto section = controller->section(); - return (section.type() == Section::Type::Settings) - && section.settingsType()->hasCustomTopBar(); + return (section.type() == Section::Type::BotStarRef) + || ((section.type() == Section::Type::Settings) + && section.settingsType()->hasCustomTopBar()); } [[nodiscard]] Fn SelectedTitleForMedia( diff --git a/Telegram/SourceFiles/ui/effects/premium_top_bar.cpp b/Telegram/SourceFiles/ui/effects/premium_top_bar.cpp index e2b619273..e0bee03ee 100644 --- a/Telegram/SourceFiles/ui/effects/premium_top_bar.cpp +++ b/Telegram/SourceFiles/ui/effects/premium_top_bar.cpp @@ -138,6 +138,10 @@ TopBar::TopBar( _dollar = ScaleTo(QImage(u":/gui/art/business_logo.png"_q)); _ministars.setColorOverride( QGradientStops{{ 0, st::premiumButtonFg->c }}); + } else if (_logo == u"affiliate"_q) { + _dollar = ScaleTo(QImage(u":/gui/art/affiliate_logo.png"_q)); + _ministars.setColorOverride( + QGradientStops{{ 0, st::premiumButtonFg->c }}); } else if (!_light && !TopBarAbstract::isDark()) { _star.load(Svg()); _ministars.setColorOverride( diff --git a/Telegram/SourceFiles/ui/menu_icons.style b/Telegram/SourceFiles/ui/menu_icons.style index c81bedebb..7bb7b5302 100644 --- a/Telegram/SourceFiles/ui/menu_icons.style +++ b/Telegram/SourceFiles/ui/menu_icons.style @@ -42,6 +42,7 @@ menuIconRemove: icon {{ "menu/remove", menuIconColor }}; menuIconRetractVote: icon {{ "menu/retract_vote", menuIconColor }}; menuIconPermissions: icon {{ "menu/permissions", menuIconColor }}; menuIconShare: icon {{ "menu/share", menuIconColor }}; +menuIconSharing: icon {{ "menu/share2", menuIconColor }}; menuIconArchive: icon {{ "menu/archive", menuIconColor }}; menuIconUnarchive: icon {{ "menu/unarchive", menuIconColor }}; menuIconMarkRead: icon {{ "menu/read", menuIconColor }}; @@ -161,6 +162,7 @@ menuIconAppleWatch: icon {{ "menu/passcode_watch", menuIconColor }}; menuIconSystemPwd: menuIconPermissions; menuIconPlayerFullScreen: icon {{ "player/player_fullscreen", menuIconColor }}; menuIconPlayerWindowed: icon {{ "player/player_minimize", menuIconColor }}; +menuIconStarRefLink: icon{{ "settings/premium/features/feature_links2", menuIconColor }}; menuIconTTLAny: icon {{ "menu/auto_delete_plain", menuIconColor }}; menuIconTTLAnyTextPosition: point(11px, 22px);