Added initial support for non-panel credits receipts.

This commit is contained in:
23rd 2024-05-24 22:20:41 +03:00 committed by John Preston
parent 93eff78cd6
commit c27c567225
7 changed files with 64 additions and 9 deletions

View file

@ -3941,6 +3941,7 @@ void HistoryItem::createServiceFromMtp(const MTPDmessageService &message) {
payment->slug = data.vinvoice_slug().value_or_empty(); payment->slug = data.vinvoice_slug().value_or_empty();
payment->recurringInit = data.is_recurring_init(); payment->recurringInit = data.is_recurring_init();
payment->recurringUsed = data.is_recurring_used(); payment->recurringUsed = data.is_recurring_used();
payment->isCreditsCurrency = (currency == Ui::kCreditsCurrency);
payment->amount = Ui::FillAmountAndCurrency(amount, currency); payment->amount = Ui::FillAmountAndCurrency(amount, currency);
payment->invoiceLink = std::make_shared<LambdaClickHandler>([=]( payment->invoiceLink = std::make_shared<LambdaClickHandler>([=](
ClickContext context) { ClickContext context) {

View file

@ -653,6 +653,7 @@ struct HistoryServicePayment
ClickHandlerPtr invoiceLink; ClickHandlerPtr invoiceLink;
bool recurringInit = false; bool recurringInit = false;
bool recurringUsed = false; bool recurringUsed = false;
bool isCreditsCurrency = false;
}; };
struct HistoryServiceSameBackground struct HistoryServiceSameBackground

View file

@ -415,6 +415,11 @@ void CheckoutProcess::handleFormUpdate(const FormUpdate &update) {
_nonPanelPaymentFormProcess( _nonPanelPaymentFormProcess(
std::make_shared<CreditsFormData>(data.data)); std::make_shared<CreditsFormData>(data.data));
} }
}, [&](const CreditsReceiptReady &data) {
if (_nonPanelPaymentFormProcess) {
_nonPanelPaymentFormProcess(
std::make_shared<CreditsReceiptData>(data.data));
}
}, [&](const Error &error) { }, [&](const Error &error) {
handleError(error); handleError(error);
}); });

View file

