balibabu
feat: Let the top navigation bar open in a tab when you right click on it #3018 (#3486)
6b85a7f
import { ReactComponent as FileIcon } from '@/assets/svg/file-management.svg'; | |
import { ReactComponent as GraphIcon } from '@/assets/svg/graph.svg'; | |
import { ReactComponent as KnowledgeBaseIcon } from '@/assets/svg/knowledge-base.svg'; | |
import { useTranslate } from '@/hooks/common-hooks'; | |
import { useFetchAppConf } from '@/hooks/logic-hooks'; | |
import { useNavigateWithFromState } from '@/hooks/route-hook'; | |
import { MessageOutlined, SearchOutlined } from '@ant-design/icons'; | |
import { Flex, Layout, Radio, Space, theme } from 'antd'; | |
import { MouseEventHandler, useCallback, useMemo } from 'react'; | |
import { useLocation } from 'umi'; | |
import Toolbar from '../right-toolbar'; | |
import styles from './index.less'; | |
const { Header } = Layout; | |
const RagHeader = () => { | |
const { | |
token: { colorBgContainer }, | |
} = theme.useToken(); | |
const navigate = useNavigateWithFromState(); | |
const { pathname } = useLocation(); | |
const { t } = useTranslate('header'); | |
const appConf = useFetchAppConf(); | |
const tagsData = useMemo( | |
() => [ | |
{ path: '/knowledge', name: t('knowledgeBase'), icon: KnowledgeBaseIcon }, | |
{ path: '/chat', name: t('chat'), icon: MessageOutlined }, | |
{ path: '/search', name: t('search'), icon: SearchOutlined }, | |
{ path: '/flow', name: t('flow'), icon: GraphIcon }, | |
{ path: '/file', name: t('fileManager'), icon: FileIcon }, | |
], | |
[t], | |
); | |
const currentPath = useMemo(() => { | |
return ( | |
tagsData.find((x) => pathname.startsWith(x.path))?.name || 'knowledge' | |
); | |
}, [pathname, tagsData]); | |
const handleChange = useCallback( | |
(path: string): MouseEventHandler => | |
(e) => { | |
e.preventDefault(); | |
navigate(path); | |
}, | |
[navigate], | |
); | |
const handleLogoClick = useCallback(() => { | |
navigate('/'); | |
}, [navigate]); | |
return ( | |
<Header | |
style={{ | |
padding: '0 16px', | |
background: colorBgContainer, | |
display: 'flex', | |
justifyContent: 'space-between', | |
alignItems: 'center', | |
height: '72px', | |
}} | |
> | |
<a href={window.location.origin}> | |
<Space | |
size={12} | |
onClick={handleLogoClick} | |
className={styles.logoWrapper} | |
> | |
<img src="/logo.svg" alt="" className={styles.appIcon} /> | |
<span className={styles.appName}>{appConf.appName}</span> | |
</Space> | |
</a> | |
<Space size={[0, 8]} wrap> | |
<Radio.Group | |
defaultValue="a" | |
buttonStyle="solid" | |
className={styles.radioGroup} | |
value={currentPath} | |
> | |
{tagsData.map((item) => ( | |
<Radio.Button value={item.name} key={item.name}> | |
<a href={item.path}> | |
<Flex | |
align="center" | |
gap={8} | |
onClick={handleChange(item.path)} | |
className="cursor-pointer" | |
> | |
<item.icon | |
className={styles.radioButtonIcon} | |
stroke={item.name === currentPath ? 'black' : 'white'} | |
></item.icon> | |
{item.name} | |
</Flex> | |
</a> | |
</Radio.Button> | |
))} | |
</Radio.Group> | |
</Space> | |
<Toolbar></Toolbar> | |
</Header> | |
); | |
}; | |
export default RagHeader; | |