import { RAGFlowAvatar } from '@/components/ragflow-avatar'; import { useTheme } from '@/components/theme-provider'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Segmented, SegmentedValue } from '@/components/ui/segmented'; import { LanguageList, LanguageMap } from '@/constants/common'; import { useChangeLanguage } from '@/hooks/logic-hooks'; import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks'; import { useNavigateWithFromState } from '@/hooks/route-hook'; import { useFetchUserInfo, useListTenant } from '@/hooks/user-setting-hooks'; import { TenantRole } from '@/pages/user-setting/constants'; import { Routes } from '@/routes'; import { camelCase } from 'lodash'; import { ChevronDown, CircleHelp, Cpu, File, Github, House, Library, MessageSquareText, Moon, Search, Sun, } from 'lucide-react'; import React, { useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useLocation } from 'umi'; const handleDocHelpCLick = () => { window.open('https://ragflow.io/docs/dev/category/guides', 'target'); }; export function Header() { const { t } = useTranslation(); const { pathname } = useLocation(); const navigate = useNavigateWithFromState(); const { navigateToProfile } = useNavigatePage(); const changeLanguage = useChangeLanguage(); const { setTheme, theme } = useTheme(); const { data: { language = 'English', avatar, nickname }, } = useFetchUserInfo(); const handleItemClick = (key: string) => () => { changeLanguage(key); }; const { data } = useListTenant(); const showBell = useMemo(() => { return data.some((x) => x.role === TenantRole.Invite); }, [data]); const items = LanguageList.map((x) => ({ key: x, label: {LanguageMap[x as keyof typeof LanguageMap]}, })); const onThemeClick = React.useCallback(() => { setTheme(theme === 'dark' ? 'light' : 'dark'); }, [setTheme, theme]); const handleBellClick = useCallback(() => { navigate('/user-setting/team'); }, [navigate]); const tagsData = useMemo( () => [ { path: Routes.Home, name: t('header.home'), icon: House }, { path: Routes.Datasets, name: t('header.knowledgeBase'), icon: Library }, { path: Routes.Chats, name: t('header.chat'), icon: MessageSquareText }, { path: Routes.Searches, name: t('header.search'), icon: Search }, { path: Routes.Agents, name: t('header.flow'), icon: Cpu }, { path: Routes.Files, name: t('header.fileManager'), icon: File }, ], [t], ); const options = useMemo(() => { return tagsData.map((tag) => { const HeaderIcon = tag.icon; return { label: tag.path === Routes.Home ? ( ) : ( {tag.name} ), value: tag.path, }; }); }, [tagsData]); const currentPath = useMemo(() => { return ( tagsData.find((x) => pathname.startsWith(x.path))?.path || Routes.Home ); }, [pathname, tagsData]); const handleChange = (path: SegmentedValue) => { navigate(path as Routes); }; const handleLogoClick = useCallback(() => { navigate(Routes.Home); }, [navigate]); return (
logo
21.5k stars
{t(`common.${camelCase(language)}`)}
{items.map((x) => ( {x.label} ))}
Pro
); }