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;
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: {

View File

@ -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<LambdaClickHandler>([=] {
payment->invoiceLink = std::make_shared<LambdaClickHandler>([=](
ClickContext context) {
using namespace Payments;
const auto my = context.other.value<ClickHandlerContext>();
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) {

View File

@ -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 <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
@ -57,7 +53,10 @@ base::flat_map<not_null<Main::Session*>, SessionProcesses> Processes;
} // 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);
const auto session = &item->history()->session();
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);
if (i != end(processes.map)) {
i->second->setReactivateCallback(std::move(reactivate));
i->second->requestActivate();
return;
}
@ -85,6 +85,7 @@ void CheckoutProcess::Start(not_null<const HistoryItem*> 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<PeerData*> peer,
MsgId itemId,
Mode mode,
Fn<void()> reactivate,
PrivateTag)
: _session(&peer->session())
, _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(
) | rpl::start_with_next([=](const FormUpdate &update) {
handleFormUpdate(update);
@ -111,6 +114,10 @@ CheckoutProcess::CheckoutProcess(
CheckoutProcess::~CheckoutProcess() {
}
void CheckoutProcess::setReactivateCallback(Fn<void()> 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;
}

View File

@ -39,17 +39,19 @@ class CheckoutProcess final
struct PrivateTag {};
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(
not_null<PeerData*> peer,
MsgId itemId,
Mode mode,
Fn<void()> reactivate,
PrivateTag);
~CheckoutProcess();
void requestActivate();
private:
enum class SubmitState {
None,
@ -59,6 +61,11 @@ private:
};
[[nodiscard]] not_null<PanelDelegate*> panelDelegate();
void setReactivateCallback(Fn<void()> 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<Main::Session*> _session;
const std::unique_ptr<Form> _form;
const std::unique_ptr<Ui::Panel> _panel;
Fn<void()> _reactivate;
SubmitState _submitState = SubmitState::None;
bool _initialSilentValidation = false;