diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 23472b8c9..47bd1c965 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -3192,11 +3192,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_gift_visible_hint" = "This gift is visible to visitors of your page."; "lng_gift_availability" = "Availability"; "lng_gift_from_hidden" = "Hidden User"; +"lng_gift_visibility" = "Visibility"; +"lng_gift_visibility_shown" = "Visible on your page"; +"lng_gift_visibility_hidden" = "Not visible on your page"; +"lng_gift_visibility_show" = "show"; +"lng_gift_visibility_hide" = "hide"; "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"; diff --git a/Telegram/SourceFiles/boxes/gift_premium_box.cpp b/Telegram/SourceFiles/boxes/gift_premium_box.cpp index cb8723968..90e4b8649 100644 --- a/Telegram/SourceFiles/boxes/gift_premium_box.cpp +++ b/Telegram/SourceFiles/boxes/gift_premium_box.cpp @@ -237,7 +237,7 @@ void AddTableRow( valueMargins); } -object_ptr MakeStarGiftStarsValue( +[[nodiscard]] object_ptr MakeStarGiftStarsValue( not_null parent, not_null controller, const Data::CreditsHistoryEntry &entry, @@ -302,6 +302,62 @@ object_ptr MakeStarGiftStarsValue( return result; } +[[nodiscard]] object_ptr MakeVisibilityTableValue( + not_null parent, + not_null controller, + bool savedToProfile, + Fn toggleVisibility) { + auto result = object_ptr(parent); + const auto raw = result.data(); + + const auto label = Ui::CreateChild( + raw, + (savedToProfile + ? tr::lng_gift_visibility_shown() + : tr::lng_gift_visibility_hidden()), + st::giveawayGiftCodeValue, + st::defaultPopupMenu); + + const auto toggle = Ui::CreateChild( + raw, + (savedToProfile + ? tr::lng_gift_visibility_hide() + : tr::lng_gift_visibility_show()), + st::starGiftSmallButton); + toggle->setTextTransform(Ui::RoundButton::TextTransform::NoTransform); + toggle->setClickedCallback([=] { + toggleVisibility(!savedToProfile); + }); + + rpl::combine( + raw->widthValue(), + toggle->widthValue() + ) | rpl::start_with_next([=](int width, int toggleWidth) { + const auto toggleSkip = toggleWidth + ? (st::normalFont->spacew + toggleWidth) + : 0; + label->resizeToNaturalWidth(width - toggleSkip); + label->moveToLeft(0, 0, width); + if (toggle) { + toggle->moveToLeft( + label->width() + st::normalFont->spacew, + (st::giveawayGiftCodeValue.style.font->ascent + - st::starGiftSmallButton.style.font->ascent), + width); + } + }, label->lifetime()); + + label->heightValue() | rpl::start_with_next([=](int height) { + raw->resize( + raw->width(), + height + st::giveawayGiftCodeValueMargin.bottom()); + }, raw->lifetime()); + + label->setAttribute(Qt::WA_TransparentForMouseEvents); + + return result; +} + not_null AddTableRow( not_null table, rpl::producer label, @@ -1035,6 +1091,7 @@ void AddStarGiftTable( not_null controller, not_null container, const Data::CreditsHistoryEntry &entry, + Fn toggleVisibility, Fn convertToStars) { auto table = container->add( object_ptr( @@ -1072,9 +1129,15 @@ void AddStarGiftTable( rpl::single(Ui::Text::WithEntities( langDateTime(entry.lastSaleDate)))); } + if (!entry.date.isNull()) { + AddTableRow( + table, + tr::lng_gift_link_label_date(), + rpl::single(Ui::Text::WithEntities(langDateTime(entry.date)))); + } + const auto marginWithButton = st::giveawayGiftCodeValueMargin + - QMargins(0, 0, 0, st::giveawayGiftCodeValueMargin.bottom()); { - const auto margin = st::giveawayGiftCodeValueMargin - - QMargins(0, 0, 0, st::giveawayGiftCodeValueMargin.bottom()); AddTableRow( table, tr::lng_gift_link_label_value(), @@ -1083,13 +1146,18 @@ void AddStarGiftTable( controller, entry, std::move(convertToStars)), - margin); + marginWithButton); } - if (!entry.date.isNull()) { + if (toggleVisibility) { AddTableRow( table, - tr::lng_gift_link_label_date(), - rpl::single(Ui::Text::WithEntities(langDateTime(entry.date)))); + tr::lng_gift_visibility(), + MakeVisibilityTableValue( + table, + controller, + entry.savedToProfile, + std::move(toggleVisibility)), + marginWithButton); } if (entry.limitedCount > 0) { auto amount = rpl::single(TextWithEntities{ diff --git a/Telegram/SourceFiles/boxes/gift_premium_box.h b/Telegram/SourceFiles/boxes/gift_premium_box.h index 3a2c20498..3974d85ab 100644 --- a/Telegram/SourceFiles/boxes/gift_premium_box.h +++ b/Telegram/SourceFiles/boxes/gift_premium_box.h @@ -58,6 +58,7 @@ void AddStarGiftTable( not_null controller, not_null container, const Data::CreditsHistoryEntry &entry, + Fn toggleVisibility, Fn convertToStars); void AddCreditsHistoryEntryTable( not_null controller, diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp index 4ab6775e6..c7569c37a 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp @@ -1244,6 +1244,49 @@ void ReceiptCreditsBox( const auto state = box->lifetime().make_state(); const auto weakWindow = base::make_weak(controller); + const auto toggleVisibility = [=, weak = Ui::MakeWeak(box)](bool save) { + const auto window = weakWindow.get(); + const auto showSection = !e.fromGiftsList; + const auto itemId = MsgId(e.bareMsgId); + if (!window) { + return; + } + const auto done = [=](bool ok) { + if (const auto window = weakWindow.get()) { + if (ok) { + using GiftAction = Data::GiftUpdate::Action; + window->session().data().notifyGiftUpdate({ + .itemId = FullMsgId( + starGiftSender->id, + itemId), + .action = (save + ? GiftAction::Save + : GiftAction::Unsave), + }); + if (showSection) { + window->showSection( + std::make_shared( + window->session().user(), + Info::Section::Type::PeerGifts)); + } + } + } + if (const auto strong = weak.data()) { + if (ok) { + strong->closeBox(); + } else { + state->confirmButtonBusy = false; + } + } + }; + ToggleStarGiftSaved( + window, + starGiftSender, + itemId, + save, + done); + }; + if (isStarGift && e.id.isEmpty()) { const auto convert = [=, weak = Ui::MakeWeak(box)] { const auto stars = e.starsConverted; @@ -1287,11 +1330,13 @@ void ReceiptCreditsBox( } }); }; + const auto canToggle = canConvert || couldConvert || nonConvertible; AddStarGiftTable( controller, content, e, + canToggle ? toggleVisibility : Fn(), canConvert ? convert : Fn()); } else { AddCreditsHistoryEntryTable(controller, content, e); @@ -1339,7 +1384,7 @@ void ReceiptCreditsBox( Ui::AddSkip(content); auto label = object_ptr( box, - (s.cancelledByBot && bot) + ((s.cancelledByBot && bot) ? tr::lng_credits_subscription_off_by_bot_about( lt_bot, rpl::single(bot->name())) @@ -1349,8 +1394,8 @@ void ReceiptCreditsBox( ? tr::lng_credits_subscription_off_about() : tr::lng_credits_subscription_on_about( lt_date, - rpl::single(langDayOfMonthFull(s.until.date()))), - st::creditsBoxAboutDivider); + rpl::single(langDayOfMonthFull(s.until.date())))), + st::creditsBoxAboutDivider); if (toCancel) { label->setClickHandlerFilter([=]( const auto &, @@ -1402,54 +1447,9 @@ void ReceiptCreditsBox( ? tr::lng_credits_subscription_off_button() : toRejoin ? tr::lng_credits_subscription_off_rejoin_button() - : (canConvert || couldConvert || nonConvertible) - ? (e.savedToProfile - ? tr::lng_gift_display_on_page_hide() - : tr::lng_gift_display_on_page()) : tr::lng_box_ok())); const auto send = [=, weak = Ui::MakeWeak(box)] { - if (canConvert || couldConvert || nonConvertible) { - const auto save = !e.savedToProfile; - const auto window = weakWindow.get(); - const auto showSection = !e.fromGiftsList; - const auto itemId = MsgId(e.bareMsgId); - if (window) { - const auto done = [=](bool ok) { - if (const auto window = weakWindow.get()) { - if (ok) { - using GiftAction = Data::GiftUpdate::Action; - window->session().data().notifyGiftUpdate({ - .itemId = FullMsgId( - starGiftSender->id, - itemId), - .action = (save - ? GiftAction::Save - : GiftAction::Unsave), - }); - if (showSection) { - window->showSection( - std::make_shared( - window->session().user(), - Info::Section::Type::PeerGifts)); - } - } - } - if (const auto strong = weak.data()) { - if (ok) { - strong->closeBox(); - } else { - state->confirmButtonBusy = false; - } - } - }; - ToggleStarGiftSaved( - window, - starGiftSender, - itemId, - save, - done); - } - } else if (toRejoin) { + if (toRejoin) { if (const auto window = weakWindow.get()) { const auto finish = [=](Payments::CheckoutResult&&) { ProcessReceivedSubscriptions(weak, session); @@ -1480,9 +1480,7 @@ void ReceiptCreditsBox( } }; - const auto willBusy = toRejoin - || (peer - && (toRenew || canConvert || couldConvert || nonConvertible)); + const auto willBusy = toRejoin || (peer && toRenew); if (willBusy) { const auto close = Ui::CreateChild( content,