|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import React, { useRef } from 'react'; |
|
|
import { Link } from 'react-router-dom'; |
|
|
import { Avatar, Button, Dropdown, Typography } from '@douyinfe/semi-ui'; |
|
|
import { ChevronDown } from 'lucide-react'; |
|
|
import { |
|
|
IconExit, |
|
|
IconUserSetting, |
|
|
IconCreditCard, |
|
|
IconKey, |
|
|
} from '@douyinfe/semi-icons'; |
|
|
import { stringToColor } from '../../../helpers'; |
|
|
import SkeletonWrapper from '../components/SkeletonWrapper'; |
|
|
|
|
|
const UserArea = ({ |
|
|
userState, |
|
|
isLoading, |
|
|
isMobile, |
|
|
isSelfUseMode, |
|
|
logout, |
|
|
navigate, |
|
|
t, |
|
|
}) => { |
|
|
const dropdownRef = useRef(null); |
|
|
if (isLoading) { |
|
|
return ( |
|
|
<SkeletonWrapper |
|
|
loading={true} |
|
|
type='userArea' |
|
|
width={50} |
|
|
isMobile={isMobile} |
|
|
/> |
|
|
); |
|
|
} |
|
|
|
|
|
if (userState.user) { |
|
|
return ( |
|
|
<div className='relative' ref={dropdownRef}> |
|
|
<Dropdown |
|
|
position='bottomRight' |
|
|
getPopupContainer={() => dropdownRef.current} |
|
|
render={ |
|
|
<Dropdown.Menu className='!bg-semi-color-bg-overlay !border-semi-color-border !shadow-lg !rounded-lg dark:!bg-gray-700 dark:!border-gray-600'> |
|
|
<Dropdown.Item |
|
|
onClick={() => { |
|
|
navigate('/console/personal'); |
|
|
}} |
|
|
className='!px-3 !py-1.5 !text-sm !text-semi-color-text-0 hover:!bg-semi-color-fill-1 dark:!text-gray-200 dark:hover:!bg-blue-500 dark:hover:!text-white' |
|
|
> |
|
|
<div className='flex items-center gap-2'> |
|
|
<IconUserSetting |
|
|
size='small' |
|
|
className='text-gray-500 dark:text-gray-400' |
|
|
/> |
|
|
<span>{t('个人设置')}</span> |
|
|
</div> |
|
|
</Dropdown.Item> |
|
|
<Dropdown.Item |
|
|
onClick={() => { |
|
|
navigate('/console/token'); |
|
|
}} |
|
|
className='!px-3 !py-1.5 !text-sm !text-semi-color-text-0 hover:!bg-semi-color-fill-1 dark:!text-gray-200 dark:hover:!bg-blue-500 dark:hover:!text-white' |
|
|
> |
|
|
<div className='flex items-center gap-2'> |
|
|
<IconKey |
|
|
size='small' |
|
|
className='text-gray-500 dark:text-gray-400' |
|
|
/> |
|
|
<span>{t('令牌管理')}</span> |
|
|
</div> |
|
|
</Dropdown.Item> |
|
|
<Dropdown.Item |
|
|
onClick={() => { |
|
|
navigate('/console/topup'); |
|
|
}} |
|
|
className='!px-3 !py-1.5 !text-sm !text-semi-color-text-0 hover:!bg-semi-color-fill-1 dark:!text-gray-200 dark:hover:!bg-blue-500 dark:hover:!text-white' |
|
|
> |
|
|
<div className='flex items-center gap-2'> |
|
|
<IconCreditCard |
|
|
size='small' |
|
|
className='text-gray-500 dark:text-gray-400' |
|
|
/> |
|
|
<span>{t('钱包管理')}</span> |
|
|
</div> |
|
|
</Dropdown.Item> |
|
|
<Dropdown.Item |
|
|
onClick={logout} |
|
|
className='!px-3 !py-1.5 !text-sm !text-semi-color-text-0 hover:!bg-semi-color-fill-1 dark:!text-gray-200 dark:hover:!bg-red-500 dark:hover:!text-white' |
|
|
> |
|
|
<div className='flex items-center gap-2'> |
|
|
<IconExit |
|
|
size='small' |
|
|
className='text-gray-500 dark:text-gray-400' |
|
|
/> |
|
|
<span>{t('退出')}</span> |
|
|
</div> |
|
|
</Dropdown.Item> |
|
|
</Dropdown.Menu> |
|
|
} |
|
|
> |
|
|
<Button |
|
|
theme='borderless' |
|
|
type='tertiary' |
|
|
className='flex items-center gap-1.5 !p-1 !rounded-full hover:!bg-semi-color-fill-1 dark:hover:!bg-gray-700 !bg-semi-color-fill-0 dark:!bg-semi-color-fill-1 dark:hover:!bg-semi-color-fill-2' |
|
|
> |
|
|
<Avatar |
|
|
size='extra-small' |
|
|
color={stringToColor(userState.user.username)} |
|
|
className='mr-1' |
|
|
> |
|
|
{userState.user.username[0].toUpperCase()} |
|
|
</Avatar> |
|
|
<span className='hidden md:inline'> |
|
|
<Typography.Text className='!text-xs !font-medium !text-semi-color-text-1 dark:!text-gray-300 mr-1'> |
|
|
{userState.user.username} |
|
|
</Typography.Text> |
|
|
</span> |
|
|
<ChevronDown |
|
|
size={14} |
|
|
className='text-xs text-semi-color-text-2 dark:text-gray-400' |
|
|
/> |
|
|
</Button> |
|
|
</Dropdown> |
|
|
</div> |
|
|
); |
|
|
} else { |
|
|
const showRegisterButton = !isSelfUseMode; |
|
|
|
|
|
const commonSizingAndLayoutClass = |
|
|
'flex items-center justify-center !py-[10px] !px-1.5'; |
|
|
|
|
|
const loginButtonSpecificStyling = |
|
|
'!bg-semi-color-fill-0 dark:!bg-semi-color-fill-1 hover:!bg-semi-color-fill-1 dark:hover:!bg-gray-700 transition-colors'; |
|
|
let loginButtonClasses = `${commonSizingAndLayoutClass} ${loginButtonSpecificStyling}`; |
|
|
|
|
|
let registerButtonClasses = `${commonSizingAndLayoutClass}`; |
|
|
|
|
|
const loginButtonTextSpanClass = |
|
|
'!text-xs !text-semi-color-text-1 dark:!text-gray-300 !p-1.5'; |
|
|
const registerButtonTextSpanClass = '!text-xs !text-white !p-1.5'; |
|
|
|
|
|
if (showRegisterButton) { |
|
|
if (isMobile) { |
|
|
loginButtonClasses += ' !rounded-full'; |
|
|
} else { |
|
|
loginButtonClasses += ' !rounded-l-full !rounded-r-none'; |
|
|
} |
|
|
registerButtonClasses += ' !rounded-r-full !rounded-l-none'; |
|
|
} else { |
|
|
loginButtonClasses += ' !rounded-full'; |
|
|
} |
|
|
|
|
|
return ( |
|
|
<div className='flex items-center'> |
|
|
<Link to='/login' className='flex'> |
|
|
<Button |
|
|
theme='borderless' |
|
|
type='tertiary' |
|
|
className={loginButtonClasses} |
|
|
> |
|
|
<span className={loginButtonTextSpanClass}>{t('登录')}</span> |
|
|
</Button> |
|
|
</Link> |
|
|
{showRegisterButton && ( |
|
|
<div className='hidden md:block'> |
|
|
<Link to='/register' className='flex -ml-px'> |
|
|
<Button |
|
|
theme='solid' |
|
|
type='primary' |
|
|
className={registerButtonClasses} |
|
|
> |
|
|
<span className={registerButtonTextSpanClass}>{t('注册')}</span> |
|
|
</Button> |
|
|
</Link> |
|
|
</div> |
|
|
)} |
|
|
</div> |
|
|
); |
|
|
} |
|
|
}; |
|
|
|
|
|
export default UserArea; |
|
|
|