Skip to content

Commit 3dda4d6

Browse files
committed
Add toggle to show password in auth page (#73)
1 parent c9df0be commit 3dda4d6

File tree

4 files changed

+40
-16
lines changed

4 files changed

+40
-16
lines changed
Lines changed: 4 additions & 0 deletions
Loading

public/res/ic/outlined/eye.svg

Lines changed: 3 additions & 12 deletions
Loading

src/app/templates/auth/Auth.jsx

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import Avatar from '../../atoms/avatar/Avatar';
2121
import ContextMenu, { MenuItem, MenuHeader } from '../../atoms/context-menu/ContextMenu';
2222

2323
import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.svg';
24+
import EyeIC from '../../../../public/res/ic/outlined/eye.svg';
25+
import EyeBlindIC from '../../../../public/res/ic/outlined/eye-blind.svg';
2426
import CinnySvg from '../../../../public/res/svg/cinny.svg';
2527
import SSOButtons from '../../molecules/sso-buttons/SSOButtons';
2628

@@ -162,6 +164,7 @@ Homeserver.propTypes = {
162164

163165
function Login({ loginFlow, baseUrl }) {
164166
const [typeIndex, setTypeIndex] = useState(0);
167+
const [passVisible, setPassVisible] = useState(false);
165168
const loginTypes = ['Username', 'Email'];
166169
const isPassword = loginFlow?.filter((flow) => flow.type === 'm.login.password')[0];
167170
const ssoProviders = loginFlow?.filter((flow) => flow.type === 'm.login.sso')[0];
@@ -242,7 +245,10 @@ function Login({ loginFlow, baseUrl }) {
242245
{errors.username && <Text className="auth-form__error" variant="b3">{errors.username}</Text>}
243246
{typeIndex === 1 && <Input values={values.email} name="email" onChange={handleChange} label="Email" type="email" required />}
244247
{errors.email && <Text className="auth-form__error" variant="b3">{errors.email}</Text>}
245-
<Input values={values.password} name="password" onChange={handleChange} label="Password" type="password" required />
248+
<div className="auth-form__pass-eye-wrapper">
249+
<Input values={values.password} name="password" onChange={handleChange} label="Password" type={passVisible ? 'text' : 'password'} required />
250+
<IconButton onClick={() => setPassVisible(!passVisible)} src={passVisible ? EyeIC : EyeBlindIC} size="extra-small" />
251+
</div>
246252
{errors.password && <Text className="auth-form__error" variant="b3">{errors.password}</Text>}
247253
{errors.other && <Text className="auth-form__error" variant="b3">{errors.other}</Text>}
248254
<div className="auth-form__btns">
@@ -275,6 +281,8 @@ let sid;
275281
let clientSecret;
276282
function Register({ registerInfo, loginFlow, baseUrl }) {
277283
const [process, setProcess] = useState({});
284+
const [passVisible, setPassVisible] = useState(false);
285+
const [cPassVisible, setCPassVisible] = useState(false);
278286
const formRef = useRef();
279287

280288
const ssoProviders = loginFlow?.filter((flow) => flow.type === 'm.login.sso')[0];
@@ -444,9 +452,15 @@ function Register({ registerInfo, loginFlow, baseUrl }) {
444452
<form className="auth-form" ref={formRef} onSubmit={handleSubmit}>
445453
<Input values={values.username} name="username" onChange={handleChange} label="Username" type="username" required />
446454
{errors.username && <Text className="auth-form__error" variant="b3">{errors.username}</Text>}
447-
<Input values={values.password} name="password" onChange={handleChange} label="Password" type="password" required />
455+
<div className="auth-form__pass-eye-wrapper">
456+
<Input values={values.password} name="password" onChange={handleChange} label="Password" type={passVisible ? 'text' : 'password'} required />
457+
<IconButton onClick={() => setPassVisible(!passVisible)} src={passVisible ? EyeIC : EyeBlindIC} size="extra-small" />
458+
</div>
448459
{errors.password && <Text className="auth-form__error" variant="b3">{errors.password}</Text>}
449-
<Input values={values.confirmPassword} name="confirmPassword" onChange={handleChange} label="Confirm password" type="password" required />
460+
<div className="auth-form__pass-eye-wrapper">
461+
<Input values={values.confirmPassword} name="confirmPassword" onChange={handleChange} label="Confirm password" type={cPassVisible ? 'text' : 'password'} required />
462+
<IconButton onClick={() => setCPassVisible(!cPassVisible)} src={cPassVisible ? EyeIC : EyeBlindIC} size="extra-small" />
463+
</div>
450464
{errors.confirmPassword && <Text className="auth-form__error" variant="b3">{errors.confirmPassword}</Text>}
451465
{isEmail && <Input values={values.email} name="email" onChange={handleChange} label={`Email${isEmailRequired ? '' : ' (optional)'}`} type="email" required={isEmailRequired} />}
452466
{errors.email && <Text className="auth-form__error" variant="b3">{errors.email}</Text>}

src/app/templates/auth/Auth.scss

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@
9797
}
9898

9999
.auth-form {
100-
& > .input-container {
100+
& > .input-container,
101+
&__pass-eye-wrapper {
101102
margin: var(--sp-tight) 0 var(--sp-ultra-tight);
102103
}
103104

@@ -107,6 +108,20 @@
107108
margin-top: calc(var(--sp-extra-loose) + var(--sp-tight));
108109
}
109110

111+
&__pass-eye-wrapper {
112+
position: relative;
113+
& .ic-btn {
114+
position: absolute;
115+
@include dir.prop(right, 6px, unset);
116+
@include dir.prop(left, unset, 6px );
117+
bottom: 6px;
118+
border-radius: 4px;
119+
}
120+
& input {
121+
@include dir.side(padding, var(--sp-normal), 46px);
122+
}
123+
}
124+
110125
&__btns {
111126
padding-top: var(--sp-loose);
112127
margin-bottom: var(--sp-extra-loose);

0 commit comments

Comments
 (0)