Added initial ability to reinvest existing credits for channels.

This commit is contained in:
23rd 2024-06-24 03:07:22 +03:00 committed by John Preston
parent b674826392
commit d9caf15d1d
7 changed files with 86 additions and 24 deletions

View file

@ -5229,6 +5229,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_bot_earn_balance_button#other" = "Withdraw {emoji} {count} via Fragment";
"lng_bot_earn_balance_button_all" = "Withdraw all stars via Fragment";
"lng_bot_earn_balance_button_locked" = "Withdraw via Fragment";
"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_bot_earn_out_ph" = "Enter amount to withdraw";
"lng_bot_earn_balance_password_title" = "Two-step verification";

View file

@ -237,27 +237,41 @@ rpl::producer<rpl::no_value, QString> CreditsEarnStatistics::request() {
return [=](auto consumer) {
auto lifetime = rpl::lifetime();
makeRequest(MTPpayments_GetStarsRevenueStats(
MTP_flags(0),
(_isUser ? user()->input : channel()->input)
)).done([=](const MTPpayments_StarsRevenueStats &result) {
const auto &data = result.data();
const auto &status = data.vstatus().data();
_data = Data::CreditsEarnStatistics{
.revenueGraph = StatisticalGraphFromTL(data.vrevenue_graph()),
.currentBalance = status.vcurrent_balance().v,
.availableBalance = status.vavailable_balance().v,
.overallRevenue = status.voverall_revenue().v,
.usdRate = data.vusd_rate().v,
.isWithdrawalEnabled = status.is_withdrawal_enabled(),
.nextWithdrawalAt = status.vnext_withdrawal_at()
? base::unixtime::parse(status.vnext_withdrawal_at()->v)
: QDateTime(),
};
const auto finish = [=](const QString &url) {
makeRequest(MTPpayments_GetStarsRevenueStats(
MTP_flags(0),
(_isUser ? user()->input : channel()->input)
)).done([=](const MTPpayments_StarsRevenueStats &result) {
const auto &data = result.data();
const auto &status = data.vstatus().data();
_data = Data::CreditsEarnStatistics{
.revenueGraph = StatisticalGraphFromTL(
data.vrevenue_graph()),
.currentBalance = status.vcurrent_balance().v,
.availableBalance = status.vavailable_balance().v,
.overallRevenue = status.voverall_revenue().v,
.usdRate = data.vusd_rate().v,
.isWithdrawalEnabled = status.is_withdrawal_enabled(),
.nextWithdrawalAt = status.vnext_withdrawal_at()
? base::unixtime::parse(
status.vnext_withdrawal_at()->v)
: QDateTime(),
.buyAdsUrl = url,
};
consumer.put_done();
consumer.put_done();
}).fail([=](const MTP::Error &error) {
consumer.put_error_copy(error.type());
}).send();
};
makeRequest(
MTPpayments_GetStarsRevenueAdsAccountUrl(
(_isUser ? user()->input : channel()->input))
).done([=](const MTPpayments_StarsRevenueAdsAccountUrl &result) {
finish(qs(result.data().vurl()));
}).fail([=](const MTP::Error &error) {
consumer.put_error_copy(error.type());
finish({});
}).send();
return lifetime;

View file

@ -26,6 +26,7 @@ struct CreditsEarnStatistics final {
float64 usdRate = 0.;
bool isWithdrawalEnabled = false;
QDateTime nextWithdrawalAt;
QString buyAdsUrl;
};
} // namespace Data

View file

@ -234,6 +234,13 @@ void InnerWidget::fill() {
container,
_controller->parentController(),
_peer,
rpl::single(
data.buyAdsUrl
) | rpl::then(
_stateUpdated.events() | rpl::map([=] {
return _state.buyAdsUrl;
})
),
rpl::duplicate(availableBalanceValue),
rpl::duplicate(dateValue),
std::move(dateValue) | rpl::map([=](const QDateTime &dt) {

View file

@ -935,6 +935,13 @@ void InnerWidget::fill() {
container,
_controller->parentController(),
_peer,
rpl::single(
creditsData.buyAdsUrl
) | rpl::then(
_stateUpdated.events() | rpl::map([=] {
return _state.creditsEarn.buyAdsUrl;
})
),
rpl::duplicate(availableBalanceValue),
rpl::duplicate(dateValue),
std::move(dateValue) | rpl::map([=](const QDateTime &dt) {

View file

@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "core/click_handler_types.h"
#include "core/ui_integration.h"
#include "data/data_file_origin.h"
#include "core/click_handler_types.h" // UrlClickHandler
#include "data/data_photo_media.h"
#include "data/data_session.h"
#include "data/data_user.h"
@ -662,6 +663,7 @@ void AddWithdrawalWidget(
not_null<Ui::VerticalLayout*> container,
not_null<Window::SessionController*> controller,
not_null<PeerData*> peer,
rpl::producer<QString> secondButtonUrl,
rpl::producer<uint64> availableBalanceValue,
rpl::producer<QDateTime> dateValue,
rpl::producer<bool> lockedValue,
@ -712,13 +714,42 @@ void AddWithdrawalWidget(
Ui::AddSkip(container);
const auto &stButton = st::defaultActiveButton;
const auto button = container->add(
object_ptr<Ui::RoundButton>(
container,
rpl::never<QString>(),
stButton),
const auto buttonsContainer = container->add(
Ui::CreateSkipWidget(container, stButton.height),
st::boxRowPadding);
const auto button = Ui::CreateChild<Ui::RoundButton>(
buttonsContainer,
rpl::never<QString>(),
stButton);
const auto buttonCredits = Ui::CreateChild<Ui::RoundButton>(
buttonsContainer,
tr::lng_bot_earn_balance_button_buy_ads(),
stButton);
buttonCredits->setTextTransform(
Ui::RoundButton::TextTransform::NoTransform);
Ui::ToggleChildrenVisibility(buttonsContainer, true);
rpl::combine(
std::move(secondButtonUrl),
buttonsContainer->sizeValue()
) | rpl::start_with_next([=](const QString &url, const QSize &size) {
if (url.isEmpty()) {
button->resize(size.width(), size.height());
buttonCredits->resize(0, 0);
} else {
const auto w = size.width() - st::boxRowPadding.left() / 2;
button->resize(w / 2, size.height());
buttonCredits->resize(w / 2, size.height());
buttonCredits->moveToRight(0, 0);
buttonCredits->setClickedCallback([=] {
UrlClickHandler::Open(url);
});
}
}, buttonsContainer->lifetime());
rpl::duplicate(
lockedValue
) | rpl::start_with_next([=](bool v) {

View file

@ -43,6 +43,7 @@ void AddWithdrawalWidget(
not_null<Ui::VerticalLayout*> container,
not_null<Window::SessionController*> controller,
not_null<PeerData*> peer,
rpl::producer<QString> secondButtonUrl,
rpl::producer<uint64> availableBalanceValue,
rpl::producer<QDateTime> dateValue,
rpl::producer<bool> lockedValue,