1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-05-22 01:16:07 +02:00
unleash.unleash/frontend/src/component/admin/users/change-password-component.jsx
Youssef Khedher 80e80805f7 feat: add edit and create user screen (NEW) (#601)
* feat: add edit and create user screen

* refactor: rename create user component

* fix: add missing documentation link

* fix: remove unused dependencies

* feat: add confirm screen

* refactor: change UserForm and delete unused components

* refactor: remove toast when create new user

* fix: add margin top to form elements

Co-authored-by: Fredrik Strand Oseberg <fredrik.no@gmail.com>
2022-01-18 12:05:48 +01:00

151 lines
4.9 KiB
JavaScript

import { useState } from 'react';
import PropTypes from 'prop-types';
import classnames from 'classnames';
import { TextField, Typography, Avatar } from '@material-ui/core';
import { trim } from '../../common/util';
import { modalStyles } from './util';
import Dialogue from '../../common/Dialogue/Dialogue';
import PasswordChecker from '../../user/common/ResetPasswordForm/PasswordChecker/PasswordChecker';
import { useCommonStyles } from '../../../common.styles';
import PasswordMatcher from '../../user/common/ResetPasswordForm/PasswordMatcher/PasswordMatcher';
import ConditionallyRender from '../../common/ConditionallyRender';
import { Alert } from '@material-ui/lab';
function ChangePassword({
showDialog,
closeDialog,
changePassword,
user = {},
}) {
const [data, setData] = useState({});
const [error, setError] = useState({});
const [validPassword, setValidPassword] = useState(false);
const commonStyles = useCommonStyles();
const updateField = e => {
setError({});
setData({
...data,
[e.target.name]: trim(e.target.value),
});
};
const submit = async e => {
e.preventDefault();
if (!validPassword) {
if (!data.password || data.password.length < 8) {
setError({
password:
'You must specify a password with at least 8 chars.',
});
return;
}
if (!(data.password === data.confirm)) {
setError({ confirm: 'Passwords does not match' });
return;
}
}
try {
await changePassword(user, data.password);
setData({});
closeDialog();
} catch (error) {
const msg = error.message || 'Could not update password';
setError({ general: msg });
}
};
const onCancel = e => {
e.preventDefault();
setData({});
closeDialog();
};
return (
<Dialogue
open={showDialog}
onClick={submit}
style={modalStyles}
onClose={onCancel}
primaryButtonText="Save"
title="Update password"
secondaryButtonText="Cancel"
>
<form
onSubmit={submit}
className={classnames(
commonStyles.contentSpacingY,
commonStyles.flexColumn
)}
>
<ConditionallyRender
condition={error.general}
show={<Alert severity="error">{error.general}</Alert>}
/>
<Typography variant="subtitle1">
Changing password for user
</Typography>
<div className={commonStyles.flexRow}>
<Avatar
variant="rounded"
alt={user.name}
src={user.imageUrl}
title={`${
user.name || user.email || user.username
} (id: ${user.id})`}
/>
<Typography
variant="subtitle1"
style={{ marginLeft: '1rem' }}
>
{user.username || user.email}
</Typography>
</div>
<PasswordChecker
password={data.password}
callback={setValidPassword}
/>
<p style={{ color: 'red' }}>{error.general}</p>
<TextField
label="New password"
name="password"
type="password"
value={data.password}
helperText={error.password}
onChange={updateField}
variant="outlined"
size="small"
/>
<TextField
label="Confirm password"
name="confirm"
type="password"
value={data.confirm}
error={error.confirm !== undefined}
helperText={error.confirm}
onChange={updateField}
variant="outlined"
size="small"
/>
<PasswordMatcher
started={data.password && data.confirm}
matchingPasswords={data.password === data.confirm}
/>
</form>
</Dialogue>
);
}
ChangePassword.propTypes = {
showDialog: PropTypes.bool.isRequired,
closeDialog: PropTypes.func.isRequired,
changePassword: PropTypes.func.isRequired,
validatePassword: PropTypes.func.isRequired,
user: PropTypes.object,
};
export default ChangePassword;