diff options
Diffstat (limited to 'Telegram/SourceFiles/payments/payments_form.cpp')
-rw-r--r-- | Telegram/SourceFiles/payments/payments_form.cpp | 70 |
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{ |