Added api support of invoice payments for credits.

This commit is contained in:
23rd 2024-05-17 03:37:56 +03:00 committed by John Preston
parent d0bfee6963
commit 9b11b95c5b
5 changed files with 86 additions and 1 deletions

View file

@ -139,6 +139,28 @@ void CheckoutProcess::Start(
j->second->requestActivate();
}
void CheckoutProcess::Start(
InvoiceCredits creditsInvoice,
Fn<void(CheckoutResult)> reactivate) {
const auto randomId = creditsInvoice.randomId;
auto id = InvoiceId{ std::move(creditsInvoice) };
auto &processes = LookupSessionProcesses(SessionFromId(id));
const auto i = processes.byRandomId.find(randomId);
if (i != end(processes.byRandomId)) {
i->second->setReactivateCallback(std::move(reactivate));
i->second->requestActivate();
return;
}
const auto j = processes.byRandomId.emplace(
randomId,
std::make_unique<CheckoutProcess>(
std::move(id),
Mode::Payment,
std::move(reactivate),
PrivateTag{})).first;
j->second->requestActivate();
}
std::optional<PaidInvoice> CheckoutProcess::InvoicePaid(
not_null<const HistoryItem*> item) {
const auto session = &item->history()->session();

View file

@ -37,6 +37,7 @@ namespace Payments {
class Form;
struct FormUpdate;
struct Error;
struct InvoiceCredits;
struct InvoiceId;
struct InvoicePremiumGiftCode;
@ -73,6 +74,9 @@ public:
static void Start(
InvoicePremiumGiftCode giftCodeInvoice,
Fn<void(CheckoutResult)> reactivate);
static void Start(
InvoiceCredits creditsInvoice,
Fn<void(CheckoutResult)> reactivate);
[[nodiscard]] static std::optional<PaidInvoice> InvoicePaid(
not_null<const HistoryItem*> item);
[[nodiscard]] static std::optional<PaidInvoice> InvoicePaid(

View file

@ -117,6 +117,8 @@ not_null<Main::Session*> SessionFromId(const InvoiceId &id) {
return &message->peer->session();
} else if (const auto slug = std::get_if<InvoiceSlug>(&id.value)) {
return slug->session;
} else if (const auto slug = std::get_if<InvoiceCredits>(&id.value)) {
return slug->session;
}
const auto &giftCode = v::get<InvoicePremiumGiftCode>(id.value);
const auto users = std::get_if<InvoicePremiumGiftCodeUsers>(
@ -314,6 +316,15 @@ MTPInputInvoice Form::inputInvoice() const {
MTP_int(message->itemId.bare));
} else if (const auto slug = std::get_if<InvoiceSlug>(&_id.value)) {
return MTP_inputInvoiceSlug(MTP_string(slug->slug));
} else if (const auto credits = std::get_if<InvoiceCredits>(&_id.value)) {
return MTP_inputInvoiceStars(MTP_starsTopupOption(
credits->product.isEmpty()
? MTP_flags(0)
: MTP_flags(MTPDstarsTopupOption::Flag::f_store_product),
MTP_long(credits->credits),
MTP_string(credits->product),
MTP_string(credits->currency),
MTP_long(credits->amount)));
}
const auto &giftCode = v::get<InvoicePremiumGiftCode>(_id.value);
using Flag = MTPDpremiumGiftCodeOption::Flag;

View file

@ -216,8 +216,21 @@ struct InvoicePremiumGiftCode {
int months = 0;
};
struct InvoiceCredits {
not_null<Main::Session*> session;
uint64 randomId = 0;
uint64 credits = 0;
QString product;
QString currency;
uint64 amount = 0;
};
struct InvoiceId {
std::variant<InvoiceMessage, InvoiceSlug, InvoicePremiumGiftCode> value;
std::variant<
InvoiceMessage,
InvoiceSlug,
InvoicePremiumGiftCode,
InvoiceCredits> value;
};
[[nodiscard]] not_null<Main::Session*> SessionFromId(const InvoiceId &id);

View file

@ -13,7 +13,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "info/settings/info_settings_widget.h" // SectionCustomTopBarData.
#include "lang/lang_keys.h"
#include "main/main_session.h"
#include "payments/payments_checkout_process.h"
#include "payments/payments_form.h"
#include "settings/settings_common_session.h"
#include "ui/boxes/boost_box.h" // Ui::StartFireworks.
#include "ui/effects/premium_graphics.h"
#include "ui/effects/premium_top_bar.h"
#include "ui/image/image_prepare.h"
@ -33,6 +36,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "styles/style_layers.h"
#include "styles/style_settings.h"
#include <xxhash.h> // XXH64.
#include <QtSvg/QSvgRenderer>
namespace Settings {
@ -40,6 +45,16 @@ namespace {
using SectionCustomTopBarData = Info::Settings::SectionCustomTopBarData;
[[nodiscard]] uint64 UniqueIdFromOption(
const Data::CreditTopupOption &d) {
const auto string = QString::number(d.credits)
+ d.product
+ d.currency
+ QString::number(d.amount);
return XXH64(string.data(), string.size() * sizeof(ushort), 0);
}
[[nodiscard]] QImage GenerateStarForLightTopBar(QRectF rect) {
const auto strokeWidth = 3;
@ -177,6 +192,26 @@ void Credits::setupOptions(not_null<Ui::VerticalLayout*> container) {
icon->moveToLeft(st.iconLeft, st.padding.top());
}, button->lifetime());
button->setClickedCallback([=] {
const auto invoice = Payments::InvoiceCredits{
.session = &_controller->session(),
.randomId = UniqueIdFromOption(option),
.credits = option.credits,
.product = option.product,
.currency = option.currency,
.amount = option.amount,
};
const auto weak = Ui::MakeWeak(button);
const auto done = [=](Payments::CheckoutResult result) {
if (const auto strong = weak.data()) {
strong->window()->setFocus();
if (result == Payments::CheckoutResult::Paid) {
Ui::StartFireworks(this);
}
}
};
Payments::CheckoutProcess::Start(std::move(invoice), done);
});
Ui::ToggleChildrenVisibility(button, true);
}