init
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Close stale issues and PRs / stale (push) Successful in 13s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Close stale issues and PRs / stale (push) Successful in 13s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
This commit is contained in:
282
Telegram/SourceFiles/payments/ui/payments_edit_information.cpp
Normal file
282
Telegram/SourceFiles/payments/ui/payments_edit_information.cpp
Normal file
@@ -0,0 +1,282 @@
|
||||
/*
|
||||
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 "payments/ui/payments_edit_information.h"
|
||||
|
||||
#include "payments/ui/payments_panel_delegate.h"
|
||||
#include "payments/ui/payments_field.h"
|
||||
#include "ui/widgets/scroll_area.h"
|
||||
#include "ui/widgets/buttons.h"
|
||||
#include "ui/widgets/labels.h"
|
||||
#include "ui/widgets/checkbox.h"
|
||||
#include "ui/wrap/vertical_layout.h"
|
||||
#include "ui/wrap/fade_wrap.h"
|
||||
#include "lang/lang_keys.h"
|
||||
#include "styles/style_payments.h"
|
||||
#include "styles/style_passport.h"
|
||||
|
||||
namespace Payments::Ui {
|
||||
namespace {
|
||||
|
||||
constexpr auto kMaxStreetSize = 64;
|
||||
constexpr auto kMaxPostcodeSize = 10;
|
||||
constexpr auto kMaxNameSize = 64;
|
||||
constexpr auto kMaxEmailSize = 128;
|
||||
constexpr auto kMaxPhoneSize = 16;
|
||||
constexpr auto kMinCitySize = 2;
|
||||
constexpr auto kMaxCitySize = 64;
|
||||
|
||||
} // namespace
|
||||
|
||||
EditInformation::EditInformation(
|
||||
QWidget *parent,
|
||||
const Invoice &invoice,
|
||||
const RequestedInformation ¤t,
|
||||
InformationField field,
|
||||
not_null<PanelDelegate*> delegate)
|
||||
: _delegate(delegate)
|
||||
, _invoice(invoice)
|
||||
, _information(current)
|
||||
, _scroll(this, st::passportPanelScroll)
|
||||
, _topShadow(this)
|
||||
, _bottomShadow(this)
|
||||
, _submit(
|
||||
this,
|
||||
tr::lng_settings_save(),
|
||||
st::paymentsPanelButton)
|
||||
, _cancel(
|
||||
this,
|
||||
tr::lng_cancel(),
|
||||
st::paymentsPanelButton) {
|
||||
setupControls();
|
||||
}
|
||||
|
||||
EditInformation::~EditInformation() = default;
|
||||
|
||||
void EditInformation::setFocus(InformationField field) {
|
||||
_focusField = field;
|
||||
if (const auto control = lookupField(field)) {
|
||||
_scroll->ensureWidgetVisible(control->widget());
|
||||
control->setFocus();
|
||||
}
|
||||
}
|
||||
|
||||
void EditInformation::setFocusFast(InformationField field) {
|
||||
_focusField = field;
|
||||
if (const auto control = lookupField(field)) {
|
||||
_scroll->ensureWidgetVisible(control->widget());
|
||||
control->setFocusFast();
|
||||
}
|
||||
}
|
||||
|
||||
void EditInformation::showError(InformationField field) {
|
||||
if (const auto control = lookupField(field)) {
|
||||
_scroll->ensureWidgetVisible(control->widget());
|
||||
control->showError();
|
||||
}
|
||||
}
|
||||
|
||||
void EditInformation::setupControls() {
|
||||
const auto inner = setupContent();
|
||||
|
||||
_submit->addClickHandler([=] {
|
||||
_delegate->panelValidateInformation(collect());
|
||||
});
|
||||
_cancel->addClickHandler([=] {
|
||||
_delegate->panelCancelEdit();
|
||||
});
|
||||
|
||||
using namespace rpl::mappers;
|
||||
|
||||
_topShadow->toggleOn(
|
||||
_scroll->scrollTopValue() | rpl::map(_1 > 0));
|
||||
_bottomShadow->toggleOn(rpl::combine(
|
||||
_scroll->scrollTopValue(),
|
||||
_scroll->heightValue(),
|
||||
inner->heightValue(),
|
||||
_1 + _2 < _3));
|
||||
}
|
||||
|
||||
not_null<RpWidget*> EditInformation::setupContent() {
|
||||
const auto inner = _scroll->setOwnedWidget(
|
||||
object_ptr<VerticalLayout>(this));
|
||||
|
||||
_scroll->widthValue(
|
||||
) | rpl::on_next([=](int width) {
|
||||
inner->resizeToWidth(width);
|
||||
}, inner->lifetime());
|
||||
|
||||
const auto showBox = [=](object_ptr<BoxContent> box) {
|
||||
_delegate->panelShowBox(std::move(box));
|
||||
};
|
||||
auto last = (Field*)nullptr;
|
||||
const auto add = [&](FieldConfig &&config) {
|
||||
auto result = std::make_unique<Field>(inner, std::move(config));
|
||||
inner->add(result->ownedWidget(), st::paymentsFieldPadding);
|
||||
if (last) {
|
||||
last->setNextField(result.get());
|
||||
result->setPreviousField(last);
|
||||
}
|
||||
last = result.get();
|
||||
return result;
|
||||
};
|
||||
if (_invoice.isShippingAddressRequested) {
|
||||
_street1 = add({
|
||||
.placeholder = tr::lng_payments_address_street1(),
|
||||
.value = _information.shippingAddress.address1,
|
||||
.validator = RangeLengthValidator(1, kMaxStreetSize),
|
||||
});
|
||||
_street2 = add({
|
||||
.placeholder = tr::lng_payments_address_street2(),
|
||||
.value = _information.shippingAddress.address2,
|
||||
.validator = MaxLengthValidator(kMaxStreetSize),
|
||||
});
|
||||
_city = add({
|
||||
.placeholder = tr::lng_payments_address_city(),
|
||||
.value = _information.shippingAddress.city,
|
||||
.validator = RangeLengthValidator(kMinCitySize, kMaxCitySize),
|
||||
});
|
||||
_state = add({
|
||||
.placeholder = tr::lng_payments_address_state(),
|
||||
.value = _information.shippingAddress.state,
|
||||
});
|
||||
_country = add({
|
||||
.type = FieldType::Country,
|
||||
.placeholder = tr::lng_payments_address_country(),
|
||||
.value = _information.shippingAddress.countryIso2,
|
||||
.validator = RequiredFinishedValidator(),
|
||||
.showBox = showBox,
|
||||
.defaultCountry = _information.defaultCountry,
|
||||
});
|
||||
_postcode = add({
|
||||
.placeholder = tr::lng_payments_address_postcode(),
|
||||
.value = _information.shippingAddress.postcode,
|
||||
.validator = RangeLengthValidator(1, kMaxPostcodeSize),
|
||||
});
|
||||
}
|
||||
if (_invoice.isNameRequested) {
|
||||
_name = add({
|
||||
.placeholder = tr::lng_payments_info_name(),
|
||||
.value = _information.name,
|
||||
.validator = RangeLengthValidator(1, kMaxNameSize),
|
||||
});
|
||||
}
|
||||
if (_invoice.isEmailRequested) {
|
||||
_email = add({
|
||||
.type = FieldType::Email,
|
||||
.placeholder = tr::lng_payments_info_email(),
|
||||
.value = _information.email,
|
||||
.validator = RangeLengthValidator(1, kMaxEmailSize),
|
||||
});
|
||||
}
|
||||
if (_invoice.isPhoneRequested) {
|
||||
_phone = add({
|
||||
.type = FieldType::Phone,
|
||||
.placeholder = tr::lng_payments_info_phone(),
|
||||
.value = _information.phone,
|
||||
.validator = RangeLengthValidator(1, kMaxPhoneSize),
|
||||
.defaultPhone = _information.defaultPhone,
|
||||
});
|
||||
}
|
||||
const auto emailToProvider = _invoice.isEmailRequested
|
||||
&& _invoice.emailSentToProvider;
|
||||
const auto phoneToProvider = _invoice.isPhoneRequested
|
||||
&& _invoice.phoneSentToProvider;
|
||||
if (emailToProvider || phoneToProvider) {
|
||||
inner->add(
|
||||
object_ptr<Ui::FlatLabel>(
|
||||
inner,
|
||||
((emailToProvider && phoneToProvider)
|
||||
? tr::lng_payments_to_provider_phone_email
|
||||
: emailToProvider
|
||||
? tr::lng_payments_to_provider_email
|
||||
: tr::lng_payments_to_provider_phone)(
|
||||
lt_provider,
|
||||
rpl::single(_invoice.provider)),
|
||||
st::paymentsToProviderLabel),
|
||||
st::paymentsToProviderPadding);
|
||||
}
|
||||
_save = inner->add(
|
||||
object_ptr<Ui::Checkbox>(
|
||||
inner,
|
||||
tr::lng_payments_save_information(tr::now),
|
||||
true),
|
||||
st::paymentsSaveCheckboxPadding);
|
||||
|
||||
if (last) {
|
||||
last->submitted(
|
||||
) | rpl::on_next([=] {
|
||||
_delegate->panelValidateInformation(collect());
|
||||
}, lifetime());
|
||||
}
|
||||
|
||||
return inner;
|
||||
}
|
||||
|
||||
void EditInformation::resizeEvent(QResizeEvent *e) {
|
||||
updateControlsGeometry();
|
||||
}
|
||||
|
||||
void EditInformation::focusInEvent(QFocusEvent *e) {
|
||||
if (const auto control = lookupField(_focusField)) {
|
||||
control->setFocus();
|
||||
}
|
||||
}
|
||||
|
||||
void EditInformation::updateControlsGeometry() {
|
||||
const auto &padding = st::paymentsPanelPadding;
|
||||
const auto buttonsHeight = padding.top()
|
||||
+ _cancel->height()
|
||||
+ padding.bottom();
|
||||
const auto buttonsTop = height() - buttonsHeight;
|
||||
_scroll->setGeometry(0, 0, width(), buttonsTop);
|
||||
_topShadow->resizeToWidth(width());
|
||||
_topShadow->moveToLeft(0, 0);
|
||||
_bottomShadow->resizeToWidth(width());
|
||||
_bottomShadow->moveToLeft(0, buttonsTop - st::lineWidth);
|
||||
auto right = padding.right();
|
||||
_submit->moveToRight(right, buttonsTop + padding.top());
|
||||
right += _submit->width() + padding.left();
|
||||
_cancel->moveToRight(right, buttonsTop + padding.top());
|
||||
|
||||
_scroll->updateBars();
|
||||
}
|
||||
|
||||
auto EditInformation::lookupField(InformationField field) const -> Field* {
|
||||
switch (field) {
|
||||
case InformationField::ShippingStreet: return _street1.get();
|
||||
case InformationField::ShippingCity: return _city.get();
|
||||
case InformationField::ShippingState: return _state.get();
|
||||
case InformationField::ShippingCountry: return _country.get();
|
||||
case InformationField::ShippingPostcode: return _postcode.get();
|
||||
case InformationField::Name: return _name.get();
|
||||
case InformationField::Email: return _email.get();
|
||||
case InformationField::Phone: return _phone.get();
|
||||
}
|
||||
Unexpected("Unknown field in EditInformation::lookupField.");
|
||||
}
|
||||
|
||||
RequestedInformation EditInformation::collect() const {
|
||||
return {
|
||||
.defaultPhone = _information.defaultPhone,
|
||||
.defaultCountry = _information.defaultCountry,
|
||||
.save = _save->checked(),
|
||||
.name = _name ? _name->value() : QString(),
|
||||
.phone = _phone ? _phone->value() : QString(),
|
||||
.email = _email ? _email->value() : QString(),
|
||||
.shippingAddress = {
|
||||
.address1 = _street1 ? _street1->value() : QString(),
|
||||
.address2 = _street2 ? _street2->value() : QString(),
|
||||
.city = _city ? _city->value() : QString(),
|
||||
.state = _state ? _state->value() : QString(),
|
||||
.countryIso2 = _country ? _country->value() : QString(),
|
||||
.postcode = _postcode ? _postcode->value() : QString(),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
} // namespace Payments::Ui
|
||||
Reference in New Issue
Block a user