feat: 增加修改密码逻辑

pull/81/head
moonrailgun 3 years ago
parent f6eb4d5417
commit 418a9a529f

@ -140,6 +140,7 @@ export {
loginWithEmail,
loginWithToken,
registerWithEmail,
modifyUserPassword,
createTemporaryUser,
claimTemporaryUser,
searchUserWithUniqueName,

@ -82,6 +82,16 @@ export async function registerWithEmail(
return data;
}
export async function modifyUserPassword(
oldPassword: string,
newPassword: string
): Promise<void> {
await request.post('/api/user/modifyPassword', {
oldPassword,
newPassword,
});
}
/**
* 访
* @param nickname 访

@ -41,6 +41,7 @@ const AppContainer: React.FC = React.memo((props) => {
<div
id="tailchat-app"
className={clsx(
'tailchat-app',
'absolute inset-0 select-none',
{
dark: isDarkMode,

@ -42,7 +42,7 @@ const schema = createFastFormSchema({
interface ClaimTemporaryUserProps {
userId: string;
onSuccess: () => void;
onSuccess?: () => void;
}
export const ClaimTemporaryUser: React.FC<ClaimTemporaryUserProps> = React.memo(
(props) => {
@ -63,7 +63,7 @@ export const ClaimTemporaryUser: React.FC<ClaimTemporaryUserProps> = React.memo(
typeof props.onSuccess === 'function' && props.onSuccess();
},
[, userId, props.onSuccess]
[userId, props.onSuccess]
);
return (

@ -0,0 +1,84 @@
import React from 'react';
import {
createFastFormSchema,
FastFormFieldMeta,
fieldSchema,
modifyUserPassword,
showToasts,
t,
useAsyncRequest,
} from 'tailchat-shared';
import { ModalWrapper } from '../Modal';
import { WebFastForm } from '../WebFastForm';
interface Values {
oldPassword: string;
newPassword: string;
newPasswordRepeat: string;
}
const fields: FastFormFieldMeta[] = [
{
type: 'password',
name: 'oldPassword',
label: t('旧密码'),
},
{
type: 'password',
name: 'newPassword',
label: t('新密码'),
},
{
type: 'password',
name: 'newPasswordRepeat',
label: t('重复密码'),
},
];
const schema = createFastFormSchema({
oldPassword: fieldSchema
.string()
.min(6, t('密码不能低于6位'))
.required(t('密码不能为空')),
newPassword: fieldSchema
.string()
.min(6, t('密码不能低于6位'))
.required(t('密码不能为空')),
newPasswordRepeat: fieldSchema
.string()
.min(6, t('密码不能低于6位'))
.required(t('密码不能为空')),
});
interface ModifyPasswordProps {
onSuccess?: () => void;
}
export const ModifyPassword: React.FC<ModifyPasswordProps> = React.memo(
(props) => {
const [{}, handleModifyPassword] = useAsyncRequest(
async (values: Values) => {
if (values.newPassword !== values.newPasswordRepeat) {
showToasts(t('新旧密码不匹配'), 'warning');
return;
}
await modifyUserPassword(values.oldPassword, values.newPassword);
showToasts(t('密码修改成功'), 'success');
typeof props.onSuccess === 'function' && props.onSuccess();
},
[props.onSuccess]
);
return (
<ModalWrapper title={t('修改密码')}>
<WebFastForm
schema={schema}
fields={fields}
onSubmit={handleModifyPassword}
/>
</ModalWrapper>
);
}
);
ModifyPassword.displayName = 'ModifyPassword';

@ -4,9 +4,11 @@ import {
DefaultFullModalInputEditorRender,
FullModalField,
} from '@/components/FullModal/Field';
import { openModal } from '@/components/Modal';
import { closeModal } from '@/plugin/common';
import { getGlobalSocket } from '@/utils/global-state-helper';
import { setUserJWT } from '@/utils/jwt-helper';
import { Button, Divider } from 'antd';
import { Button, Divider, Typography } from 'antd';
import React, { useCallback } from 'react';
import { useHistory } from 'react-router';
import {
@ -19,6 +21,7 @@ import {
userActions,
useUserInfo,
} from 'tailchat-shared';
import { ModifyPassword } from '../ModifyPassword';
export const SettingsAccount: React.FC = React.memo(() => {
const userInfo = useUserInfo();
@ -53,6 +56,10 @@ export const SettingsAccount: React.FC = React.memo(() => {
[]
);
const handleUpdatePassword = useCallback(() => {
const key = openModal(<ModifyPassword onSuccess={() => closeModal(key)} />);
}, []);
// 登出
const handleLogout = useCallback(async () => {
await setUserJWT(null);
@ -86,6 +93,14 @@ export const SettingsAccount: React.FC = React.memo(() => {
/>
</div>
</div>
<Divider />
<Typography.Title level={4}>{t('密码')}</Typography.Title>
<Button type="primary" onClick={handleUpdatePassword}>
{t('修改密码')}
</Button>
<Divider />
<div>

@ -1,5 +1,5 @@
// antd 主题色支持
#tailchat-app {
.tailchat-app {
--tc-primary-color: rgb(24, 144, 255);
.ant-btn-primary {

Loading…
Cancel
Save