Slightly improved style of buttons in security and privacy settings.

This commit is contained in:
23rd 2022-05-09 20:56:04 +03:00
parent a6d0367d71
commit 42f2f3c99f
1 changed files with 9 additions and 285 deletions

View File

@ -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(