mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Reactivate window on payment close.
This commit is contained in:
parent
619f70ab22
commit
b08d9fe0b8
4 changed files with 57 additions and 26 deletions
|
@ -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: {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue