| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | 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; |
| |
|