Add phone format and validation in payments.

This commit is contained in:
John Preston 2021-03-29 18:56:26 +04:00
parent 0af6c4b0b6
commit 1050447eed
5 changed files with 44 additions and 30 deletions

View file

@ -268,7 +268,7 @@ AddContactBox::AddContactBox(
this, this,
st::defaultInputField, st::defaultInputField,
tr::lng_contact_phone(), tr::lng_contact_phone(),
ExtractPhonePrefix(session->user()->phone()), Ui::ExtractPhonePrefix(session->user()->phone()),
phone) phone)
, _invertOrder(langFirstNameGoesSecond()) { , _invertOrder(langFirstNameGoesSecond()) {
if (!phone.isEmpty()) { if (!phone.isEmpty()) {

View file

@ -46,12 +46,24 @@ PhoneWidget::PhoneWidget(
, _code(this, st::introCountryCode) , _code(this, st::introCountryCode)
, _phone(this, st::introPhone) , _phone(this, st::introPhone)
, _checkRequestTimer([=] { checkRequest(); }) { , _checkRequestTimer([=] { checkRequest(); }) {
connect(_phone, SIGNAL(voidBackspace(QKeyEvent*)), _code, SLOT(startErasing(QKeyEvent*))); _phone->frontBackspaceEvent(
connect(_country, SIGNAL(codeChanged(const QString &)), _code, SLOT(codeSelected(const QString &))); ) | rpl::start_with_next([=](not_null<QKeyEvent*> e) {
connect(_code, SIGNAL(codeChanged(const QString &)), _country, SLOT(onChooseCode(const QString &))); _code->startErasing(e);
connect(_code, SIGNAL(codeChanged(const QString &)), _phone, SLOT(onChooseCode(const QString &))); }, _code->lifetime());
connect(_country, &CountryInput::codeChanged, [=](const QString &code) {
_code->codeSelected(code);
});
_code->codeChanged(
) | rpl::start_with_next([=](const QString &code) {
_country->onChooseCode(code);
_phone->chooseCode(code);
}, _code->lifetime());
connect(_country, SIGNAL(codeChanged(const QString &)), _phone, SLOT(onChooseCode(const QString &))); connect(_country, SIGNAL(codeChanged(const QString &)), _phone, SLOT(onChooseCode(const QString &)));
connect(_code, SIGNAL(addedToNumber(const QString &)), _phone, SLOT(addedToNumber(const QString &))); _code->addedToNumber(
) | rpl::start_with_next([=](const QString &added) {
_phone->addedToNumber(added);
}, _phone->lifetime());
connect(_phone, &Ui::PhonePartInput::changed, [=] { phoneChanged(); }); connect(_phone, &Ui::PhonePartInput::changed, [=] { phoneChanged(); });
connect(_code, &Ui::CountryCodeInput::changed, [=] { phoneChanged(); }); connect(_code, &Ui::CountryCodeInput::changed, [=] { phoneChanged(); });

View file

@ -295,7 +295,6 @@ void Form::refreshPaymentMethodDetails() {
const auto &entered = _paymentMethod.newCredentials; const auto &entered = _paymentMethod.newCredentials;
_paymentMethod.ui.title = entered ? entered.title : saved.title; _paymentMethod.ui.title = entered ? entered.title : saved.title;
_paymentMethod.ui.ready = entered || saved; _paymentMethod.ui.ready = entered || saved;
_paymentMethod.ui.native.defaultPhone = defaultPhone();
_paymentMethod.ui.native.defaultCountry = defaultCountry(); _paymentMethod.ui.native.defaultCountry = defaultCountry();
} }

View file

@ -30,8 +30,7 @@ constexpr auto kMaxPhoneCodeLength = 4;
CountryCodeInput::CountryCodeInput( CountryCodeInput::CountryCodeInput(
QWidget *parent, QWidget *parent,
const style::InputField &st) const style::InputField &st)
: MaskedInputField(parent, st) : MaskedInputField(parent, st) {
, _nosignal(false) {
} }
void CountryCodeInput::startErasing(QKeyEvent *e) { void CountryCodeInput::startErasing(QKeyEvent *e) {
@ -91,14 +90,15 @@ void CountryCodeInput::correctValue(
setCorrectedText(now, nowCursor, newText, newPos); setCorrectedText(now, nowCursor, newText, newPos);
if (!_nosignal && was != newText) { if (!_nosignal && was != newText) {
codeChanged(newText.mid(1)); _codeChanged.fire(newText.mid(1));
} }
if (!addToNumber.isEmpty()) { if (!addToNumber.isEmpty()) {
addedToNumber(addToNumber); _addedToNumber.fire_copy(addToNumber);
} }
} }
PhonePartInput::PhonePartInput(QWidget *parent, const style::InputField &st) : MaskedInputField(parent, st/*, tr::lng_phone_ph(tr::now)*/) { PhonePartInput::PhonePartInput(QWidget *parent, const style::InputField &st)
: MaskedInputField(parent, st/*, tr::lng_phone_ph(tr::now)*/) {
} }
void PhonePartInput::paintAdditionalPlaceholder(Painter &p) { void PhonePartInput::paintAdditionalPlaceholder(Painter &p) {
@ -119,8 +119,8 @@ void PhonePartInput::paintAdditionalPlaceholder(Painter &p) {
} }
void PhonePartInput::keyPressEvent(QKeyEvent *e) { void PhonePartInput::keyPressEvent(QKeyEvent *e) {
if (e->key() == Qt::Key_Backspace && getLastText().isEmpty()) { if (e->key() == Qt::Key_Backspace && cursorPosition() == 0) {
voidBackspace(e); _frontBackspaceEvent.fire_copy(e);
} else { } else {
MaskedInputField::keyPressEvent(e); MaskedInputField::keyPressEvent(e);
} }
@ -204,7 +204,7 @@ void PhonePartInput::addedToNumber(const QString &added) {
startPlaceholderAnimation(); startPlaceholderAnimation();
} }
void PhonePartInput::onChooseCode(const QString &code) { void PhonePartInput::chooseCode(const QString &code) {
_pattern = phoneNumberParse(code); _pattern = phoneNumberParse(code);
if (!_pattern.isEmpty() && _pattern.at(0) == code.size()) { if (!_pattern.isEmpty() && _pattern.at(0) == code.size()) {
_pattern.pop_front(); _pattern.pop_front();

View file

@ -12,18 +12,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace Ui { namespace Ui {
class CountryCodeInput : public MaskedInputField { class CountryCodeInput : public MaskedInputField {
Q_OBJECT
public: public:
CountryCodeInput(QWidget *parent, const style::InputField &st); CountryCodeInput(QWidget *parent, const style::InputField &st);
public Q_SLOTS:
void startErasing(QKeyEvent *e); void startErasing(QKeyEvent *e);
void codeSelected(const QString &code);
Q_SIGNALS: [[nodiscard]] rpl::producer<QString> addedToNumber() const {
void codeChanged(const QString &code); return _addedToNumber.events();
void addedToNumber(const QString &added); }
[[nodiscard]] rpl::producer<QString> codeChanged() const {
return _codeChanged.events();
}
void codeSelected(const QString &code);
protected: protected:
void correctValue( void correctValue(
@ -33,22 +34,23 @@ protected:
int &nowCursor) override; int &nowCursor) override;
private: private:
bool _nosignal; bool _nosignal = false;
rpl::event_stream<QString> _addedToNumber;
rpl::event_stream<QString> _codeChanged;
}; };
class PhonePartInput : public MaskedInputField { class PhonePartInput : public MaskedInputField {
Q_OBJECT
public: public:
PhonePartInput(QWidget *parent, const style::InputField &st); PhonePartInput(QWidget *parent, const style::InputField &st);
public Q_SLOTS: [[nodiscard]] auto frontBackspaceEvent() const
void addedToNumber(const QString &added); -> rpl::producer<not_null<QKeyEvent*>> {
void onChooseCode(const QString &code); return _frontBackspaceEvent.events();
}
Q_SIGNALS: void addedToNumber(const QString &added);
void voidBackspace(QKeyEvent *e); void chooseCode(const QString &code);
protected: protected:
void keyPressEvent(QKeyEvent *e) override; void keyPressEvent(QKeyEvent *e) override;
@ -63,6 +65,7 @@ protected:
private: private:
QVector<int> _pattern; QVector<int> _pattern;
QString _additionalPlaceholder; QString _additionalPlaceholder;
rpl::event_stream<not_null<QKeyEvent*>> _frontBackspaceEvent;
}; };