@ -41,6 +41,7 @@ struct InvoiceCredits;
struct InvoiceId; struct InvoiceId;
struct InvoicePremiumGiftCode; struct InvoicePremiumGiftCode;
struct CreditsFormData; struct CreditsFormData;
struct CreditsReceiptData;
enum class Mode { enum class Mode {
Payment, Payment,
@ -54,7 +55,9 @@ enum class CheckoutResult {
Failed, Failed,
}; };
struct NonPanelPaymentForm : std::variant<std::shared_ptr<CreditsFormData>> { struct NonPanelPaymentForm : std::variant<
std::shared_ptr<CreditsFormData>,
std::shared_ptr<CreditsReceiptData>> {
using variant::variant; using variant::variant;
}; };

View file

@ -499,12 +499,20 @@ void Form::processReceipt(const MTPDpayments_paymentReceipt &data) {
void Form::processReceipt(const MTPDpayments_paymentReceiptStars &data) { void Form::processReceipt(const MTPDpayments_paymentReceiptStars &data) {
_session->data().processUsers(data.vusers()); _session->data().processUsers(data.vusers());
data.vinvoice().match([&](const auto &data) { const auto receiptData = CreditsReceiptData{
processInvoice(data); .id = qs(data.vtransaction_id()),
}); .title = qs(data.vtitle()),
processDetails(data); .description = qs(data.vdescription()),
fillPaymentMethodInformation(); .photo = data.vphoto()
_updates.fire(FormReady{}); ? _session->data().photoFromWeb(
*data.vphoto(),
ImageLocation())
: nullptr,
.peerId = peerFromUser(data.vbot_id().v),
.credits = data.vtotal_amount().v,
.date = data.vdate().v,
};
_updates.fire(CreditsReceiptReady{ .data = receiptData });
} }
void Form::processInvoice(const MTPDinvoice &data) { void Form::processInvoice(const MTPDinvoice &data) {

View file

@ -187,6 +187,16 @@ struct CreditsFormData {
MTPInputInvoice inputInvoice; MTPInputInvoice inputInvoice;
}; };
struct CreditsReceiptData {
QString id;
QString title;
QString description;
PhotoData *photo = nullptr;
PeerId peerId = PeerId(0);
uint64 credits = 0;
TimeId date = 0;
};
struct ToggleProgress { struct ToggleProgress {
bool shown = true; bool shown = true;
}; };
@ -212,6 +222,9 @@ struct PaymentFinished {
struct CreditsPaymentStarted { struct CreditsPaymentStarted {
CreditsFormData data; CreditsFormData data;
}; };
struct CreditsReceiptReady {
CreditsReceiptData data;
};
struct Error { struct Error {
enum class Type { enum class Type {
None, None,
@ -244,6 +257,7 @@ struct FormUpdate : std::variant<
BotTrustRequired, BotTrustRequired,
PaymentFinished, PaymentFinished,
CreditsPaymentStarted, CreditsPaymentStarted,
CreditsReceiptReady,
Error> { Error> {
using variant::variant; using variant::variant;
}; };

View file

@ -7,18 +7,25 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/ */
#include "payments/payments_non_panel_process.h" #include "payments/payments_non_panel_process.h"
#include "base/unixtime.h"
#include "boxes/send_credits_box.h"
#include "data/data_credits.h"
#include "history/history_item.h"
#include "history/history_item_components.h"
#include "payments/payments_checkout_process.h" // NonPanelPaymentForm. #include "payments/payments_checkout_process.h" // NonPanelPaymentForm.
#include "payments/payments_form.h" #include "payments/payments_form.h"
#include "history/history_item.h" #include "settings/settings_credits.h"
#include "ui/layers/generic_box.h" #include "ui/layers/generic_box.h"
#include "ui/text/format_values.h" #include "ui/text/format_values.h"
#include "window/window_session_controller.h" #include "window/window_session_controller.h"
#include "boxes/send_credits_box.h"
namespace Payments { namespace Payments {
namespace { namespace {
bool IsCreditsInvoice(not_null<HistoryItem*> item) { bool IsCreditsInvoice(not_null<HistoryItem*> item) {
if (const auto payment = item->Get<HistoryServicePayment>()) {
return payment->isCreditsCurrency;
}
const auto media = item->media(); const auto media = item->media();
const auto invoice = media ? media->invoice() : nullptr; const auto invoice = media ? media->invoice() : nullptr;
return invoice && (invoice->currency == Ui::kCreditsCurrency); return invoice && (invoice->currency == Ui::kCreditsCurrency);
@ -30,9 +37,25 @@ Fn<void(NonPanelPaymentForm)> ProcessNonPanelPaymentFormFactory(
not_null<Window::SessionController*> controller) { not_null<Window::SessionController*> controller) {
return [=](NonPanelPaymentForm form) { return [=](NonPanelPaymentForm form) {
using CreditsFormDataPtr = std::shared_ptr<CreditsFormData>; using CreditsFormDataPtr = std::shared_ptr<CreditsFormData>;
using CreditsReceiptPtr = std::shared_ptr<CreditsReceiptData>;
if (const auto creditsData = std::get_if<CreditsFormDataPtr>(&form)) { if (const auto creditsData = std::get_if<CreditsFormDataPtr>(&form)) {
controller->uiShow()->show(Box(Ui::SendCreditsBox, *creditsData)); controller->uiShow()->show(Box(Ui::SendCreditsBox, *creditsData));
} }
if (const auto r = std::get_if<CreditsReceiptPtr>(&form)) {
const auto receipt = *r;
const auto entry = Data::CreditsHistoryEntry{
.id = receipt->id,
.credits = receipt->credits,
.date = base::unixtime::parse(receipt->date),
.peerType = Data::CreditsHistoryEntry::PeerType::Peer,
.bareId = receipt->peerId.value,
};
controller->uiShow()->show(Box(
Settings::ReceiptCreditsBox,
controller,
nullptr,
entry));
}
}; };
} }