From 64706ea10319501bea4ae148da9e8cbd92b43c20 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Wed, 22 Jan 2025 11:53:28 +0400
Subject: [PATCH] Add confirmation for go-to-Fragment.

---
 Telegram/Resources/langs/lang.strings         |  3 +
 .../SourceFiles/boxes/transfer_gift_box.cpp   | 55 +++++++++++++++----
 2 files changed, 46 insertions(+), 12 deletions(-)

diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings
index 6318aecd9..4e6603885 100644
--- a/Telegram/Resources/langs/lang.strings
+++ b/Telegram/Resources/langs/lang.strings
@@ -3376,6 +3376,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 "lng_gift_transfer_password_title" = "Two-step verification";
 "lng_gift_transfer_password_description" = "Please enter your password to transfer.";
 "lng_gift_transfer_password_about" = "You can withdraw only if you have:";
+"lng_gift_transfer_confirm_title" = "Manage with Fragment";
+"lng_gift_transfer_confirm_text" = "You can use Fragment, a third-party service, to transfer {name} to your TON account. After that, you can manage it as an NFT with any TON wallet outside Telegram.\n\nYou can also move such NFTs back to your Telegram account via Fragment.";
+"lng_gift_transfer_confirm_button" = "Open Fragment";
 "lng_gift_transfer_unlocks_days#one" = "unlocks in {count} day";
 "lng_gift_transfer_unlocks_days#other" = "unlocks in {count} days";
 "lng_gift_transfer_unlocks_hours#one" = "unlocks in {count} hour";
diff --git a/Telegram/SourceFiles/boxes/transfer_gift_box.cpp b/Telegram/SourceFiles/boxes/transfer_gift_box.cpp
index 2334dc7f7..005790d18 100644
--- a/Telegram/SourceFiles/boxes/transfer_gift_box.cpp
+++ b/Telegram/SourceFiles/boxes/transfer_gift_box.cpp
@@ -31,6 +31,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "window/window_session_controller.h"
 #include "styles/style_boxes.h" // peerListSingleRow.
 #include "styles/style_dialogs.h" // recentPeersSpecialName.
+#include "styles/style_layers.h" // boxLabel.
 
 namespace {
 
@@ -66,17 +67,42 @@ private:
 
 	const not_null<Window::SessionController*> _window;
 	const std::shared_ptr<Data::UniqueGift> _gift;
-	const Data::SavedStarGiftId _savedId;
+	const Data::SavedStarGiftId _giftId;
 	const Fn<void(not_null<PeerData*>)> _choose;
 	ExportOption _exportOption;
 
 };
 
+void ConfirmExportBox(
+		not_null<Ui::GenericBox*> box,
+		std::shared_ptr<Data::UniqueGift> gift,
+		const QString &url,
+		Fn<void()> wentToUrl) {
+	box->setTitle(tr::lng_gift_transfer_confirm_title());
+	box->addRow(object_ptr<Ui::FlatLabel>(
+		box,
+		tr::lng_gift_transfer_confirm_text(
+			lt_name,
+			rpl::single(Ui::Text::Bold(UniqueGiftName(*gift))),
+			Ui::Text::WithEntities),
+		st::boxLabel));
+	box->addButton(tr::lng_gift_transfer_confirm_button(), [=] {
+		UrlClickHandler::Open(url);
+		wentToUrl();
+		box->closeBox();
+	});
+	box->addButton(tr::lng_cancel(), [=] {
+		box->closeBox();
+	});
+}
+
 void ExportOnBlockchain(
 		not_null<Window::SessionController*> window,
 		not_null<Ui::RpWidget*> parent,
+		std::shared_ptr<Data::UniqueGift> gift,
 		Data::SavedStarGiftId giftId,
-		Fn<void()> waitFinished) {
+		Fn<void()> waitFinished,
+		Fn<void()> wentToUrl) {
 	struct State {
 		bool loading = false;
 		rpl::lifetime lifetime;
@@ -113,17 +139,16 @@ void ExportOnBlockchain(
 				= tr::lng_gift_transfer_password_description(tr::now);
 			fields.customSubmitButton = tr::lng_passcode_submit();
 			fields.customCheckCallback = crl::guard(parent, [=](
-				const Core::CloudPasswordResult &result,
-				QPointer<PasscodeBox> box) {
-				const auto done = [=](const QString &result) {
-				};
+					const Core::CloudPasswordResult &result,
+					QPointer<PasscodeBox> box) {
 				using ExportUrl = MTPpayments_StarGiftWithdrawalUrl;
 				session->api().request(
 					MTPpayments_GetStarGiftWithdrawalUrl(
 						Api::InputSavedStarGiftId(giftId),
 						result.result)
 				).done([=](const ExportUrl &result) {
-					UrlClickHandler::Open(qs(result.data().vurl()));
+					const auto url = qs(result.data().vurl());
+					show->show(Box(ConfirmExportBox, gift, url, wentToUrl));
 					if (box) {
 						box->closeBox();
 					}
@@ -141,7 +166,8 @@ void ExportOnBlockchain(
 
 [[nodiscard]] ExportOption MakeExportOption(
 		not_null<Window::SessionController*> window,
-		not_null<Ui::RpWidget*> parent,
+		not_null<PeerListBox*> box,
+		std::shared_ptr<Data::UniqueGift> gift,
 		Data::SavedStarGiftId giftId,
 		TimeId when) {
 	struct State {
@@ -150,6 +176,7 @@ void ExportOnBlockchain(
 	const auto state = std::make_shared<State>();
 	const auto activate = [=] {
 		const auto now = base::unixtime::now();
+		const auto weak = Ui::MakeWeak(box);
 		const auto left = (when > now) ? (when - now) : 0;
 		const auto hours = left ? std::max((left + 1800) / 3600, 1) : 0;
 		if (!hours) {
@@ -157,8 +184,12 @@ void ExportOnBlockchain(
 				return;
 			}
 			state->exporting = true;
-			ExportOnBlockchain(window, parent, giftId, [=] {
+			ExportOnBlockchain(window, box, gift, giftId, [=] {
 				state->exporting = false;
+			}, [=] {
+				if (const auto strong = weak.data()) {
+					strong->closeBox();
+				}
 			});
 			return;
 		}
@@ -319,12 +350,12 @@ void ExportOnBlockchain(
 Controller::Controller(
 	not_null<Window::SessionController*> window,
 	std::shared_ptr<Data::UniqueGift> gift,
-	Data::SavedStarGiftId savedId,
+	Data::SavedStarGiftId giftId,
 	Fn<void(not_null<PeerData*>)> choose)
 : ContactsBoxController(&window->session())
 , _window(window)
 , _gift(std::move(gift))
-, _savedId(savedId)
+, _giftId(giftId)
 , _choose(std::move(choose)) {
 	if (_gift->exportAt) {
 		setStyleOverrides(&st::peerListSmallSkips);
@@ -333,7 +364,7 @@ Controller::Controller(
 
 void Controller::initExport(not_null<PeerListBox*> box) {
 	if (const auto when = _gift->exportAt) {
-		_exportOption = MakeExportOption(_window, box, _savedId, when);
+		_exportOption = MakeExportOption(_window, box, _gift, _giftId, when);
 		delegate()->peerListSetAboveWidget(std::move(_exportOption.content));
 		delegate()->peerListRefreshRows();
 	}