summaryrefslogtreecommitdiffstats
path: root/Telegram/SourceFiles/payments/payments_form.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Telegram/SourceFiles/payments/payments_form.cpp')
-rw-r--r--Telegram/SourceFiles/payments/payments_form.cpp70
1 files changed, 68 insertions, 2 deletions
diff --git a/Telegram/SourceFiles/payments/payments_form.cpp b/Telegram/SourceFiles/payments/payments_form.cpp
index 3cc62685e2..604bba091d 100644
--- a/Telegram/SourceFiles/payments/payments_form.cpp
+++ b/Telegram/SourceFiles/payments/payments_form.cpp
@@ -94,7 +94,11 @@ Form::Form(not_null<Main::Session*> session, FullMsgId itemId)
, _api(&_session->mtp())
, _msgId(itemId) {
fillInvoiceFromMessage();
- requestForm();
+ if (_receiptMsgId) {
+ requestReceipt();
+ } else {
+ requestForm();
+ }
}
Form::~Form() = default;
@@ -103,10 +107,16 @@ void Form::fillInvoiceFromMessage() {
if (const auto item = _session->data().message(_msgId)) {
if (const auto media = item->media()) {
if (const auto invoice = media->invoice()) {
+ _receiptMsgId = FullMsgId(
+ _msgId.channel,
+ invoice->receiptMsgId);
_invoice.cover = Ui::Cover{
.title = invoice->title,
.description = invoice->description,
};
+ if (_receiptMsgId) {
+ _invoice.receipt.paid = true;
+ }
if (const auto photo = invoice->photo) {
loadThumbnail(photo);
}
@@ -205,6 +215,18 @@ void Form::requestForm() {
}).send();
}
+void Form::requestReceipt() {
+ _api.request(MTPpayments_GetPaymentReceipt(
+ MTP_int(_receiptMsgId.msg)
+ )).done([=](const MTPpayments_PaymentReceipt &result) {
+ result.match([&](const auto &data) {
+ processReceipt(data);
+ });
+ }).fail([=](const MTP::Error &error) {
+ _updates.fire(Error{ Error::Type::Form, error.type() });
+ }).send();
+}
+
void Form::processForm(const MTPDpayments_paymentForm &data) {
_session->data().processUsers(data.vusers());
@@ -226,6 +248,32 @@ void Form::processForm(const MTPDpayments_paymentForm &data) {
_updates.fire(FormReady{});
}
+void Form::processReceipt(const MTPDpayments_paymentReceipt &data) {
+ _session->data().processUsers(data.vusers());
+
+ data.vinvoice().match([&](const auto &data) {
+ processInvoice(data);
+ });
+ processDetails(data);
+ if (const auto info = data.vinfo()) {
+ info->match([&](const auto &data) {
+ processSavedInformation(data);
+ });
+ }
+ if (const auto shipping = data.vshipping()) {
+ processShippingOptions({ *shipping });
+ if (!_shippingOptions.list.empty()) {
+ _shippingOptions.selectedId = _shippingOptions.list.front().id;
+ }
+ }
+ _paymentMethod.savedCredentials = SavedCredentials{
+ .id = "(used)",
+ .title = qs(data.vcredentials_title()),
+ };
+ fillPaymentMethodInformation();
+ _updates.fire(FormReady{});
+}
+
void Form::processInvoice(const MTPDinvoice &data) {
_invoice = Ui::Invoice{
.cover = std::move(_invoice.cover),
@@ -246,7 +294,6 @@ void Form::processInvoice(const MTPDinvoice &data) {
}
void Form::processDetails(const MTPDpayments_paymentForm &data) {
- _session->data().processUsers(data.vusers());
const auto nativeParams = data.vnative_params();
auto nativeParamsJson = nativeParams
? nativeParams->match(
@@ -268,6 +315,25 @@ void Form::processDetails(const MTPDpayments_paymentForm &data) {
}
}
+void Form::processDetails(const MTPDpayments_paymentReceipt &data) {
+ _invoice.receipt = Ui::Receipt{
+ .date = data.vdate().v,
+ .totalAmount = *reinterpret_cast<const int64*>(
+ &data.vtotal_amount().v),
+ .currency = qs(data.vcurrency()),
+ .paid = true,
+ };
+ _details = FormDetails{
+ .botId = data.vbot_id().v,
+ .providerId = data.vprovider_id().v,
+ };
+ if (_details.botId) {
+ if (const auto bot = _session->data().userLoaded(_details.botId)) {
+ _invoice.cover.seller = bot->name;
+ }
+ }
+}
+
void Form::processSavedInformation(const MTPDpaymentRequestedInfo &data) {
const auto address = data.vshipping_address();
_savedInformation = Ui::RequestedInformation{