From b08d9fe0b8e88b08eb78ec1050f0d8c4ab1dd3b1 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 31 Mar 2021 09:56:45 +0400 Subject: [PATCH] Reactivate window on payment close. --- Telegram/SourceFiles/facades.cpp | 5 +- .../SourceFiles/history/history_service.cpp | 12 ++++- .../payments/payments_checkout_process.cpp | 52 ++++++++++++------- .../payments/payments_checkout_process.h | 14 +++-- 4 files changed, 57 insertions(+), 26 deletions(-) diff --git a/Telegram/SourceFiles/facades.cpp b/Telegram/SourceFiles/facades.cpp index 023f2da4fd..c6535155db 100644 --- a/Telegram/SourceFiles/facades.cpp +++ b/Telegram/SourceFiles/facades.cpp @@ -122,7 +122,10 @@ void activateBotCommand( } break; case ButtonType::Buy: { - Payments::CheckoutProcess::Start(msg, Payments::Mode::Payment); + Payments::CheckoutProcess::Start( + msg, + Payments::Mode::Payment, + crl::guard(App::wnd(), [] { App::wnd()->activate(); })); } break; case ButtonType::Url: { diff --git a/Telegram/SourceFiles/history/history_service.cpp b/Telegram/SourceFiles/history/history_service.cpp index 52d4749819..e6d227278b 100644 --- a/Telegram/SourceFiles/history/history_service.cpp +++ b/Telegram/SourceFiles/history/history_service.cpp @@ -28,8 +28,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_changes.h" #include "data/data_group_call.h" // Data::GroupCall::id(). #include "core/application.h" +#include "core/click_handler_types.h" #include "calls/calls_instance.h" // Core::App().calls().joinGroupCall. #include "window/notifications_manager.h" +#include "window/window_controller.h" #include "window/window_session_controller.h" #include "storage/storage_shared_media.h" #include "payments/payments_checkout_process.h" // CheckoutProcess::Start. @@ -976,10 +978,16 @@ void HistoryService::createFromMtp(const MTPDmessageService &message) { const auto id = fullId(); const auto owner = &history()->owner(); payment->amount = Ui::FillAmountAndCurrency(amount, currency); - payment->invoiceLink = std::make_shared([=] { + payment->invoiceLink = std::make_shared([=]( + ClickContext context) { using namespace Payments; + const auto my = context.other.value(); + const auto weak = my.sessionWindow; if (const auto item = owner->message(id)) { - CheckoutProcess::Start(item, Mode::Receipt); + CheckoutProcess::Start( + item, + Mode::Receipt, + crl::guard(weak, [=] { weak->window().activate(); })); } }); } else if (message.vaction().type() == mtpc_messageActionGroupCall) { diff --git a/Telegram/SourceFiles/payments/payments_checkout_process.cpp b/Telegram/SourceFiles/payments/payments_checkout_process.cpp index ac51ff9cfc..6eb4ab7a40 100644 --- a/Telegram/SourceFiles/payments/payments_checkout_process.cpp +++ b/Telegram/SourceFiles/payments/payments_checkout_process.cpp @@ -20,10 +20,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/file_utilities.h" // File::OpenUrl. #include "apiwrap.h" -// #TODO payments errors -#include "mainwindow.h" -#include "ui/toasts/common_toasts.h" - #include #include #include @@ -57,7 +53,10 @@ base::flat_map, SessionProcesses> Processes; } // namespace -void CheckoutProcess::Start(not_null item, Mode mode) { +void CheckoutProcess::Start( + not_null item, + Mode mode, + Fn reactivate) { auto &processes = LookupSessionProcesses(item); const auto session = &item->history()->session(); const auto media = item->media(); @@ -76,6 +75,7 @@ void CheckoutProcess::Start(not_null item, Mode mode) { } const auto i = processes.map.find(id); if (i != end(processes.map)) { + i->second->setReactivateCallback(std::move(reactivate)); i->second->requestActivate(); return; } @@ -85,6 +85,7 @@ void CheckoutProcess::Start(not_null item, Mode mode) { item->history()->peer, id.msg, mode, + std::move(reactivate), PrivateTag{})).first; j->second->requestActivate(); } @@ -93,10 +94,12 @@ CheckoutProcess::CheckoutProcess( not_null peer, MsgId itemId, Mode mode, + Fn reactivate, PrivateTag) : _session(&peer->session()) , _form(std::make_unique
(peer, itemId, (mode == Mode::Receipt))) -, _panel(std::make_unique(panelDelegate())) { +, _panel(std::make_unique(panelDelegate())) +, _reactivate(std::move(reactivate)) { _form->updates( ) | rpl::start_with_next([=](const FormUpdate &update) { handleFormUpdate(update); @@ -111,6 +114,10 @@ CheckoutProcess::CheckoutProcess( CheckoutProcess::~CheckoutProcess() { } +void CheckoutProcess::setReactivateCallback(Fn reactivate) { + _reactivate = std::move(reactivate); +} + void CheckoutProcess::requestActivate() { _panel->requestActivate(); } @@ -141,13 +148,14 @@ void CheckoutProcess::handleFormUpdate(const FormUpdate &update) { }, [&](const VerificationNeeded &data) { if (!_panel->showWebview(data.url, false)) { File::OpenUrl(data.url); - panelCloseSure(); + close(); } }, [&](const PaymentFinished &data) { const auto weak = base::make_weak(this); _session->api().applyUpdates(data.updates); if (weak) { - panelCloseSure(); + closeAndReactivate(); + if (_reactivate) _reactivate(); } }, [&](const Error &error) { handleError(error); @@ -156,13 +164,8 @@ void CheckoutProcess::handleFormUpdate(const FormUpdate &update) { void CheckoutProcess::handleError(const Error &error) { const auto showToast = [&](const TextWithEntities &text) { - if (_panel) { - _panel->requestActivate(); - _panel->showToast(text); - } else { - App::wnd()->activate(); - Ui::ShowMultilineToast({ .text = text }); - } + _panel->requestActivate(); + _panel->showToast(text); }; const auto &id = error.id; switch (error.type) { @@ -267,6 +270,18 @@ void CheckoutProcess::panelRequestClose() { } void CheckoutProcess::panelCloseSure() { + closeAndReactivate(); +} + +void CheckoutProcess::closeAndReactivate() { + const auto reactivate = std::move(_reactivate); + close(); + if (reactivate) { + reactivate(); + } +} + +void CheckoutProcess::close() { const auto i = Processes.find(_session); if (i == end(Processes)) { return; @@ -285,7 +300,7 @@ void CheckoutProcess::panelCloseSure() { void CheckoutProcess::panelSubmit() { if (_form->invoice().receipt.paid) { - panelCloseSure(); + closeAndReactivate(); return; } else if (_submitState == SubmitState::Validation || _submitState == SubmitState::Finishing) { @@ -366,10 +381,7 @@ bool CheckoutProcess::panelWebviewNavigationAttempt(const QString &uri) { if (Core::TryConvertUrlToLocal(uri) == uri) { return true; } - crl::on_main(this, [=] { - panelCloseSure(); - App::wnd()->activate(); - }); + crl::on_main(this, [=] { closeAndReactivate(); }); return false; } diff --git a/Telegram/SourceFiles/payments/payments_checkout_process.h b/Telegram/SourceFiles/payments/payments_checkout_process.h index 53e85ed3c7..ea5ca02e11 100644 --- a/Telegram/SourceFiles/payments/payments_checkout_process.h +++ b/Telegram/SourceFiles/payments/payments_checkout_process.h @@ -39,17 +39,19 @@ class CheckoutProcess final struct PrivateTag {}; public: - static void Start(not_null item, Mode mode); + static void Start( + not_null item, + Mode mode, + Fn reactivate); CheckoutProcess( not_null peer, MsgId itemId, Mode mode, + Fn reactivate, PrivateTag); ~CheckoutProcess(); - void requestActivate(); - private: enum class SubmitState { None, @@ -59,6 +61,11 @@ private: }; [[nodiscard]] not_null panelDelegate(); + void setReactivateCallback(Fn reactivate); + void requestActivate(); + void closeAndReactivate(); + void close(); + void handleFormUpdate(const FormUpdate &update); void handleError(const Error &error); @@ -97,6 +104,7 @@ private: const not_null _session; const std::unique_ptr _form; const std::unique_ptr _panel; + Fn _reactivate; SubmitState _submitState = SubmitState::None; bool _initialSilentValidation = false;