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';
|
import { useAppSelector } from './useAppSelector';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前用户基本信息
|
||||||
|
*/
|
||||||
|
export function useUserInfo(): UserLoginInfo | null {
|
||||||
|
return useAppSelector((state) => state.user.info);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户基本Id
|
* 用户基本Id
|
||||||
*/
|
*/
|
||||||
export function useUserId(): string | undefined {
|
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