167 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
	
		
			3.9 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 "ui/boxes/confirm_phone_box.h"
 | |
| 
 | |
| #include "ui/boxes/confirm_box.h"
 | |
| #include "ui/widgets/buttons.h"
 | |
| #include "ui/widgets/labels.h"
 | |
| #include "ui/text/format_values.h" // Ui::FormatPhone
 | |
| #include "ui/text/text_utilities.h"
 | |
| #include "lang/lang_keys.h"
 | |
| #include "styles/style_layers.h"
 | |
| #include "styles/style_boxes.h"
 | |
| 
 | |
| namespace Ui {
 | |
| 
 | |
| ConfirmPhoneBox::ConfirmPhoneBox(
 | |
| 	QWidget*,
 | |
| 	const QString &phone,
 | |
| 	int codeLength,
 | |
| 	std::optional<int> timeout)
 | |
| : _phone(phone)
 | |
| , _sentCodeLength(codeLength)
 | |
| , _call([this] { sendCall(); }, [this] { update(); }) {
 | |
| 	if (timeout) {
 | |
| 		_call.setStatus({ Ui::SentCodeCall::State::Waiting, *timeout });
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void ConfirmPhoneBox::sendCall() {
 | |
| 	_resendRequests.fire({});
 | |
| }
 | |
| 
 | |
| void ConfirmPhoneBox::prepare() {
 | |
| 	_about.create(
 | |
| 		this,
 | |
| 		tr::lng_confirm_phone_about(
 | |
| 			lt_phone,
 | |
| 			rpl::single(Ui::Text::Bold(Ui::FormatPhone(_phone))),
 | |
| 			Ui::Text::WithEntities),
 | |
| 		st::confirmPhoneAboutLabel);
 | |
| 
 | |
| 	_code.create(this, st::confirmPhoneCodeField, tr::lng_code_ph());
 | |
| 	_code->setAutoSubmit(_sentCodeLength, [=] { sendCode(); });
 | |
| 	_code->setChangedCallback([=] { showError(QString()); });
 | |
| 
 | |
| 	setTitle(tr::lng_confirm_phone_title());
 | |
| 
 | |
| 	addButton(tr::lng_confirm_phone_send(), [=] { sendCode(); });
 | |
| 	addButton(tr::lng_cancel(), [=] { closeBox(); });
 | |
| 
 | |
| 	setDimensions(
 | |
| 		st::boxWidth,
 | |
| 		st::usernamePadding.top()
 | |
| 			+ _code->height()
 | |
| 			+ st::usernameSkip
 | |
| 			+ _about->height()
 | |
| 			+ st::usernameSkip);
 | |
| 
 | |
| 	connect(_code, &Ui::InputField::submitted, [=] { sendCode(); });
 | |
| 
 | |
| 	showChildren();
 | |
| }
 | |
| 
 | |
| void ConfirmPhoneBox::sendCode() {
 | |
| 	if (_isWaitingCheck) {
 | |
| 		return;
 | |
| 	}
 | |
| 	const auto code = _code->getDigitsOnly();
 | |
| 	if (code.isEmpty()) {
 | |
| 		_code->showError();
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	_code->setDisabled(true);
 | |
| 	setFocus();
 | |
| 
 | |
| 	showError(QString());
 | |
| 
 | |
| 	_checkRequests.fire_copy(code);
 | |
| 	_isWaitingCheck = true;
 | |
| }
 | |
| 
 | |
| void ConfirmPhoneBox::showError(const QString &error) {
 | |
| 	_error = error;
 | |
| 	if (!_error.isEmpty()) {
 | |
| 		_code->showError();
 | |
| 	}
 | |
| 	update();
 | |
| }
 | |
| 
 | |
| void ConfirmPhoneBox::paintEvent(QPaintEvent *e) {
 | |
| 	BoxContent::paintEvent(e);
 | |
| 
 | |
| 	Painter p(this);
 | |
| 
 | |
| 	p.setFont(st::boxTextFont);
 | |
| 	const auto callText = _call.getText();
 | |
| 	if (!callText.isEmpty()) {
 | |
| 		p.setPen(st::usernameDefaultFg);
 | |
| 		const auto callTextRect = QRect(
 | |
| 			st::usernamePadding.left(),
 | |
| 			_about->y() + _about->height(),
 | |
| 			width() - 2 * st::usernamePadding.left(),
 | |
| 			st::usernameSkip);
 | |
| 		p.drawText(callTextRect, callText, style::al_left);
 | |
| 	}
 | |
| 	auto errorText = _error;
 | |
| 	if (errorText.isEmpty()) {
 | |
| 		p.setPen(st::usernameDefaultFg);
 | |
| 		errorText = tr::lng_confirm_phone_enter_code(tr::now);
 | |
| 	} else {
 | |
| 		p.setPen(st::boxTextFgError);
 | |
| 	}
 | |
| 	const auto errorTextRect = QRect(
 | |
| 		st::usernamePadding.left(),
 | |
| 		_code->y() + _code->height(),
 | |
| 		width() - 2 * st::usernamePadding.left(),
 | |
| 		st::usernameSkip);
 | |
| 	p.drawText(errorTextRect, errorText, style::al_left);
 | |
| }
 | |
| 
 | |
| void ConfirmPhoneBox::resizeEvent(QResizeEvent *e) {
 | |
| 	BoxContent::resizeEvent(e);
 | |
| 
 | |
| 	_code->resize(
 | |
| 		width() - st::usernamePadding.left() - st::usernamePadding.right(),
 | |
| 		_code->height());
 | |
| 	_code->moveToLeft(st::usernamePadding.left(), st::usernamePadding.top());
 | |
| 
 | |
| 	_about->moveToLeft(
 | |
| 		st::usernamePadding.left(),
 | |
| 		_code->y() + _code->height() + st::usernameSkip);
 | |
| }
 | |
| 
 | |
| void ConfirmPhoneBox::setInnerFocus() {
 | |
| 	_code->setFocusFast();
 | |
| }
 | |
| 
 | |
| rpl::producer<QString> ConfirmPhoneBox::checkRequests() const {
 | |
| 	return _checkRequests.events();
 | |
| }
 | |
| 
 | |
| rpl::producer<> ConfirmPhoneBox::resendRequests() const {
 | |
| 	return _resendRequests.events();
 | |
| }
 | |
| 
 | |
| void ConfirmPhoneBox::callDone() {
 | |
| 	_call.callDone();
 | |
| }
 | |
| 
 | |
| void ConfirmPhoneBox::showServerError(const QString &text) {
 | |
| 	_isWaitingCheck = false;
 | |
| 	_code->setDisabled(false);
 | |
| 	_code->setFocus();
 | |
| 	showError(text);
 | |
| }
 | |
| 
 | |
| QString ConfirmPhoneBox::getPhone() const {
 | |
| 	return _phone;
 | |
| }
 | |
| 
 | |
| } // namespace Ui
 | 
