Spaces:
Paused
Paused
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; | |