From 11fd757e999ed62eccf1527051625e4d9a5dde37 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Tue, 10 Apr 2018 21:11:43 +0400
Subject: [PATCH] Use Ui::PhoneInput for passport phone edit.

---
 .../passport/passport_panel_controller.cpp    |  4 +-
 .../passport/passport_panel_edit_contact.cpp  | 55 +++++++++++++------
 .../passport/passport_panel_edit_contact.h    |  8 ++-
 3 files changed, 46 insertions(+), 21 deletions(-)

diff --git a/Telegram/SourceFiles/passport/passport_panel_controller.cpp b/Telegram/SourceFiles/passport/passport_panel_controller.cpp
index fbf976dfd..b1b61f7a6 100644
--- a/Telegram/SourceFiles/passport/passport_panel_controller.cpp
+++ b/Telegram/SourceFiles/passport/passport_panel_controller.cpp
@@ -188,7 +188,7 @@ PanelEditContact::Scheme GetContactScheme(Scope::Type type) {
 	using Scheme = PanelEditContact::Scheme;
 	switch (type) {
 	case Scope::Type::Phone: {
-		auto result = Scheme();
+		auto result = Scheme(Scheme::ValueType::Phone);
 		result.aboutExisting = lang(lng_passport_use_existing_phone);
 		result.newHeader = lang(lng_passport_new_phone);
 		result.aboutNew = lang(lng_passport_new_phone_code);
@@ -207,7 +207,7 @@ PanelEditContact::Scheme GetContactScheme(Scope::Type type) {
 	} break;
 
 	case Scope::Type::Email: {
-		auto result = Scheme();
+		auto result = Scheme(Scheme::ValueType::Text);
 		result.aboutExisting = lang(lng_passport_use_existing_email);
 		result.newHeader = lang(lng_passport_new_email);
 		result.newPlaceholder = langFactory(lng_passport_email_title);
diff --git a/Telegram/SourceFiles/passport/passport_panel_edit_contact.cpp b/Telegram/SourceFiles/passport/passport_panel_edit_contact.cpp
index 807e7e682..a65aea64f 100644
--- a/Telegram/SourceFiles/passport/passport_panel_edit_contact.cpp
+++ b/Telegram/SourceFiles/passport/passport_panel_edit_contact.cpp
@@ -154,6 +154,9 @@ void VerifyBox::prepare() {
 
 } // namespace
 
+PanelEditContact::Scheme::Scheme(ValueType type) : type(type) {
+}
+
 PanelEditContact::PanelEditContact(
 	QWidget*,
 	not_null<PanelController*> controller,
@@ -216,22 +219,42 @@ void PanelEditContact::setupControls(
 				Ui::FlatLabel::InitType::Simple,
 				st::passportFormHeader),
 			st::passportDetailsHeaderPadding);
-		_field = _content->add(
-			object_ptr<Ui::InputField>(
-				_content,
-				st::passportDetailsField,
-				nullptr,
-				data),
-			st::passportContactNewFieldPadding);
-	} else {
-		_field = _content->add(
-			object_ptr<Ui::InputField>(
-				_content,
-				st::passportContactField,
-				_scheme.newPlaceholder,
-				data),
-			st::passportContactFieldPadding);
 	}
+	const auto &fieldStyle = existing.isEmpty()
+		? st::passportContactField
+		: st::passportDetailsField;
+	const auto fieldPadding = existing.isEmpty()
+		? st::passportContactFieldPadding
+		: st::passportContactNewFieldPadding;
+	const auto fieldPlaceholder = existing.isEmpty()
+		? _scheme.newPlaceholder
+		: nullptr;
+	auto wrap = object_ptr<Ui::RpWidget>(_content);
+	if (_scheme.type == Scheme::ValueType::Phone) {
+		_field = Ui::CreateChild<Ui::PhoneInput>(
+			wrap.data(),
+			fieldStyle,
+			fieldPlaceholder,
+			data);
+	} else {
+		_field = Ui::CreateChild<Ui::MaskedInputField>(
+			wrap.data(),
+			fieldStyle,
+			fieldPlaceholder,
+			data);
+	}
+
+	_field->move(0, 0);
+	_field->heightValue(
+	) | rpl::start_with_next([=, pointer = wrap.data()](int height) {
+		pointer->resize(pointer->width(), height);
+	}, _field->lifetime());
+	wrap->widthValue(
+	) | rpl::start_with_next([=](int width) {
+		_field->resize(width, _field->height());
+	}, _field->lifetime());
+
+	_content->add(std::move(wrap), fieldPadding);
 	_content->add(
 		object_ptr<PanelLabel>(
 			_content,
@@ -247,7 +270,7 @@ void PanelEditContact::setupControls(
 			save();
 		});
 	};
-	connect(_field, &Ui::InputField::submitted, submit);
+	connect(_field, &Ui::MaskedInputField::submitted, submit);
 	_done->addClickHandler(submit);
 }
 
diff --git a/Telegram/SourceFiles/passport/passport_panel_edit_contact.h b/Telegram/SourceFiles/passport/passport_panel_edit_contact.h
index 364f8733f..8fe06f5a3 100644
--- a/Telegram/SourceFiles/passport/passport_panel_edit_contact.h
+++ b/Telegram/SourceFiles/passport/passport_panel_edit_contact.h
@@ -10,7 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "ui/rp_widget.h"
 
 namespace Ui {
-class InputField;
+class MaskedInputField;
 class PlainShadow;
 class RoundButton;
 class VerticalLayout;
@@ -27,7 +27,9 @@ public:
 			Phone,
 			Text,
 		};
-		ValueType type = ValueType::Phone;
+		explicit Scheme(ValueType type);
+
+		ValueType type;
 
 		QString aboutExisting;
 		QString newHeader;
@@ -63,7 +65,7 @@ private:
 	Scheme _scheme;
 
 	object_ptr<Ui::VerticalLayout> _content;
-	QPointer<Ui::InputField> _field;
+	QPointer<Ui::MaskedInputField> _field;
 	object_ptr<Ui::PlainShadow> _bottomShadow;
 	object_ptr<Ui::RoundButton> _done;