import React from 'react'; import { Form, FormGroup, FormHelperText, HelperText, Popover, HelperTextItem, TextInput } from '@breakaway/preact-core'; import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon'; import ExclamationCircleIcon from '@patternfly/react-icons/dist/esm/icons/exclamation-circle-icon'; import ExclamationTriangleIcon from '@patternfly/react-icons/dist/esm/icons/exclamation-triangle-icon'; import CheckCircleIcon from '@patternfly/react-icons/dist/esm/icons/check-circle-icon'; export const PasswordStrengthDemo: React.FunctionComponent = () => { type HelperTextItemVariant = 'default' | 'indeterminate' | 'warning' | 'success' | 'error'; interface PassStrength { variant: HelperTextItemVariant; icon: JSX.Element; text: string; } const [password, setPassword] = React.useState(''); const [ruleLength, setRuleLength] = React.useState('indeterminate'); const [ruleContent, setRuleContent] = React.useState('indeterminate'); const [ruleCharacters, setRuleCharacters] = React.useState('indeterminate'); const [passStrength, setPassStrength] = React.useState({ variant: 'error', icon: , text: 'Weak' }); const handlePasswordInput = (_event: any, password: string) => { setPassword(password); validate(password); }; const validate = (password: string) => { if (password === '') { setRuleLength('indeterminate'); setRuleContent('indeterminate'); setRuleCharacters('indeterminate'); return; } if (password.length < 14) { setRuleLength('error'); } else { setRuleLength('success'); } if (/redhat/gi.test(password)) { setRuleContent('error'); } else { setRuleContent('success'); } let rulesCount = 0; let strCount = 0; if (/[a-z]/g.test(password)) { rulesCount++; } if (/[A-Z]/g.test(password)) { strCount += password.match(/[A-Z]/g).length; rulesCount++; } if (/\d/g.test(password)) { strCount += password.match(/\d/g).length; rulesCount++; } if (/\W/g.test(password)) { strCount += password.match(/\W/g).length; rulesCount++; } if (rulesCount < 3) { setRuleCharacters('error'); } else { setRuleCharacters('success'); } if (strCount < 3) { setPassStrength({ variant: 'error', icon: , text: 'Weak' }); } else if (strCount < 5) { setPassStrength({ variant: 'warning', icon: , text: 'Medium' }); } else { setPassStrength({ variant: 'success', icon: , text: 'Strong' }); } }; const iconPopover = ( Password Requirements} bodyContent={
Password rules
}>
); const passStrLabel = ( {passStrength.text} ); return (
Must be at least 14 characters Cannot contain the word "redhat" Must include at least 3 of the following: lowercase letter, uppercase letters, numbers, symbols
); };