diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index ba82f1639..f4f8fa65b 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -3014,6 +3014,18 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_gift_availability_left#one" = "{count} of {amount} left"; "lng_gift_availability_left#other" = "{count} of {amount} left"; "lng_gift_availability_none" = "None of {amount} left"; +"lng_gift_display_on_page" = "Display on my Page"; +"lng_gift_display_on_page_hide" = "Hide from my Page"; +"lng_gift_convert_to_stars#one" = "Convert to {count} Star"; +"lng_gift_convert_to_stars#other" = "Convert to {count} Stars"; +"lng_gift_convert_sure_title" = "Convert Gift to Stars"; +"lng_gift_convert_sure_text#one" = "Do you want to convert this gift from {user} to **{count} Star**?\n\nThis action cannot be undone."; +"lng_gift_convert_sure_text#other" = "Do you want to convert this gift from {user} to **{count} Stars**?\n\nThis action cannot be undone."; +"lng_gift_convert_sure" = "Convert"; +"lng_gift_display_done" = "The gift is now shown on your profile page."; +"lng_gift_display_done_hide" = "The gift is now hidden from your profile page."; +"lng_gift_got_stars#one" = "You got **{count} Star** for this gift."; +"lng_gift_got_stars#other" = "You got **{count} Stars** for this gift."; "lng_accounts_limit_title" = "Limit Reached"; "lng_accounts_limit1#one" = "You have reached the limit of **{count}** connected account."; diff --git a/Telegram/SourceFiles/history/view/media/history_view_premium_gift.cpp b/Telegram/SourceFiles/history/view/media/history_view_premium_gift.cpp index b45ea59f8..354106238 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_premium_gift.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_premium_gift.cpp @@ -84,11 +84,13 @@ TextWithEntities PremiumGift::subtitle() { lt_user, Ui::Text::Bold(_parent->history()->peer->shortName()), Ui::Text::RichLangValue) - : tr::lng_action_gift_got_stars_text( - tr::now, - lt_count, - _data.convertStars, - Ui::Text::RichLangValue); + : (_data.converted + ? tr::lng_gift_got_stars + : tr::lng_action_gift_got_stars_text)( + tr::now, + lt_count, + _data.convertStars, + Ui::Text::RichLangValue); } const auto isCreditsPrize = creditsPrize(); if (const auto count = credits(); count && !isCreditsPrize) { diff --git a/Telegram/SourceFiles/info/channel_statistics/boosts/giveaway/giveaway.style b/Telegram/SourceFiles/info/channel_statistics/boosts/giveaway/giveaway.style index 42ccca034..371edf751 100644 --- a/Telegram/SourceFiles/info/channel_statistics/boosts/giveaway/giveaway.style +++ b/Telegram/SourceFiles/info/channel_statistics/boosts/giveaway/giveaway.style @@ -207,3 +207,7 @@ startGiveawayButtonLoading: InfiniteRadialAnimation(defaultInfiniteRadialAnimati starGiftBox: Box(giveawayGiftCodeBox) { buttonPadding: margins(22px, 11px, 22px, 52px); } +starConvertButtonLoading: InfiniteRadialAnimation(startGiveawayButtonLoading) { + color: windowActiveTextFg; + thickness: 2px; +} diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp index 2ce2a2fdb..057d38c7d 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp @@ -45,7 +45,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "payments/payments_checkout_process.h" #include "payments/payments_form.h" #include "settings/settings_common_session.h" +#include "settings/settings_credits.h" #include "statistics/widgets/chart_header_widget.h" +#include "ui/boxes/confirm_box.h" #include "ui/controls/userpic_button.h" #include "ui/effects/credits_graphics.h" #include "ui/effects/premium_graphics.h" @@ -183,6 +185,54 @@ void ToggleStarGiftSaved( }).send(); } +void ConfirmConvertStarGift( + std::shared_ptr show, + QString name, + int stars, + Fn convert) { + show->show(Ui::MakeConfirmBox({ + .text = tr::lng_gift_convert_sure_text( + lt_count, + rpl::single(stars * 1.), + lt_user, + rpl::single(Ui::Text::Bold(name)), + Ui::Text::RichLangValue), + .confirmed = [=](Fn close) { close(); convert(); }, + .confirmText = tr::lng_gift_convert_sure(), + .title = tr::lng_gift_convert_sure_title(), + })); +} + +void ConvertStarGift( + not_null window, + not_null item, + int stars, + Fn done) { + Expects(item->history()->peer->isUser()); + + const auto api = &window->session().api(); + const auto weak = base::make_weak(window); + api->request(MTPpayments_ConvertStarGift( + item->history()->peer->asUser()->inputUser, + MTP_int(item->id.bare) + )).done([=] { + if (const auto strong = weak.get()) { + strong->showSettings(Settings::CreditsId()); + strong->showToast(tr::lng_gift_got_stars( + tr::now, + lt_count, + stars, + Ui::Text::RichLangValue)); + } + done(true); + }).fail([=](const MTP::Error &error) { + if (const auto strong = weak.get()) { + strong->showToast(error.type()); + } + done(false); + }).send(); +} + void AddViewMediaHandler( not_null thumb, not_null controller, @@ -940,7 +990,9 @@ void ReceiptCreditsBox( rpl::single(e.description), st::creditsBoxAbout))); } - if (isStarGift) { + if (isStarGift && !canConvert) { + // Nothing + } else if (isStarGift) { Ui::AddSkip(content); const auto about = box->addRow( object_ptr>( @@ -948,10 +1000,12 @@ void ReceiptCreditsBox( object_ptr( box, rpl::combine( - tr::lng_action_gift_got_stars_text( - lt_count, - rpl::single(e.convertStars * 1.), - Ui::Text::RichLangValue), + (canConvert + ? tr::lng_action_gift_got_stars_text + : tr::lng_gift_got_stars)( + lt_count, + rpl::single(e.convertStars * 1.), + Ui::Text::RichLangValue), tr::lng_paid_about_link() ) | rpl::map([](TextWithEntities text, QString link) { return text.append(' ').append(Ui::Text::Link(link)); @@ -1078,20 +1132,21 @@ void ReceiptCreditsBox( const auto toCancel = !toRenew && s; struct State final { rpl::variable confirmButtonBusy; + rpl::variable convertButtonBusy; }; const auto state = box->lifetime().make_state(); - auto confirmText = canConvert - ? (e.savedToProfile - ? tr::lng_gift_display_on_page_hide() - : tr::lng_gift_display_on_page()) - : rpl::conditional( - state->confirmButtonBusy.value(), - rpl::single(QString()), - (toRenew - ? tr::lng_credits_subscription_off_button() - : toCancel - ? tr::lng_credits_subscription_on_button() - : tr::lng_box_ok())); + auto confirmText = rpl::conditional( + state->confirmButtonBusy.value(), + rpl::single(QString()), + (toRenew + ? tr::lng_credits_subscription_off_button() + : toCancel + ? tr::lng_credits_subscription_on_button() + : canConvert + ? (e.savedToProfile + ? tr::lng_gift_display_on_page_hide() + : tr::lng_gift_display_on_page()) + : tr::lng_box_ok())); const auto weakWindow = base::make_weak(controller); const auto send = [=, weak = Ui::MakeWeak(box)] { if (canConvert) { @@ -1139,7 +1194,8 @@ void ReceiptCreditsBox( }; const auto button = box->addButton(std::move(confirmText), [=] { - if (state->confirmButtonBusy.current()) { + if (state->confirmButtonBusy.current() + || state->convertButtonBusy.current()) { return; } state->confirmButtonBusy = true; @@ -1168,11 +1224,15 @@ void ReceiptCreditsBox( if (canConvert) { using namespace Ui; - const auto convert = CreateChild( - button->parentWidget(), + auto convertText = rpl::conditional( + state->convertButtonBusy.value(), + rpl::single(QString()), tr::lng_gift_convert_to_stars( lt_count, - rpl::single(e.convertStars * 1.)), + rpl::single(e.convertStars * 1.))); + const auto convert = CreateChild( + button->parentWidget(), + std::move(convertText), st::defaultLightButton); convert->setTextTransform(RoundButton::TextTransform::NoTransform); convert->widthValue() | rpl::filter([=] { @@ -1190,6 +1250,40 @@ void ReceiptCreditsBox( - st::starGiftBox.buttonPadding.top() - convert->height())); }, convert->lifetime()); + convert->setClickedCallback([=, weak = Ui::MakeWeak(box)] { + const auto stars = e.convertStars; + const auto name = starGiftSender->shortName(); + ConfirmConvertStarGift(box->uiShow(), name, stars, [=] { + if (state->convertButtonBusy.current() + || state->confirmButtonBusy.current()) { + return; + } + state->convertButtonBusy = true; + const auto window = weakWindow.get(); + const auto item = session->data().message( + starGiftSender->id, + MsgId(e.bareMsgId)); + if (window && item && stars) { + ConvertStarGift(window, item, stars, [=](bool ok) { + if (const auto strong = weak.data()) { + if (ok) { + strong->closeBox(); + } else { + state->convertButtonBusy = false; + } + } + }); + } + }); + }); + + using namespace Info::Statistics; + const auto loadingAnimation = InfiniteRadialAnimationWidget( + convert, + convert->height() / 2, + &st::starConvertButtonLoading); + AddChildToWidgetCenter(convert, loadingAnimation); + loadingAnimation->showOn(state->convertButtonBusy.value()); } }