Reactivate window on payment close.

This commit is contained in:
John Preston 2021-03-31 09:56:45 +04:00
parent 619f70ab22
commit b08d9fe0b8
4 changed files with 57 additions and 26 deletions

View file

@ -122,7 +122,10 @@ void activateBotCommand(
} break; } break;
case ButtonType::Buy: { 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; } break;
case ButtonType::Url: { case ButtonType::Url: {

View file

@ -28,8 +28,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_changes.h" #include "data/data_changes.h"
#include "data/data_group_call.h" // Data::GroupCall::id(). #include "data/data_group_call.h" // Data::GroupCall::id().
#include "core/application.h" #include "core/application.h"
#include "core/click_handler_types.h"
#include "calls/calls_instance.h" // Core::App().calls().joinGroupCall. #include "calls/calls_instance.h" // Core::App().calls().joinGroupCall.
#include "window/notifications_manager.h" #include "window/notifications_manager.h"
#include "window/window_controller.h"
#include "window/window_session_controller.h" #include "window/window_session_controller.h"
#include "storage/storage_shared_media.h" #include "storage/storage_shared_media.h"
#include "payments/payments_checkout_process.h" // CheckoutProcess::Start. #include "payments/payments_checkout_process.h" // CheckoutProcess::Start.
@ -976,10 +978,16 @@ void HistoryService::createFromMtp(const MTPDmessageService &message) {
const auto id = fullId(); const auto id = fullId();
const auto owner = &history()->owner(); const auto owner = &history()->owner();
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) {
using namespace Payments; using namespace Payments;
const auto my = context.other.value<ClickHandlerContext>();
const auto weak = my.sessionWindow;
if (const auto item = owner->message(id)) { 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) { } else if (message.vaction().type() == mtpc_messageActionGroupCall) {

View file

@ -20,10 +20,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "core/file_utilities.h" // File::OpenUrl. #include "core/file_utilities.h" // File::OpenUrl.
#include "apiwrap.h" #include "apiwrap.h"
// #TODO payments errors
#include "mainwindow.h"
#include "ui/toasts/common_toasts.h"
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QJsonArray> #include <QJsonArray>
@ -57,7 +53,10 @@ base::flat_map<not_null<Main::Session*>, SessionProcesses> Processes;
} // namespace } // namespace
void CheckoutProcess::Start(not_null<const HistoryItem*> item, Mode mode) { void CheckoutProcess::Start(
not_null<const HistoryItem*> item,
Mode mode,
Fn<void()> reactivate) {
auto &processes = LookupSessionProcesses(item); auto &processes = LookupSessionProcesses(item);
const auto session = &item->history()->session(); const auto session = &item->history()->session();
const auto media = item->media(); const auto media = item->media();
@ -76,6 +75,7 @@ void CheckoutProcess::Start(not_null<const HistoryItem*> item, Mode mode) {
} }
const auto i = processes.map.find(id); const auto i = processes.map.find(id);
if (i != end(processes.map)) { if (i != end(processes.map)) {
i->second->setReactivateCallback(std::move(reactivate));
i->second->requestActivate(); i->second->requestActivate();
return; return;
} }
@ -85,6 +85,7 @@ void CheckoutProcess::Start(not_null<const HistoryItem*> item, Mode mode) {
item->history()->peer, item->history()->peer,
id.msg, id.msg,
mode, mode,
std::move(reactivate),
PrivateTag{})).first; PrivateTag{})).first;
j->second->requestActivate(); j->second->requestActivate();
} }
@ -93,10 +94,12 @@ CheckoutProcess::CheckoutProcess(
not_null<PeerData*> peer, not_null<PeerData*> peer,
MsgId itemId, MsgId itemId,
Mode mode, Mode mode,
Fn<void()> reactivate,
PrivateTag) PrivateTag)
: _session(&peer->session()) : _session(&peer->session())
, _form(std::make_unique<Form>(peer, itemId, (mode == Mode::Receipt))) , _form(std::make_unique<Form>(peer, itemId, (mode == Mode::Receipt)))
, _panel(std::make_unique<Ui::Panel>(panelDelegate())) { , _panel(std::make_unique<Ui::Panel>(panelDelegate()))
, _reactivate(std::move(reactivate)) {
_form->updates( _form->updates(
) | rpl::start_with_next([=](const FormUpdate &update) { ) | rpl::start_with_next([=](const FormUpdate &update) {
handleFormUpdate(update); handleFormUpdate(update);
@ -111,6 +114,10 @@ CheckoutProcess::CheckoutProcess(
CheckoutProcess::~CheckoutProcess() { CheckoutProcess::~CheckoutProcess() {
} }
void CheckoutProcess::setReactivateCallback(Fn<void()> reactivate) {
_reactivate = std::move(reactivate);
}
void CheckoutProcess::requestActivate() { void CheckoutProcess::requestActivate() {
_panel->requestActivate(); _panel->requestActivate();
} }
@ -141,13 +148,14 @@ void CheckoutProcess::handleFormUpdate(const FormUpdate &update) {
}, [&](const VerificationNeeded &data) { }, [&](const VerificationNeeded &data) {
if (!_panel->showWebview(data.url, false)) { if (!_panel->showWebview(data.url, false)) {
File::OpenUrl(data.url); File::OpenUrl(data.url);
panelCloseSure(); close();
} }
}, [&](const PaymentFinished &data) { }, [&](const PaymentFinished &data) {
const auto weak = base::make_weak(this); const auto weak = base::make_weak(this);
_session->api().applyUpdates(data.updates); _session->api().applyUpdates(data.updates);
if (weak) { if (weak) {
panelCloseSure(); closeAndReactivate();
if (_reactivate) _reactivate();
} }
}, [&](const Error &error) { }, [&](const Error &error) {
handleError(error); handleError(error);
@ -156,13 +164,8 @@ void CheckoutProcess::handleFormUpdate(const FormUpdate &update) {
void CheckoutProcess::handleError(const Error &error) { void CheckoutProcess::handleError(const Error &error) {
const auto showToast = [&](const TextWithEntities &text) { const auto showToast = [&](const TextWithEntities &text) {
if (_panel) { _panel->requestActivate();
_panel->requestActivate(); _panel->showToast(text);
_panel->showToast(text);
} else {
App::wnd()->activate();
Ui::ShowMultilineToast({ .text = text });
}
}; };
const auto &id = error.id; const auto &id = error.id;
switch (error.type) { switch (error.type) {
@ -267,6 +270,18 @@ void CheckoutProcess::panelRequestClose() {
} }
void CheckoutProcess::panelCloseSure() { 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); const auto i = Processes.find(_session);
if (i == end(Processes)) { if (i == end(Processes)) {
return; return;
@ -285,7 +300,7 @@ void CheckoutProcess::panelCloseSure() {
void CheckoutProcess::panelSubmit() { void CheckoutProcess::panelSubmit() {
if (_form->invoice().receipt.paid) { if (_form->invoice().receipt.paid) {
panelCloseSure(); closeAndReactivate();
return; return;
} else if (_submitState == SubmitState::Validation } else if (_submitState == SubmitState::Validation
|| _submitState == SubmitState::Finishing) { || _submitState == SubmitState::Finishing) {
@ -366,10 +381,7 @@ bool CheckoutProcess::panelWebviewNavigationAttempt(const QString &uri) {
if (Core::TryConvertUrlToLocal(uri) == uri) { if (Core::TryConvertUrlToLocal(uri) == uri) {
return true; return true;
} }
crl::on_main(this, [=] { crl::on_main(this, [=] { closeAndReactivate(); });
panelCloseSure();
App::wnd()->activate();
});
return false; return false;
} }

View file

@ -39,17 +39,19 @@ class CheckoutProcess final
struct PrivateTag {}; struct PrivateTag {};
public: public:
static void Start(not_null<const HistoryItem*> item, Mode mode); static void Start(
not_null<const HistoryItem*> item,
Mode mode,
Fn<void()> reactivate);
CheckoutProcess( CheckoutProcess(
not_null<PeerData*> peer, not_null<PeerData*> peer,
MsgId itemId, MsgId itemId,
Mode mode, Mode mode,
Fn<void()> reactivate,
PrivateTag); PrivateTag);
~CheckoutProcess(); ~CheckoutProcess();
void requestActivate();
private: private:
enum class SubmitState { enum class SubmitState {
None, None,
@ -59,6 +61,11 @@ private:
}; };
[[nodiscard]] not_null<PanelDelegate*> panelDelegate(); [[nodiscard]] not_null<PanelDelegate*> panelDelegate();
void setReactivateCallback(Fn<void()> reactivate);
void requestActivate();
void closeAndReactivate();
void close();
void handleFormUpdate(const FormUpdate &update); void handleFormUpdate(const FormUpdate &update);
void handleError(const Error &error); void handleError(const Error &error);
@ -97,6 +104,7 @@ private:
const not_null<Main::Session*> _session; const not_null<Main::Session*> _session;
const std::unique_ptr<Form> _form; const std::unique_ptr<Form> _form;
const std::unique_ptr<Ui::Panel> _panel; const std::unique_ptr<Ui::Panel> _panel;
Fn<void()> _reactivate;
SubmitState _submitState = SubmitState::None; SubmitState _submitState = SubmitState::None;
bool _initialSilentValidation = false; bool _initialSilentValidation = false;