feat: 增加修改密码逻辑

release/desktop
moonrailgun 4 years ago
parent f6eb4d5417
commit 418a9a529f

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

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

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

@ -42,7 +42,7 @@ const schema = createFastFormSchema({
interface ClaimTemporaryUserProps { interface ClaimTemporaryUserProps {
userId: string; userId: string;
onSuccess: () => void; onSuccess?: () => void;
} }
export const ClaimTemporaryUser: React.FC<ClaimTemporaryUserProps> = React.memo( export const ClaimTemporaryUser: React.FC<ClaimTemporaryUserProps> = React.memo(
(props) => { (props) => {
@ -63,7 +63,7 @@ export const ClaimTemporaryUser: React.FC<ClaimTemporaryUserProps> = React.memo(
typeof props.onSuccess === 'function' && props.onSuccess(); typeof props.onSuccess === 'function' && props.onSuccess();
}, },
[, userId, props.onSuccess] [userId, props.onSuccess]
); );
return ( 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, DefaultFullModalInputEditorRender,
FullModalField, FullModalField,
} from '@/components/FullModal/Field'; } from '@/components/FullModal/Field';
import { openModal } from '@/components/Modal';
import { closeModal } from '@/plugin/common';
import { getGlobalSocket } from '@/utils/global-state-helper'; import { getGlobalSocket } from '@/utils/global-state-helper';
import { setUserJWT } from '@/utils/jwt-helper'; import { setUserJWT } from '@/utils/jwt-helper';
import { Button, Divider } from 'antd'; import { Button, Divider, Typography } from 'antd';
import React, { useCallback } from 'react'; import React, { useCallback } from 'react';
import { useHistory } from 'react-router'; import { useHistory } from 'react-router';
import { import {
@ -19,6 +21,7 @@ import {
userActions, userActions,
useUserInfo, useUserInfo,
} from 'tailchat-shared'; } from 'tailchat-shared';
import { ModifyPassword } from '../ModifyPassword';
export const SettingsAccount: React.FC = React.memo(() => { export const SettingsAccount: React.FC = React.memo(() => {
const userInfo = useUserInfo(); 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 () => { const handleLogout = useCallback(async () => {
await setUserJWT(null); await setUserJWT(null);
@ -86,6 +93,14 @@ export const SettingsAccount: React.FC = React.memo(() => {
/> />
</div> </div>
</div> </div>
<Divider />
<Typography.Title level={4}>{t('密码')}</Typography.Title>
<Button type="primary" onClick={handleUpdatePassword}>
{t('修改密码')}
</Button>
<Divider /> <Divider />
<div> <div>

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

Loading…
Cancel
Save