2021-12-27 18:06:26 +05:00
|
|
|
|
import { memo, useState } from 'react'
|
|
|
|
|
import { useForm } from 'antd/lib/form/Form'
|
|
|
|
|
import { Form, Input, Modal, FormProps } from 'antd'
|
|
|
|
|
|
2022-01-24 21:16:50 +05:00
|
|
|
|
import { AuthService, UserDto } from '@api'
|
|
|
|
|
import { getUserId, getUserLogin } from '@utils/storage'
|
|
|
|
|
import { passwordRules, createPasswordRules } from '@utils/validationRules'
|
2021-12-27 18:06:26 +05:00
|
|
|
|
|
|
|
|
|
import LoaderPortal from './LoaderPortal'
|
|
|
|
|
import { invokeWebApiWrapperAsync } from './factory'
|
2022-01-14 20:03:00 +05:00
|
|
|
|
import { UserView } from './views'
|
2021-12-27 18:06:26 +05:00
|
|
|
|
|
|
|
|
|
const formLayout: FormProps = { labelCol: { span: 11 }, wrapperCol: { span: 16 } }
|
|
|
|
|
|
|
|
|
|
export type ChangePasswordProps = {
|
2021-12-28 19:19:12 +05:00
|
|
|
|
user?: UserDto
|
2021-12-27 18:06:26 +05:00
|
|
|
|
visible?: boolean
|
|
|
|
|
onCancel?: () => void
|
|
|
|
|
onOk?: () => void
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-28 19:19:12 +05:00
|
|
|
|
const fieldRules = [...passwordRules, ...createPasswordRules]
|
2021-12-27 18:06:26 +05:00
|
|
|
|
|
2021-12-28 19:19:12 +05:00
|
|
|
|
export const ChangePassword = memo<ChangePasswordProps>(({ user, visible, onCancel, onOk }) => {
|
2021-12-27 18:06:26 +05:00
|
|
|
|
const [showLoader, setShowLoader] = useState<boolean>(false)
|
|
|
|
|
const [password, setPassword] = useState<string>('')
|
2021-12-29 12:21:57 +05:00
|
|
|
|
const [isDisabled, setIsDisabled] = useState(true)
|
2021-12-27 18:06:26 +05:00
|
|
|
|
|
|
|
|
|
const [form] = useForm()
|
|
|
|
|
|
2021-12-29 12:21:57 +05:00
|
|
|
|
const onFormChange = async () => await form.validateFields()
|
|
|
|
|
.then(() => setIsDisabled(false))
|
|
|
|
|
.catch(() => setIsDisabled(true))
|
|
|
|
|
|
2021-12-27 18:06:26 +05:00
|
|
|
|
const onModalCancel = () => {
|
|
|
|
|
form.resetFields()
|
|
|
|
|
onCancel?.()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const onFormFinish = () => invokeWebApiWrapperAsync(
|
|
|
|
|
async() => {
|
2021-12-29 17:48:10 +05:00
|
|
|
|
await AuthService.changePassword(user?.id ?? getUserId() ?? -1, `"${password}"`)
|
2021-12-27 18:06:26 +05:00
|
|
|
|
onOk?.()
|
|
|
|
|
},
|
|
|
|
|
setShowLoader,
|
2022-02-07 17:44:46 +05:00
|
|
|
|
`Не удалось сменить пароль пользователя ${getUserLogin()}`,
|
|
|
|
|
'Смена пароля пользователя'
|
2021-12-27 18:06:26 +05:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Modal
|
|
|
|
|
centered
|
2021-12-28 19:19:12 +05:00
|
|
|
|
title={(
|
|
|
|
|
<>
|
|
|
|
|
Сменить пароль
|
|
|
|
|
{user && <> (<UserView user={user} />)</>}
|
|
|
|
|
</>
|
|
|
|
|
)}
|
2021-12-27 18:06:26 +05:00
|
|
|
|
visible={visible}
|
|
|
|
|
onCancel={onModalCancel}
|
|
|
|
|
onOk={() => form.submit()}
|
2021-12-29 12:21:57 +05:00
|
|
|
|
okText={'Сохранить'}
|
|
|
|
|
okButtonProps={{
|
|
|
|
|
disabled: isDisabled
|
|
|
|
|
}}
|
2021-12-27 18:06:26 +05:00
|
|
|
|
>
|
|
|
|
|
<LoaderPortal show={showLoader}>
|
|
|
|
|
<Form
|
|
|
|
|
{...formLayout}
|
|
|
|
|
form={form}
|
|
|
|
|
name={'change-password'}
|
|
|
|
|
onFinish={onFormFinish}
|
2021-12-29 12:21:57 +05:00
|
|
|
|
onChange={onFormChange}
|
2021-12-27 18:06:26 +05:00
|
|
|
|
>
|
2021-12-28 19:19:12 +05:00
|
|
|
|
<Form.Item
|
|
|
|
|
label={'Новый пароль'}
|
|
|
|
|
name={'new-password'}
|
|
|
|
|
required={true}
|
|
|
|
|
rules={fieldRules}
|
|
|
|
|
>
|
2021-12-27 18:06:26 +05:00
|
|
|
|
<Input.Password onChange={(e) => setPassword(e.target.value)} value={password} />
|
|
|
|
|
</Form.Item>
|
2021-12-28 19:19:12 +05:00
|
|
|
|
<Form.Item
|
|
|
|
|
label={'Подтверждение пароля'}
|
|
|
|
|
name={'confirm-password'}
|
|
|
|
|
required={true}
|
|
|
|
|
rules={[() => ({ validator(_, value: string) {
|
|
|
|
|
if (value !== password)
|
|
|
|
|
return Promise.reject('Пароли не совпадают!')
|
|
|
|
|
return Promise.resolve()
|
|
|
|
|
}})]}
|
|
|
|
|
>
|
|
|
|
|
<Input.Password />
|
|
|
|
|
</Form.Item>
|
2021-12-27 18:06:26 +05:00
|
|
|
|
</Form>
|
|
|
|
|
</LoaderPortal>
|
|
|
|
|
</Modal>
|
|
|
|
|
)
|
|
|
|
|
})
|