mirror of
https://github.com/LemmyNet/lemmy-ui.git
synced 2024-11-26 14:21:13 +00:00
Password strength meter (#427)
* Updating translations. * Updating translations. * Add password strength meter. Fixes #388
This commit is contained in:
parent
bf93e29f4c
commit
d66931e1c6
5 changed files with 61 additions and 7 deletions
|
@ -1 +1 @@
|
||||||
Subproject commit a700edf2dc9c290050b036b6d33e0ea351c92274
|
Subproject commit 7dd7b98da76477222f9fd9720b4b25e14e3ddc97
|
|
@ -18,6 +18,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/parser": "^4.31.1",
|
"@typescript-eslint/parser": "^4.31.1",
|
||||||
"autosize": "^5.0.1",
|
"autosize": "^5.0.1",
|
||||||
|
"check-password-strength": "^2.0.3",
|
||||||
"choices.js": "^9.0.1",
|
"choices.js": "^9.0.1",
|
||||||
"emoji-short-name": "^1.0.0",
|
"emoji-short-name": "^1.0.0",
|
||||||
"express": "~4.17.1",
|
"express": "~4.17.1",
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import { Options, passwordStrength } from "check-password-strength";
|
||||||
|
import { I18nKeys } from "i18next";
|
||||||
import { Component, linkEvent } from "inferno";
|
import { Component, linkEvent } from "inferno";
|
||||||
import { T } from "inferno-i18next-dess";
|
import { T } from "inferno-i18next-dess";
|
||||||
import {
|
import {
|
||||||
|
@ -28,6 +30,33 @@ import {
|
||||||
import { HtmlTags } from "../common/html-tags";
|
import { HtmlTags } from "../common/html-tags";
|
||||||
import { Icon, Spinner } from "../common/icon";
|
import { Icon, Spinner } from "../common/icon";
|
||||||
|
|
||||||
|
const passwordStrengthOptions: Options<string> = [
|
||||||
|
{
|
||||||
|
id: 0,
|
||||||
|
value: "too_weak",
|
||||||
|
minDiversity: 0,
|
||||||
|
minLength: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
value: "weak",
|
||||||
|
minDiversity: 2,
|
||||||
|
minLength: 10,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
value: "medium",
|
||||||
|
minDiversity: 3,
|
||||||
|
minLength: 12,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
value: "strong",
|
||||||
|
minDiversity: 4,
|
||||||
|
minLength: 14,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
loginForm: LoginForm;
|
loginForm: LoginForm;
|
||||||
registerForm: Register;
|
registerForm: Register;
|
||||||
|
@ -227,10 +256,16 @@ export class Login extends Component<any, State> {
|
||||||
value={this.state.registerForm.password}
|
value={this.state.registerForm.password}
|
||||||
autoComplete="new-password"
|
autoComplete="new-password"
|
||||||
onInput={linkEvent(this, this.handleRegisterPasswordChange)}
|
onInput={linkEvent(this, this.handleRegisterPasswordChange)}
|
||||||
|
minLength={10}
|
||||||
maxLength={60}
|
maxLength={60}
|
||||||
class="form-control"
|
class="form-control"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
|
{this.state.registerForm.password && (
|
||||||
|
<div class={this.passwordColorClass}>
|
||||||
|
{i18n.t(this.passwordStrength as I18nKeys)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -349,6 +384,25 @@ export class Login extends Component<any, State> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get passwordStrength() {
|
||||||
|
return passwordStrength(
|
||||||
|
this.state.registerForm.password,
|
||||||
|
passwordStrengthOptions
|
||||||
|
).value;
|
||||||
|
}
|
||||||
|
|
||||||
|
get passwordColorClass(): string {
|
||||||
|
let strength = this.passwordStrength;
|
||||||
|
|
||||||
|
if (["weak", "medium"].includes(strength)) {
|
||||||
|
return "text-warning";
|
||||||
|
} else if (strength == "strong") {
|
||||||
|
return "text-success";
|
||||||
|
} else {
|
||||||
|
return "text-danger";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
handleLoginSubmit(i: Login, event: any) {
|
handleLoginSubmit(i: Login, event: any) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
i.state.loginLoading = true;
|
i.state.loginLoading = true;
|
||||||
|
|
|
@ -1035,12 +1035,6 @@ export class Settings extends Component<any, SettingsState> {
|
||||||
i.setState(i.state);
|
i.setState(i.state);
|
||||||
}
|
}
|
||||||
|
|
||||||
handleLogoutClick(_i: Settings) {
|
|
||||||
UserService.Instance.logout();
|
|
||||||
window.location.href = "/";
|
|
||||||
location.reload();
|
|
||||||
}
|
|
||||||
|
|
||||||
handleDeleteAccount(i: Settings, event: any) {
|
handleDeleteAccount(i: Settings, event: any) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
i.state.deleteAccountLoading = true;
|
i.state.deleteAccountLoading = true;
|
||||||
|
|
|
@ -2062,6 +2062,11 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1:
|
||||||
ansi-styles "^4.1.0"
|
ansi-styles "^4.1.0"
|
||||||
supports-color "^7.1.0"
|
supports-color "^7.1.0"
|
||||||
|
|
||||||
|
check-password-strength@^2.0.3:
|
||||||
|
version "2.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/check-password-strength/-/check-password-strength-2.0.3.tgz#fed038b1c457ac11a2999bd96f3185af34e88895"
|
||||||
|
integrity sha512-UW3YgMUne9QuejgnNWjWwYi4QhWArVj+1OXqDR1NkEQcmMKKO74O3P5ZvXr9JZNbTBfcwlK3yurYCMuJsck83A==
|
||||||
|
|
||||||
choices.js@^9.0.1:
|
choices.js@^9.0.1:
|
||||||
version "9.0.1"
|
version "9.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/choices.js/-/choices.js-9.0.1.tgz#745fb29af8670428fdc0bf1cc9dfaa404e9d0510"
|
resolved "https://registry.yarnpkg.com/choices.js/-/choices.js-9.0.1.tgz#745fb29af8670428fdc0bf1cc9dfaa404e9d0510"
|
||||||
|
|
Loading…
Reference in a new issue