|
import { ReactComponent as ConfigurationIcon } from '@/assets/svg/knowledge-configration.svg'; |
|
import { ReactComponent as DatasetIcon } from '@/assets/svg/knowledge-dataset.svg'; |
|
import { ReactComponent as TestingIcon } from '@/assets/svg/knowledge-testing.svg'; |
|
import { useFetchKnowledgeBaseConfiguration } from '@/hooks/knowledge-hooks'; |
|
import { |
|
useGetKnowledgeSearchParams, |
|
useSecondPathName, |
|
} from '@/hooks/route-hook'; |
|
import { getWidth } from '@/utils'; |
|
import { Avatar, Menu, MenuProps, Space } from 'antd'; |
|
import classNames from 'classnames'; |
|
import { useCallback, useEffect, useMemo, useState } from 'react'; |
|
import { useTranslation } from 'react-i18next'; |
|
import { useNavigate } from 'umi'; |
|
import { KnowledgeRouteKey } from '../../constant'; |
|
|
|
import styles from './index.less'; |
|
|
|
const KnowledgeSidebar = () => { |
|
let navigate = useNavigate(); |
|
const activeKey = useSecondPathName(); |
|
const { knowledgeId } = useGetKnowledgeSearchParams(); |
|
|
|
const [windowWidth, setWindowWidth] = useState(getWidth()); |
|
const [collapsed, setCollapsed] = useState(false); |
|
const { t } = useTranslation(); |
|
const { data: knowledgeDetails } = useFetchKnowledgeBaseConfiguration(); |
|
|
|
const handleSelect: MenuProps['onSelect'] = (e) => { |
|
navigate(`/knowledge/${e.key}?id=${knowledgeId}`); |
|
}; |
|
|
|
type MenuItem = Required<MenuProps>['items'][number]; |
|
|
|
const getItem = useCallback( |
|
( |
|
label: string, |
|
key: React.Key, |
|
icon?: React.ReactNode, |
|
disabled?: boolean, |
|
children?: MenuItem[], |
|
type?: 'group', |
|
): MenuItem => { |
|
return { |
|
key, |
|
icon, |
|
children, |
|
label: t(`knowledgeDetails.${label}`), |
|
type, |
|
disabled, |
|
} as MenuItem; |
|
}, |
|
[t], |
|
); |
|
|
|
const items: MenuItem[] = useMemo(() => { |
|
return [ |
|
getItem( |
|
KnowledgeRouteKey.Dataset, |
|
KnowledgeRouteKey.Dataset, |
|
<DatasetIcon />, |
|
), |
|
getItem( |
|
KnowledgeRouteKey.Testing, |
|
KnowledgeRouteKey.Testing, |
|
<TestingIcon />, |
|
), |
|
getItem( |
|
KnowledgeRouteKey.Configuration, |
|
KnowledgeRouteKey.Configuration, |
|
<ConfigurationIcon />, |
|
), |
|
]; |
|
}, [getItem]); |
|
|
|
useEffect(() => { |
|
if (windowWidth.width > 957) { |
|
setCollapsed(false); |
|
} else { |
|
setCollapsed(true); |
|
} |
|
}, [windowWidth.width]); |
|
|
|
|
|
useEffect(() => { |
|
const widthSize = () => { |
|
const width = getWidth(); |
|
|
|
setWindowWidth(width); |
|
}; |
|
window.addEventListener('resize', widthSize); |
|
return () => { |
|
window.removeEventListener('resize', widthSize); |
|
}; |
|
}, []); |
|
|
|
return ( |
|
<div className={styles.sidebarWrapper}> |
|
<div className={styles.sidebarTop}> |
|
<Space size={8} direction="vertical"> |
|
<Avatar size={64} src={knowledgeDetails.avatar} /> |
|
<div className={styles.knowledgeTitle}>{knowledgeDetails.name}</div> |
|
</Space> |
|
<p className={styles.knowledgeDescription}> |
|
{knowledgeDetails.description} |
|
</p> |
|
</div> |
|
<div className={styles.divider}></div> |
|
<div className={styles.menuWrapper}> |
|
<Menu |
|
selectedKeys={[activeKey]} |
|
// mode="inline" |
|
className={classNames(styles.menu, { |
|
[styles.defaultWidth]: windowWidth.width > 957, |
|
[styles.minWidth]: windowWidth.width <= 957, |
|
})} |
|
// inlineCollapsed={collapsed} |
|
items={items} |
|
onSelect={handleSelect} |
|
/> |
|
</div> |
|
</div> |
|
); |
|
}; |
|
|
|
export default KnowledgeSidebar; |
|
|