58 lines
1.6 KiB
JavaScript
58 lines
1.6 KiB
JavaScript
|
import {Box, styled} from "@mui/material";
|
||
|
import {useContext} from "react";
|
||
|
import {LocaleContext} from "../locale";
|
||
|
import {sprintf} from "sprintf-js";
|
||
|
|
||
|
const PasswordStrengthBox = styled(Box)((props) => ({
|
||
|
textAlign: "center",
|
||
|
borderRadius: 5,
|
||
|
borderStyle: "solid",
|
||
|
borderWidth: 1,
|
||
|
borderColor: props.theme.palette.action,
|
||
|
padding: props.theme.spacing(0.5),
|
||
|
position: "relative",
|
||
|
"& > div": {
|
||
|
zIndex: 0,
|
||
|
position: "absolute",
|
||
|
top: 0,
|
||
|
left: 0,
|
||
|
height: "100%",
|
||
|
},
|
||
|
"& > span": {
|
||
|
zIndex: 1,
|
||
|
position: "relative",
|
||
|
}
|
||
|
}));
|
||
|
|
||
|
export default function PasswordStrength(props) {
|
||
|
|
||
|
const {password, ...other} = props;
|
||
|
const {translate: L} = useContext(LocaleContext);
|
||
|
|
||
|
const ref = 14;
|
||
|
let strength = password.length >= ref ? 100 : Math.round(password.length / ref * 100.0);
|
||
|
let label = "account.password_very_weak";
|
||
|
let bgColor = "red";
|
||
|
|
||
|
if (strength >= 85) {
|
||
|
label = "account.password_very_strong";
|
||
|
bgColor = "darkgreen";
|
||
|
} else if (strength >= 65) {
|
||
|
label = "account.password_strong";
|
||
|
bgColor = "green";
|
||
|
} else if (strength >= 50) {
|
||
|
label = "account.password_ok";
|
||
|
bgColor = "yellow";
|
||
|
} else if (strength >= 25) {
|
||
|
label = "account.password_weak";
|
||
|
bgColor = "orange";
|
||
|
}
|
||
|
|
||
|
return <PasswordStrengthBox {...other}>
|
||
|
<Box position={"absolute"} sx={{
|
||
|
backgroundColor: bgColor,
|
||
|
width: sprintf("%d%%", strength),
|
||
|
}} />
|
||
|
<span>{L(label)}</span>
|
||
|
</PasswordStrengthBox>
|
||
|
}
|