mirror of https://github.com/msgbyte/tailchat
parent
7fcbbbd4d8
commit
6d913e0676
@ -1,8 +1,16 @@
|
||||
import type { UserLoginInfo } from '../../model/user';
|
||||
import { useAppSelector } from './useAppSelector';
|
||||
|
||||
/**
|
||||
* 获取当前用户基本信息
|
||||
*/
|
||||
export function useUserInfo(): UserLoginInfo | null {
|
||||
return useAppSelector((state) => state.user.info);
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户基本Id
|
||||
*/
|
||||
export function useUserId(): string | undefined {
|
||||
return useAppSelector((state) => state.user.info?._id);
|
||||
return useUserInfo()?._id;
|
||||
}
|
||||
|
@ -0,0 +1,74 @@
|
||||
import { Avatar } from '@/components/Avatar';
|
||||
import { AvatarUploader } from '@/components/AvatarUploader';
|
||||
import {
|
||||
DefaultFullModalInputEditorRender,
|
||||
FullModalField,
|
||||
} from '@/components/FullModal/Field';
|
||||
import React from 'react';
|
||||
import {
|
||||
modifyUserField,
|
||||
showToasts,
|
||||
t,
|
||||
UploadFileResult,
|
||||
useAppDispatch,
|
||||
useAsyncRequest,
|
||||
userActions,
|
||||
useUserInfo,
|
||||
} from 'tailchat-shared';
|
||||
|
||||
export const SettingsAccount: React.FC = React.memo(() => {
|
||||
const userInfo = useUserInfo();
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const [, handleUserAvatarChange] = useAsyncRequest(
|
||||
async (fileInfo: UploadFileResult) => {
|
||||
await modifyUserField('avatar', fileInfo.url);
|
||||
dispatch(
|
||||
userActions.setUserInfoField({
|
||||
fieldName: 'avatar',
|
||||
fieldValue: fileInfo.url,
|
||||
})
|
||||
);
|
||||
showToasts(t('修改头像成功'), 'success');
|
||||
},
|
||||
[]
|
||||
);
|
||||
|
||||
const [, handleUpdateNickName] = useAsyncRequest(
|
||||
async (newNickname: string) => {
|
||||
await modifyUserField('nickname', newNickname);
|
||||
dispatch(
|
||||
userActions.setUserInfoField({
|
||||
fieldName: 'nickname',
|
||||
fieldValue: newNickname,
|
||||
})
|
||||
);
|
||||
showToasts(t('修改头像成功'), 'success');
|
||||
},
|
||||
[]
|
||||
);
|
||||
|
||||
if (!userInfo) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex">
|
||||
<div className="w-1/3">
|
||||
<AvatarUploader onUploadSuccess={handleUserAvatarChange}>
|
||||
<Avatar size={128} src={userInfo.avatar} name={userInfo.nickname} />
|
||||
</AvatarUploader>
|
||||
</div>
|
||||
<div className="w-2/3">
|
||||
<FullModalField
|
||||
title={t('用户昵称')}
|
||||
value={userInfo.nickname}
|
||||
editable={true}
|
||||
renderEditor={DefaultFullModalInputEditorRender}
|
||||
onSave={handleUpdateNickName}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
});
|
||||
SettingsAccount.displayName = 'SettingsAccount';
|
Loading…
Reference in New Issue