diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 078d50f4ab..2e7894420d 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -2269,6 +2269,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_action_todo_tasks_fallback#other" = "{count} tasks"; "lng_action_todo_tasks_and_one" = "{tasks}, {task}"; "lng_action_todo_tasks_and_last" = "{tasks} and {task}"; +"lng_action_suggest_success" = "{from} has received {amount} for publishing post."; +"lng_action_suggest_refund_user" = "User refunded the Stars so that post was deleted."; +"lng_action_suggest_refund_admin" = "Admin deleted the post early so that the price was refunded to the user."; "lng_you_paid_stars#one" = "You paid {count} Star."; "lng_you_paid_stars#other" = "You paid {count} Stars."; @@ -4434,6 +4437,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_suggest_options_ton_price_about" = "Choose how many TON to pay to publish this message."; "lng_suggest_options_date" = "Time"; "lng_suggest_options_date_any" = "Anytime"; +"lng_suggest_options_date_publish" = "Publish"; +"lng_suggest_options_date_now" = "Publish Now"; "lng_suggest_options_date_about" = "Select the date and time you want the message to be published."; "lng_suggest_options_offer" = "Offer {amount}"; "lng_suggest_options_update" = "Update Terms"; @@ -4473,7 +4478,18 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_suggest_menu_edit_time" = "Edit Time"; "lng_suggest_decline_title" = "Decline"; "lng_suggest_decline_text" = "Do you want to decline publishing this post from {from}?"; +"lng_suggest_decline_text_to" = "Do you want to decline publishing this post to {channel}?"; "lng_suggest_decline_reason" = "Add a reason (optional)"; +"lng_suggest_accept_title" = "Accept"; +"lng_suggest_accept_text" = "Do you want to publish this post from {from}?"; +"lng_suggest_accept_text_to" = "Do you want to publish this post to {channel}?"; +"lng_suggest_accept_receive" = "{channel} will receive {amount} for publishing {date}."; +"lng_suggest_accept_receive_now" = "{channel} will receive {amount} for publishing right now."; +"lng_suggest_accept_pay" = "You will pay {amount} for publishing {date}."; +"lng_suggest_accept_pay_now" = "You will pay {amount} for publishing right now."; +"lng_suggest_accept_send" = "Send"; +"lng_suggest_ton_amount#one" = "{count} TON"; +"lng_suggest_ton_amount#other" = "{count} TON"; "lng_suggest_warn_title_stars" = "Stars will be lost"; "lng_suggest_warn_title_ton" = "TON will be lost"; "lng_suggest_warn_text_stars" = "You won't receive **Stars** for the post if you delete it now. The post must remain visible for at least **24 hours** after it was published."; diff --git a/Telegram/SourceFiles/api/api_suggest_post.cpp b/Telegram/SourceFiles/api/api_suggest_post.cpp index a4d6dbf366..da195bd856 100644 --- a/Telegram/SourceFiles/api/api_suggest_post.cpp +++ b/Telegram/SourceFiles/api/api_suggest_post.cpp @@ -11,7 +11,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/unixtime.h" #include "chat_helpers/message_field.h" #include "core/click_handler_types.h" +#include "data/components/credits.h" #include "data/data_changes.h" +#include "data/data_channel.h" #include "data/data_session.h" #include "data/data_saved_sublist.h" #include "history/view/controls/history_view_suggest_options.h" @@ -22,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lang/lang_keys.h" #include "main/main_session.h" #include "mainwindow.h" +#include "settings/settings_credits_graphics.h" #include "ui/boxes/choose_date_time.h" #include "ui/layers/generic_box.h" #include "ui/boxes/confirm_box.h" @@ -75,6 +78,138 @@ void SendApproval( }).send(); } +void ConfirmApproval( + std::shared_ptr show, + not_null item, + TimeId scheduleDate = 0, + Fn accepted = nullptr) { + using Flag = MTPmessages_ToggleSuggestedPostApproval::Flag; + const auto suggestion = item->Get(); + if (!suggestion + || suggestion->accepted + || suggestion->rejected + || suggestion->requestId) { + return; + } + const auto id = item->fullId(); + const auto price = suggestion->price; + const auto admin = item->history()->amMonoforumAdmin(); + if (!admin && !price.empty()) { + const auto credits = &item->history()->session().credits(); + if (price.ton()) { + if (!credits->tonLoaded()) { + credits->tonLoad(); + return; + } else if (price > credits->tonBalance()) { + const auto peer = item->history()->peer; + show->show( + Box(HistoryView::InsufficientTonBox, peer, price)); + return; + } + } else { + if (!credits->loaded()) { + credits->load(); + return; + } else if (price > credits->balance()) { + using namespace Settings; + const auto peer = item->history()->peer; + const auto broadcast = peer->monoforumBroadcast(); + const auto broadcastId = (broadcast ? broadcast : peer)->id; + const auto done = [=](SmallBalanceResult result) { + if (result == SmallBalanceResult::Success + || result == SmallBalanceResult::Already) { + const auto item = peer->owner().message(id); + if (item) { + ConfirmApproval( + show, + item, + scheduleDate, + accepted); + } + } + }; + MaybeRequestBalanceIncrease( + show, + int(base::SafeRound(price.value())), + SmallBalanceForSuggest{ broadcastId }, + done); + return; + } + } + } + const auto peer = item->history()->peer; + const auto broadcast = peer->monoforumBroadcast(); + const auto channelName = (broadcast ? broadcast : peer)->name(); + const auto amount = Lang::FormatCreditsAmountWithCurrency(price); + const auto date = langDateTime(base::unixtime::parse(scheduleDate)); + show->show(Box([=](not_null box) { + const auto callback = std::make_shared>(); + auto text = admin + ? tr::lng_suggest_accept_text( + tr::now, + lt_from, + Ui::Text::Bold(item->from()->shortName()), + Ui::Text::WithEntities) + : tr::lng_suggest_accept_text_to( + tr::now, + lt_channel, + Ui::Text::Bold(channelName), + Ui::Text::WithEntities); + if (price) { + text.append("\n\n").append(admin + ? (scheduleDate + ? tr::lng_suggest_accept_receive( + tr::now, + lt_channel, + Ui::Text::Bold(channelName), + lt_amount, + Ui::Text::Bold(amount), + lt_date, + Ui::Text::Bold(date), + Ui::Text::WithEntities) + : tr::lng_suggest_accept_receive_now( + tr::now, + lt_channel, + Ui::Text::Bold(channelName), + lt_amount, + Ui::Text::Bold(amount), + Ui::Text::WithEntities)) + : (scheduleDate + ? tr::lng_suggest_accept_pay( + tr::now, + lt_amount, + Ui::Text::Bold(amount), + lt_date, + Ui::Text::Bold(date), + Ui::Text::WithEntities) + : tr::lng_suggest_accept_pay_now( + tr::now, + lt_amount, + Ui::Text::Bold(amount), + Ui::Text::WithEntities))); + } + Ui::ConfirmBox(box, { + .text = text, + .confirmed = [=](Fn close) { (*callback)(); close(); }, + .confirmText = tr::lng_suggest_accept_send(), + .title = tr::lng_suggest_accept_title(), + }); + *callback = [=, weak = Ui::MakeWeak(box)] { + if (const auto onstack = accepted) { + onstack(); + } + const auto item = show->session().data().message(id); + if (!item) { + return; + } + SendApproval(show, item, scheduleDate); + if (const auto strong = weak.data()) { + strong->closeBox(); + } + }; + })); +} + void SendDecline( std::shared_ptr show, not_null item, @@ -120,19 +255,23 @@ void RequestApprovalDate( not_null item) { const auto id = item->fullId(); const auto weak = std::make_shared>(); - const auto done = [=](TimeId result) { - if (const auto item = show->session().data().message(id)) { - SendApproval(show, item, result); - } + const auto close = [=] { if (const auto strong = weak->data()) { strong->closeBox(); } }; + const auto done = [=](TimeId result) { + if (const auto item = show->session().data().message(id)) { + ConfirmApproval(show, item, result, close); + } else { + close(); + } + }; using namespace HistoryView; auto dateBox = Box(ChooseSuggestTimeBox, SuggestTimeBoxArgs{ .session = &show->session(), .done = done, - .mode = SuggestMode::New, + .mode = SuggestMode::Publish, }); *weak = dateBox.data(); show->show(std::move(dateBox)); @@ -142,13 +281,22 @@ void RequestDeclineComment( std::shared_ptr show, not_null item) { const auto id = item->fullId(); + const auto admin = item->history()->amMonoforumAdmin(); + const auto peer = item->history()->peer; + const auto broadcast = peer->monoforumBroadcast(); + const auto channelName = (broadcast ? broadcast : peer)->name(); show->show(Box([=](not_null box) { const auto callback = std::make_shared>(); Ui::ConfirmBox(box, { - .text = tr::lng_suggest_decline_text( - lt_from, - rpl::single(Ui::Text::Bold(item->from()->shortName())), - Ui::Text::WithEntities), + .text = (admin + ? tr::lng_suggest_decline_text( + lt_from, + rpl::single(Ui::Text::Bold(item->from()->shortName())), + Ui::Text::WithEntities) + : tr::lng_suggest_decline_text_to( + lt_channel, + rpl::single(Ui::Text::Bold(channelName)), + Ui::Text::WithEntities)), .confirmed = [=](Fn close) { (*callback)(); close(); }, .confirmText = tr::lng_suggest_action_decline(), .confirmStyle = &st::attentionBoxButton, @@ -264,12 +412,11 @@ void SuggestApprovalDate( close); }; using namespace HistoryView; - const auto admin = item->history()->amMonoforumAdmin(); auto dateBox = Box(ChooseSuggestTimeBox, SuggestTimeBoxArgs{ .session = &show->session(), .done = done, .value = suggestion->date, - .mode = (admin ? SuggestMode::ChangeAdmin : SuggestMode::ChangeUser), + .mode = SuggestMode::Change, }); *weak = dateBox.data(); show->show(std::move(dateBox)); @@ -318,7 +465,6 @@ void SuggestApprovalPrice( if (!suggestion) { return; } - const auto admin = item->history()->amMonoforumAdmin(); using namespace HistoryView; SuggestOfferForMessage(show, item, { .exists = uint32(1), @@ -326,7 +472,7 @@ void SuggestApprovalPrice( .priceNano = uint32(suggestion->price.nano()), .ton = uint32(suggestion->price.ton() ? 1 : 0), .date = suggestion->date, - }, admin ? SuggestMode::ChangeAdmin : SuggestMode::ChangeUser); + }, SuggestMode::Change); } } // namespace @@ -352,7 +498,7 @@ std::shared_ptr AcceptClickHandler( } else if (!suggestion->date) { RequestApprovalDate(show, item); } else { - SendApproval(show, item); + ConfirmApproval(show, item); } }); } diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 8394682656..70b03acde8 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -6093,11 +6093,25 @@ void HistoryItem::setServiceMessageByAction(const MTPmessageAction &action) { }; auto prepareSuggestedPostSuccess = [&](const MTPDmessageActionSuggestedPostSuccess &data) { - return PreparedServiceText{ { u"hello"_q } }; AssertIsDebug(); + const auto price = CreditsAmountFromTL(&data.vprice()); + const auto amount = Lang::FormatCreditsAmountWithCurrency(price); + auto result = PreparedServiceText(); + result.links.push_back(_from->createOpenLink()); + result.text = tr::lng_action_suggest_success( + tr::now, + lt_from, + Ui::Text::Link(_from->shortName(), 1), + lt_amount, + TextWithEntities{ amount }, + Ui::Text::WithEntities); + return result; }; auto prepareSuggestedPostRefund = [&](const MTPDmessageActionSuggestedPostRefund &data) { - return PreparedServiceText{ { u"hello"_q } }; AssertIsDebug(); + return PreparedServiceText{ { data.is_payer_initiated() + ? tr::lng_action_suggest_refund_user(tr::now) + : tr::lng_action_suggest_refund_admin(tr::now) + } }; }; auto prepareConferenceCall = [&](const MTPDmessageActionConferenceCall &) -> PreparedServiceText { diff --git a/Telegram/SourceFiles/history/history_item_helpers.cpp b/Telegram/SourceFiles/history/history_item_helpers.cpp index 06eb877ff6..33bea8bc66 100644 --- a/Telegram/SourceFiles/history/history_item_helpers.cpp +++ b/Telegram/SourceFiles/history/history_item_helpers.cpp @@ -224,7 +224,7 @@ std::optional ComputePaymentDetails( bool SuggestPaymentDataReady( not_null peer, SuggestPostOptions suggest) { - if (!suggest.exists || !suggest.price()) { + if (!suggest.exists || !suggest.price() || peer->amMonoforumAdmin()) { return true; } else if (suggest.ton && !peer->session().credits().tonLoaded()) { peer->session().credits().tonLoad(); @@ -441,12 +441,13 @@ bool SendPaymentHelper::check( PaidConfirmStyles styles) { clear(); + const auto admin = peer->amMonoforumAdmin(); const auto suggest = options.suggest; const auto starsApproved = options.starsApproved; - const auto suggestPriceStars = suggest.ton + const auto checkSuggestPriceStars = (admin || suggest.ton) ? 0 : int(base::SafeRound(suggest.price().value())); - const auto suggestPriceTon = suggest.ton + const auto checkSuggestPriceTon = (!admin && suggest.ton) ? suggest.price() : CreditsAmount(); const auto details = ComputePaymentDetails(peer, messagesCount); @@ -491,32 +492,33 @@ bool SendPaymentHelper::check( } else if (const auto stars = details->stars; stars > starsApproved) { ShowSendPaidConfirm(show, peer, *details, [=] { resend(stars); - }, styles, suggestPriceStars); + }, styles, checkSuggestPriceStars); return false; - } else if (suggestPriceStars - && (CreditsAmount(details->stars + suggestPriceStars) + } else if (checkSuggestPriceStars + && (CreditsAmount(details->stars + checkSuggestPriceStars) > peer->session().credits().balance())) { - const auto peerId = peer->id; + using namespace Settings; + const auto broadcast = peer->monoforumBroadcast(); + const auto broadcastId = (broadcast ? broadcast : peer)->id; const auto forMessages = details->stars; - const auto required = forMessages + suggestPriceStars; - const auto done = [=](Settings::SmallBalanceResult result) { - if (result == Settings::SmallBalanceResult::Success - || result == Settings::SmallBalanceResult::Already) { + const auto required = forMessages + checkSuggestPriceStars; + const auto done = [=](SmallBalanceResult result) { + if (result == SmallBalanceResult::Success + || result == SmallBalanceResult::Already) { resend(forMessages); } }; - using namespace Settings; MaybeRequestBalanceIncrease( show, required, - SmallBalanceForSuggest{ peerId }, + SmallBalanceForSuggest{ broadcastId }, done); return false; } - if (suggestPriceTon - && suggestPriceTon > peer->session().credits().tonBalance()) { - show->show( - Box(HistoryView::InsufficientTonBox, peer, suggestPriceTon)); + if (checkSuggestPriceTon + && checkSuggestPriceTon > peer->session().credits().tonBalance()) { + using namespace HistoryView; + show->show(Box(InsufficientTonBox, peer, checkSuggestPriceTon)); return false; } return true; diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 7b6c602cf0..af780173a6 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -2275,11 +2275,7 @@ bool HistoryWidget::applyDraft(FieldHistoryAction fieldHistoryAction) { } if (editDraft && editDraft->suggest) { using namespace HistoryView; - applySuggestOptions( - editDraft->suggest, - (_history->amMonoforumAdmin() - ? SuggestMode::ChangeAdmin - : SuggestMode::ChangeUser)); + applySuggestOptions(editDraft->suggest, SuggestMode::Change); } else { cancelSuggestPost(); } diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index ce1ceee294..179d2fe978 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -793,7 +793,7 @@ void FieldHeader::editMessage( _inPhotoEditOver.stop(); } if (id && suggest) { - applySuggestOptions(suggest, SuggestMode::ChangeAdmin); + applySuggestOptions(suggest, SuggestMode::Change); } else { cancelSuggestPost(); } diff --git a/Telegram/SourceFiles/history/view/controls/history_view_suggest_options.cpp b/Telegram/SourceFiles/history/view/controls/history_view_suggest_options.cpp index 442efb8a2d..6554d1a16a 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_suggest_options.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_suggest_options.cpp @@ -58,10 +58,13 @@ void ChooseSuggestTimeBox( : (now + 86400); const auto done = args.done; Ui::ChooseDateTimeBox(box, { - .title = ((args.mode == SuggestMode::New) + .title = ((args.mode == SuggestMode::New + || args.mode == SuggestMode::Publish) ? tr::lng_suggest_options_date() : tr::lng_suggest_menu_edit_time()), - .submit = ((args.mode == SuggestMode::New) + .submit = ((args.mode == SuggestMode::Publish) + ? tr::lng_suggest_options_date_publish() + : (args.mode == SuggestMode::New) ? tr::lng_settings_save() : tr::lng_suggest_options_update()), .done = done, @@ -70,7 +73,9 @@ void ChooseSuggestTimeBox( .max = [=] { return now + max; }, }); - box->addLeftButton(tr::lng_suggest_options_date_any(), [=] { + box->addLeftButton((args.mode == SuggestMode::Publish) + ? tr::lng_suggest_options_date_now() + : tr::lng_suggest_options_date_any(), [=] { done(TimeId()); }); } @@ -96,9 +101,14 @@ void ChooseSuggestPriceBox( state->ton = (args.value.ton != 0); const auto peer = args.peer; + const auto admin = peer->amMonoforumAdmin(); + const auto broadcast = peer->monoforumBroadcast(); + const auto usePeer = broadcast ? broadcast : peer; const auto session = &peer->session(); - session->credits().load(); - session->credits().tonLoad(); + if (!admin) { + session->credits().load(); + session->credits().tonLoad(); + } const auto limit = session->appConfig().suggestedPostStarsMax(); box->setTitle((args.mode == SuggestMode::New) @@ -109,7 +119,7 @@ void ChooseSuggestPriceBox( state->buttons.push_back({ .text = Ui::Text::String( st::semiboldTextStyle, - (args.mode == SuggestMode::ChangeAdmin + (admin ? tr::lng_suggest_options_stars_request(tr::now) : tr::lng_suggest_options_stars_offer(tr::now))), .active = !state->ton.current(), @@ -117,7 +127,7 @@ void ChooseSuggestPriceBox( state->buttons.push_back({ .text = Ui::Text::String( st::semiboldTextStyle, - (args.mode == SuggestMode::ChangeAdmin + (admin ? tr::lng_suggest_options_ton_request(tr::now) : tr::lng_suggest_options_ton_offer(tr::now))), .active = state->ton.current(), @@ -381,16 +391,15 @@ void ChooseSuggestPriceBox( nanos % Ui::kNanosInOne, ton ? CreditsType::Ton : CreditsType::Stars); const auto credits = &session->credits(); - if (ton) { + if (!admin && ton) { if (!credits->tonLoaded()) { state->savePending = true; return; } else if (credits->tonBalance() < value) { - box->uiShow()->show( - Box(InsufficientTonBox, peer, value)); + box->uiShow()->show(Box(InsufficientTonBox, usePeer, value)); return; } - } else { + } else if (!admin) { if (!credits->loaded()) { state->savePending = true; return; @@ -408,7 +417,7 @@ void ChooseSuggestPriceBox( MaybeRequestBalanceIncrease( Main::MakeSessionShow(box->uiShow(), session), required, - SmallBalanceForSuggest{ peer->id }, + SmallBalanceForSuggest{ usePeer->id }, done); return; } diff --git a/Telegram/SourceFiles/history/view/controls/history_view_suggest_options.h b/Telegram/SourceFiles/history/view/controls/history_view_suggest_options.h index f66cd0215c..46f8cde0dd 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_suggest_options.h +++ b/Telegram/SourceFiles/history/view/controls/history_view_suggest_options.h @@ -29,8 +29,8 @@ namespace HistoryView { enum class SuggestMode { New, - ChangeUser, - ChangeAdmin, + Change, + Publish, }; struct SuggestTimeBoxArgs { diff --git a/Telegram/SourceFiles/history/view/history_view_service_message.cpp b/Telegram/SourceFiles/history/view/history_view_service_message.cpp index c02bdd099c..47dd11eb8d 100644 --- a/Telegram/SourceFiles/history/view/history_view_service_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_service_message.cpp @@ -742,6 +742,8 @@ TextState Service::textState(QPoint point, StateRequest request) const { result.link = done->lnk; } else if (const auto append = item->Get()) { result.link = append->lnk; + } else if (const auto finish = item->Get()) { + result.link = finish->lnk; } else if (media && data()->showSimilarChannels()) { result = media->textState(mediaPoint, request); } 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 8db3f9d8c4..46f3a6d832 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_premium_gift.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_premium_gift.cpp @@ -70,8 +70,8 @@ QSize PremiumGift::size() { TextWithEntities PremiumGift::title() { using namespace Ui::Text; if (tonGift()) { - AssertIsDebug(); - return { QString::number(_data.count / 1'000'000'000LL) + u" TON"_q }; + return { Lang::FormatCreditsAmountWithCurrency( + CreditsAmount(0, _data.count, CreditsType::Ton)) }; } else if (starGift()) { const auto peer = _parent->history()->peer; return peer->isSelf() diff --git a/Telegram/SourceFiles/history/view/media/history_view_suggest_decision.cpp b/Telegram/SourceFiles/history/view/media/history_view_suggest_decision.cpp index 14238743c8..37d0bf729d 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_suggest_decision.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_suggest_decision.cpp @@ -214,12 +214,8 @@ auto GenerateSuggestDecisionMedia( ? st::chatSuggestInfoMiddleMargin : st::chatSuggestInfoLastMargin)); if (price) { - const auto amount = Ui::Text::Bold(price.ton() - ? (Lang::FormatCreditsAmountDecimal(price) + u" TON"_q) - : tr::lng_prize_credits_amount( - tr::now, - lt_count_decimal, - price.value())); + const auto amount = Ui::Text::Bold( + Lang::FormatCreditsAmountWithCurrency(price)); pushText( TextWithEntities( ).append(Emoji(kMoney)).append(' ').append( @@ -334,12 +330,7 @@ auto GenerateSuggestRequestMedia( : tr::lng_suggest_action_price_label)(tr::now), Ui::Text::Bold(!suggest->price ? tr::lng_suggest_action_price_free(tr::now) - : suggest->price.ton() AssertIsDebug() - ? (Lang::FormatCreditsAmountDecimal(suggest->price) + u" TON"_q) - : tr::lng_prize_credits_amount( - tr::now, - lt_count, - suggest->price.value())), + : Lang::FormatCreditsAmountWithCurrency(suggest->price)), }); entries.push_back({ ((changes && changes->date) diff --git a/Telegram/SourceFiles/lang/lang_tag.cpp b/Telegram/SourceFiles/lang/lang_tag.cpp index eb6f938bf8..9cb390d306 100644 --- a/Telegram/SourceFiles/lang/lang_tag.cpp +++ b/Telegram/SourceFiles/lang/lang_tag.cpp @@ -968,6 +968,15 @@ QString FormatCreditsAmountRounded(CreditsAmount amount) { return FormatExactCountDecimal(base::SafeRound(value * 100.) / 100.); } +QString FormatCreditsAmountWithCurrency(CreditsAmount amount) { + return (amount.ton() + ? tr::lng_suggest_ton_amount + : tr::lng_prize_credits_amount)( + tr::now, + lt_count_decimal, + amount.value()); +} + PluralResult Plural( ushort keyBase, float64 value, diff --git a/Telegram/SourceFiles/lang/lang_tag.h b/Telegram/SourceFiles/lang/lang_tag.h index 40f3ef9972..732aab4ba6 100644 --- a/Telegram/SourceFiles/lang/lang_tag.h +++ b/Telegram/SourceFiles/lang/lang_tag.h @@ -34,6 +34,8 @@ struct ShortenedCount { [[nodiscard]] QString FormatCreditsAmountDecimal(CreditsAmount amount); [[nodiscard]] QString FormatCreditsAmountRounded(CreditsAmount amount); +[[nodiscard]] QString FormatCreditsAmountWithCurrency(CreditsAmount amount); + struct PluralResult { int keyShift = 0; QString replacement;