Slightly improved style of buttons in security and privacy settings.
This commit is contained in:
parent
a6d0367d71
commit
42f2f3c99f
|
@ -228,26 +228,22 @@ void SetupLocalPasscode(
|
|||
not_null<Window::SessionController*> controller,
|
||||
not_null<Ui::VerticalLayout*> container,
|
||||
Fn<void(Type)> showOther) {
|
||||
AddSkip(container);
|
||||
AddDivider(container);
|
||||
AddSkip(container);
|
||||
AddSubsectionTitle(container, tr::lng_settings_passcode_title());
|
||||
|
||||
auto has = rpl::single(rpl::empty) | rpl::then(
|
||||
controller->session().domain().local().localPasscodeChanged()
|
||||
) | rpl::map([=] {
|
||||
return controller->session().domain().local().hasLocalPasscode();
|
||||
});
|
||||
auto text = rpl::combine(
|
||||
tr::lng_passcode_change(),
|
||||
tr::lng_passcode_turn_on(),
|
||||
auto label = rpl::combine(
|
||||
tr::lng_settings_cloud_password_on(),
|
||||
tr::lng_settings_cloud_password_off(),
|
||||
std::move(has),
|
||||
[](const QString &change, const QString &create, bool has) {
|
||||
return has ? change : create;
|
||||
[](const QString &on, const QString &off, bool has) {
|
||||
return has ? on : off;
|
||||
});
|
||||
AddButton(
|
||||
AddButtonWithLabel(
|
||||
container,
|
||||
std::move(text),
|
||||
tr::lng_settings_passcode_title(),
|
||||
std::move(label),
|
||||
st::settingsButton,
|
||||
{ &st::settingsIconLock, kIconGreen }
|
||||
)->addClickHandler([=] {
|
||||
|
@ -266,11 +262,6 @@ void SetupCloudPassword(
|
|||
using namespace rpl::mappers;
|
||||
using State = Core::CloudPasswordState;
|
||||
|
||||
AddSkip(container);
|
||||
AddDivider(container);
|
||||
AddSkip(container);
|
||||
AddSubsectionTitle(container, tr::lng_settings_password_title());
|
||||
|
||||
enum class PasswordState {
|
||||
Loading,
|
||||
On,
|
||||
|
@ -319,273 +310,6 @@ void SetupCloudPassword(
|
|||
}
|
||||
});
|
||||
|
||||
#if 0
|
||||
auto has = rpl::single(
|
||||
false
|
||||
) | rpl::then(controller->session().api().cloudPassword().state(
|
||||
) | rpl::map([](const State &state) {
|
||||
return state.hasPassword;
|
||||
})) | rpl::distinct_until_changed();
|
||||
auto pattern = session->api().cloudPassword().state(
|
||||
) | rpl::map([](const State &state) {
|
||||
return state.unconfirmedPattern;
|
||||
});
|
||||
auto confirmation = rpl::single(
|
||||
tr::lng_profile_loading(tr::now)
|
||||
) | rpl::then(rpl::duplicate(
|
||||
pattern
|
||||
) | rpl::filter([](const QString &pattern) {
|
||||
return !pattern.isEmpty();
|
||||
}) | rpl::map([](const QString &pattern) {
|
||||
return tr::lng_cloud_password_waiting_code(tr::now, lt_email, pattern);
|
||||
}));
|
||||
auto unconfirmed = rpl::duplicate(
|
||||
pattern
|
||||
) | rpl::map([](const QString &pattern) {
|
||||
return !pattern.isEmpty();
|
||||
});
|
||||
auto noconfirmed = rpl::single(
|
||||
true
|
||||
) | rpl::then(rpl::duplicate(
|
||||
unconfirmed
|
||||
));
|
||||
const auto label = container->add(
|
||||
object_ptr<Ui::SlideWrap<Ui::FlatLabel>>(
|
||||
container,
|
||||
object_ptr<Ui::FlatLabel>(
|
||||
container,
|
||||
base::duplicate(confirmation),
|
||||
st::settingsCloudPasswordLabel),
|
||||
QMargins(
|
||||
st::settingsButtonNoIcon.padding.left(),
|
||||
st::settingsButtonNoIcon.padding.top(),
|
||||
st::settingsButtonNoIcon.padding.right(),
|
||||
(st::settingsButtonNoIcon.height
|
||||
- st::settingsCloudPasswordLabel.style.font->height
|
||||
+ st::settingsButtonNoIcon.padding.bottom()))));
|
||||
label->toggleOn(base::duplicate(noconfirmed))->setDuration(0);
|
||||
|
||||
std::move(
|
||||
confirmation
|
||||
) | rpl::start_with_next([=] {
|
||||
container->resizeToWidth(container->width());
|
||||
}, label->lifetime());
|
||||
|
||||
auto text = rpl::combine(
|
||||
tr::lng_cloud_password_set(),
|
||||
tr::lng_cloud_password_edit(),
|
||||
base::duplicate(has)
|
||||
) | rpl::map([](const QString &set, const QString &edit, bool has) {
|
||||
return has ? edit : set;
|
||||
});
|
||||
const auto change = container->add(
|
||||
object_ptr<Ui::SlideWrap<Button>>(
|
||||
container,
|
||||
CreateButton(
|
||||
container,
|
||||
std::move(text),
|
||||
st::settingsButton,
|
||||
{ &st::settingsIconKey, kIconLightBlue })));
|
||||
change->toggleOn(rpl::duplicate(
|
||||
noconfirmed
|
||||
) | rpl::map(
|
||||
!_1
|
||||
))->setDuration(0);
|
||||
change->entity()->addClickHandler([=] {
|
||||
if (CheckEditCloudPassword(session)) {
|
||||
controller->show(EditCloudPasswordBox(session));
|
||||
} else {
|
||||
controller->show(CloudPasswordAppOutdatedBox());
|
||||
}
|
||||
});
|
||||
|
||||
const auto confirm = container->add(
|
||||
object_ptr<Ui::SlideWrap<Button>>(
|
||||
container,
|
||||
CreateButton(
|
||||
container,
|
||||
tr::lng_cloud_password_confirm(),
|
||||
st::settingsButton,
|
||||
{ &st::settingsIconEmail, kIconLightOrange })));
|
||||
confirm->toggleOn(rpl::single(
|
||||
false
|
||||
) | rpl::then(rpl::duplicate(
|
||||
unconfirmed
|
||||
)))->setDuration(0);
|
||||
confirm->entity()->addClickHandler([=] {
|
||||
const auto state = session->api().cloudPassword().stateCurrent();
|
||||
if (!state) {
|
||||
return;
|
||||
}
|
||||
auto validation = ConfirmRecoveryEmail(
|
||||
&controller->session(),
|
||||
state->unconfirmedPattern);
|
||||
|
||||
std::move(
|
||||
validation.reloadRequests
|
||||
) | rpl::start_with_next([=] {
|
||||
session->api().cloudPassword().reload();
|
||||
}, validation.box->lifetime());
|
||||
|
||||
std::move(
|
||||
validation.cancelRequests
|
||||
) | rpl::start_with_next([=] {
|
||||
session->api().cloudPassword().clearUnconfirmedPassword();
|
||||
}, validation.box->lifetime());
|
||||
|
||||
controller->show(std::move(validation.box));
|
||||
});
|
||||
|
||||
const auto remove = [=] {
|
||||
if (CheckEditCloudPassword(session)) {
|
||||
RemoveCloudPassword(controller);
|
||||
} else {
|
||||
controller->show(CloudPasswordAppOutdatedBox());
|
||||
}
|
||||
};
|
||||
const auto disable = container->add(
|
||||
object_ptr<Ui::SlideWrap<Button>>(
|
||||
container,
|
||||
CreateButton(
|
||||
container,
|
||||
tr::lng_settings_password_disable(),
|
||||
st::settingsButton,
|
||||
{ &st::settingsIconMinus, kIconRed })));
|
||||
disable->toggleOn(rpl::combine(
|
||||
rpl::duplicate(has),
|
||||
rpl::duplicate(noconfirmed),
|
||||
_1 && !_2));
|
||||
disable->entity()->addClickHandler(remove);
|
||||
|
||||
auto resetAt = session->api().cloudPassword().state(
|
||||
) | rpl::map([](const State &state) {
|
||||
return state.pendingResetDate;
|
||||
});
|
||||
auto resetInSeconds = rpl::duplicate(
|
||||
resetAt
|
||||
) | rpl::filter([](TimeId time) {
|
||||
return time != 0;
|
||||
}) | rpl::map([](TimeId time) {
|
||||
return rpl::single(rpl::empty) | rpl::then(base::timer_each(
|
||||
999
|
||||
)) | rpl::map([=] {
|
||||
const auto now = base::unixtime::now();
|
||||
return (time - now);
|
||||
}) | rpl::distinct_until_changed(
|
||||
) | rpl::take_while([](TimeId left) {
|
||||
return left > 0;
|
||||
}) | rpl::then(rpl::single(TimeId(0)));
|
||||
}) | rpl::flatten_latest(
|
||||
) | rpl::start_spawning(container->lifetime());
|
||||
|
||||
auto resetText = rpl::duplicate(
|
||||
resetInSeconds
|
||||
) | rpl::map([](TimeId left) {
|
||||
return (left > 0);
|
||||
}) | rpl::distinct_until_changed(
|
||||
) | rpl::map([](bool waiting) {
|
||||
return waiting
|
||||
? tr::lng_cloud_password_reset_in()
|
||||
: tr::lng_cloud_password_reset_ready();
|
||||
}) | rpl::flatten_latest();
|
||||
|
||||
constexpr auto kMinute = 60;
|
||||
constexpr auto kHour = 3600;
|
||||
constexpr auto kDay = 86400;
|
||||
auto resetLabel = rpl::duplicate(
|
||||
resetInSeconds
|
||||
) | rpl::map([](TimeId left) {
|
||||
return (left >= kDay)
|
||||
? ((left / kDay) * kDay)
|
||||
: (left >= kHour)
|
||||
? ((left / kHour) * kHour)
|
||||
: (left >= kMinute)
|
||||
? ((left / kMinute) * kMinute)
|
||||
: left;
|
||||
}) | rpl::distinct_until_changed(
|
||||
) | rpl::map([](TimeId left) {
|
||||
const auto days = left / kDay;
|
||||
const auto hours = left / kHour;
|
||||
const auto minutes = left / kMinute;
|
||||
return days
|
||||
? tr::lng_days(tr::now, lt_count, days)
|
||||
: hours
|
||||
? tr::lng_hours(tr::now, lt_count, hours)
|
||||
: minutes
|
||||
? tr::lng_minutes(tr::now, lt_count, minutes)
|
||||
: left
|
||||
? tr::lng_seconds(tr::now, lt_count, left)
|
||||
: QString();
|
||||
});
|
||||
|
||||
const auto reset = container->add(
|
||||
object_ptr<Ui::SlideWrap<Button>>(
|
||||
container,
|
||||
CreateButton(
|
||||
container,
|
||||
rpl::duplicate(resetText),
|
||||
st::settingsButton))
|
||||
)->setDuration(0);
|
||||
CreateRightLabel(
|
||||
reset->entity(),
|
||||
std::move(resetLabel),
|
||||
st::settingsButton,
|
||||
std::move(resetText));
|
||||
|
||||
reset->toggleOn(rpl::duplicate(
|
||||
resetAt
|
||||
) | rpl::map([](TimeId time) {
|
||||
return time != 0;
|
||||
}));
|
||||
const auto sent = std::make_shared<bool>(false);
|
||||
reset->entity()->addClickHandler([=] {
|
||||
const auto api = &session->api();
|
||||
const auto state = api->cloudPassword().stateCurrent();
|
||||
const auto date = state ? state->pendingResetDate : TimeId(0);
|
||||
if (!date || *sent) {
|
||||
return;
|
||||
} else if (base::unixtime::now() >= date) {
|
||||
*sent = true;
|
||||
api->cloudPassword().resetPassword(
|
||||
) | rpl::start_with_error_done([=](const QString &error) {
|
||||
*sent = false;
|
||||
}, [=] {
|
||||
*sent = false;
|
||||
}, container->lifetime());
|
||||
} else {
|
||||
const auto cancel = [=] {
|
||||
Ui::hideLayer();
|
||||
*sent = true;
|
||||
api->cloudPassword().cancelResetPassword(
|
||||
) | rpl::start_with_error_done([=](const QString &error) {
|
||||
*sent = false;
|
||||
}, [=] {
|
||||
*sent = false;
|
||||
}, container->lifetime());
|
||||
};
|
||||
Ui::show(Ui::MakeConfirmBox({
|
||||
.text = tr::lng_cloud_password_reset_cancel_sure(),
|
||||
.confirmed = cancel,
|
||||
.confirmText = tr::lng_box_yes(),
|
||||
.cancelText = tr::lng_box_no(),
|
||||
}));
|
||||
}
|
||||
});
|
||||
|
||||
const auto abort = container->add(
|
||||
object_ptr<Ui::SlideWrap<Button>>(
|
||||
container,
|
||||
CreateButton(
|
||||
container,
|
||||
tr::lng_settings_password_abort(),
|
||||
st::settingsAttentionButton)));
|
||||
abort->toggleOn(rpl::combine(
|
||||
rpl::duplicate(has),
|
||||
rpl::duplicate(noconfirmed),
|
||||
_1 && _2));
|
||||
abort->entity()->addClickHandler(remove);
|
||||
#endif
|
||||
|
||||
const auto reloadOnActivation = [=](Qt::ApplicationState state) {
|
||||
if (/*label->toggled() && */state == Qt::ApplicationActive) {
|
||||
controller->session().api().cloudPassword().reload();
|
||||
|
@ -599,7 +323,7 @@ void SetupCloudPassword(
|
|||
session->api().cloudPassword().reload();
|
||||
|
||||
AddSkip(container);
|
||||
AddDivider(container);
|
||||
AddDividerText(container, tr::lng_settings_cloud_password_start_about());
|
||||
}
|
||||
|
||||
void SetupSensitiveContent(
|
||||
|
|
Loading…
Reference in New Issue