mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-19 07:37:11 +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;
|
||||
|
||||
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: {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue