96 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| This file is part of Telegram Desktop,
 | |
| the official desktop application for the Telegram messaging service.
 | |
| 
 | |
| For license and copyright information please follow this link:
 | |
| https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | |
| */
 | |
| #include "api/api_earn.h"
 | |
| 
 | |
| #include "api/api_cloud_password.h"
 | |
| #include "apiwrap.h"
 | |
| #include "boxes/passcode_box.h"
 | |
| #include "data/data_channel.h"
 | |
| #include "data/data_session.h"
 | |
| #include "lang/lang_keys.h"
 | |
| #include "main/main_session.h"
 | |
| #include "ui/basic_click_handlers.h"
 | |
| #include "ui/widgets/buttons.h"
 | |
| 
 | |
| namespace Api {
 | |
| 
 | |
| void RestrictSponsored(
 | |
| 		not_null<ChannelData*> channel,
 | |
| 		bool restricted,
 | |
| 		Fn<void(QString)> failed) {
 | |
| 	channel->session().api().request(MTPchannels_RestrictSponsoredMessages(
 | |
| 		channel->inputChannel,
 | |
| 		MTP_bool(restricted))
 | |
| 	).done([=](const MTPUpdates &updates) {
 | |
| 		channel->session().api().applyUpdates(updates);
 | |
| 	}).fail([=](const MTP::Error &error) {
 | |
| 		failed(error.type());
 | |
| 	}).send();
 | |
| }
 | |
| 
 | |
| void HandleWithdrawalButton(
 | |
| 		not_null<ChannelData*> channel,
 | |
| 		not_null<Ui::RippleButton*> button,
 | |
| 		std::shared_ptr<Ui::Show> show) {
 | |
| 	struct State {
 | |
| 		rpl::lifetime lifetime;
 | |
| 		bool loading = false;
 | |
| 	};
 | |
| 
 | |
| 	const auto state = button->lifetime().make_state<State>();
 | |
| 	const auto session = &channel->session();
 | |
| 
 | |
| 	session->api().cloudPassword().reload();
 | |
| 	button->setClickedCallback([=] {
 | |
| 		if (state->loading) {
 | |
| 			return;
 | |
| 		}
 | |
| 		state->loading = true;
 | |
| 		state->lifetime = session->api().cloudPassword().state(
 | |
| 		) | rpl::take(
 | |
| 			1
 | |
| 		) | rpl::start_with_next([=](const Core::CloudPasswordState &pass) {
 | |
| 			state->loading = false;
 | |
| 
 | |
| 			auto fields = PasscodeBox::CloudFields::From(pass);
 | |
| 			fields.customTitle
 | |
| 				= tr::lng_channel_earn_balance_password_title();
 | |
| 			fields.customDescription
 | |
| 				= tr::lng_channel_earn_balance_password_description(tr::now);
 | |
| 			fields.customSubmitButton = tr::lng_passcode_submit();
 | |
| 			fields.customCheckCallback = crl::guard(button, [=](
 | |
| 					const Core::CloudPasswordResult &result,
 | |
| 					QPointer<PasscodeBox> box) {
 | |
| 				const auto done = [=](const QString &result) {
 | |
| 					if (!result.isEmpty()) {
 | |
| 						UrlClickHandler::Open(result);
 | |
| 						if (box) {
 | |
| 							box->closeBox();
 | |
| 						}
 | |
| 					}
 | |
| 				};
 | |
| 				const auto fail = [=](const QString &error) {
 | |
| 					show->showToast(error);
 | |
| 				};
 | |
| 				session->api().request(
 | |
| 					MTPstats_GetBroadcastRevenueWithdrawalUrl(
 | |
| 						channel->inputChannel,
 | |
| 						result.result
 | |
| 				)).done([=](const MTPstats_BroadcastRevenueWithdrawalUrl &r) {
 | |
| 					done(qs(r.data().vurl()));
 | |
| 				}).fail([=](const MTP::Error &error) {
 | |
| 					fail(error.type());
 | |
| 				}).send();
 | |
| 			});
 | |
| 			show->show(Box<PasscodeBox>(session, fields));
 | |
| 		});
 | |
| 
 | |
| 	});
 | |
| }
 | |
| 
 | |
| } // namespace Api
 | 
