|
import { Domain } from '@/constants/common'; |
|
import { useTranslate } from '@/hooks/common-hooks'; |
|
import { useLogout } from '@/hooks/login-hooks'; |
|
import { useSecondPathName } from '@/hooks/route-hook'; |
|
import { useFetchSystemVersion } from '@/hooks/user-setting-hooks'; |
|
import type { MenuProps } from 'antd'; |
|
import { Flex, Menu } from 'antd'; |
|
import React, { useEffect, useMemo } from 'react'; |
|
import { useNavigate } from 'umi'; |
|
import { |
|
UserSettingBaseKey, |
|
UserSettingIconMap, |
|
UserSettingRouteKey, |
|
} from '../constants'; |
|
import styles from './index.less'; |
|
|
|
type MenuItem = Required<MenuProps>['items'][number]; |
|
|
|
const SideBar = () => { |
|
const navigate = useNavigate(); |
|
const pathName = useSecondPathName(); |
|
const { logout } = useLogout(); |
|
const { t } = useTranslate('setting'); |
|
const { version, fetchSystemVersion } = useFetchSystemVersion(); |
|
|
|
useEffect(() => { |
|
if (location.host !== Domain) { |
|
fetchSystemVersion(); |
|
} |
|
}, [fetchSystemVersion]); |
|
|
|
function getItem( |
|
label: string, |
|
key: React.Key, |
|
icon?: React.ReactNode, |
|
children?: MenuItem[], |
|
type?: 'group', |
|
): MenuItem { |
|
return { |
|
key, |
|
icon, |
|
children, |
|
label: ( |
|
<Flex justify={'space-between'}> |
|
{t(label)} |
|
<span className={styles.version}> |
|
{label === 'system' && version} |
|
</span> |
|
</Flex> |
|
), |
|
type, |
|
} as MenuItem; |
|
} |
|
|
|
const items: MenuItem[] = Object.values(UserSettingRouteKey).map((value) => |
|
getItem(value, value, UserSettingIconMap[value]), |
|
); |
|
|
|
const handleMenuClick: MenuProps['onClick'] = ({ key }) => { |
|
if (key === UserSettingRouteKey.Logout) { |
|
logout(); |
|
} else { |
|
navigate(`/${UserSettingBaseKey}/${key}`); |
|
} |
|
}; |
|
|
|
const selectedKeys = useMemo(() => { |
|
return [pathName]; |
|
}, [pathName]); |
|
|
|
return ( |
|
<section className={styles.sideBarWrapper}> |
|
<Menu |
|
selectedKeys={selectedKeys} |
|
mode="inline" |
|
items={items} |
|
onClick={handleMenuClick} |
|
style={{ width: 312 }} |
|
/> |
|
</section> |
|
); |
|
}; |
|
|
|
export default SideBar; |
|
|