- import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
- import { Button } from '@/components/ui/button';
- import { Container } from '@/components/ui/container';
- import { Segmented, SegmentedValue } from '@/components/ui/segmented';
- import { useTranslate } from '@/hooks/common-hooks';
- import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks';
- import { useNavigateWithFromState } from '@/hooks/route-hook';
- import { cn } from '@/lib/utils';
- import { Routes } from '@/routes';
- import {
- ChevronDown,
- Cpu,
- File,
- Github,
- House,
- Library,
- MessageSquareText,
- Search,
- Star,
- Zap,
- } from 'lucide-react';
- import { useCallback, useMemo } from 'react';
- import { useLocation } from 'umi';
-
- export function Header() {
- const { t } = useTranslate('header');
- const { pathname } = useLocation();
- const navigate = useNavigateWithFromState();
- const { navigateToHome, navigateToProfile } = useNavigatePage();
-
- const tagsData = useMemo(
- () => [
- { path: Routes.Datasets, name: t('knowledgeBase'), icon: Library },
- { path: Routes.Chats, name: t('chat'), icon: MessageSquareText },
- { path: Routes.Search, name: t('search'), icon: Search },
- { path: Routes.Agent, name: t('flow'), icon: Cpu },
- { path: Routes.Files, name: t('fileManager'), icon: File },
- ],
- [t],
- );
-
- const options = useMemo(() => {
- return tagsData.map((tag) => {
- const HeaderIcon = tag.icon;
-
- return {
- label: (
- <div className="flex items-center gap-1">
- <HeaderIcon className="size-5"></HeaderIcon>
- <span>{tag.name}</span>
- </div>
- ),
- value: tag.path,
- };
- });
- }, [tagsData]);
-
- const currentPath = useMemo(() => {
- return (
- tagsData.find((x) => pathname.startsWith(x.path))?.path || Routes.Home
- );
- }, [pathname, tagsData]);
-
- const isHome = Routes.Home === currentPath;
-
- const handleChange = (path: SegmentedValue) => {
- navigate(path as Routes);
- };
-
- const handleLogoClick = useCallback(() => {
- navigate(Routes.Home);
- }, [navigate]);
-
- return (
- <section className="py-6 px-10 flex justify-between items-center border-b">
- <div className="flex items-center gap-4">
- <img
- src={'/logo.svg'}
- alt="logo"
- className="w-[100] h-[100] mr-[12]"
- onClick={handleLogoClick}
- />
- <Button
- variant="secondary"
- className="bg-colors-background-inverse-standard"
- >
- <Github />
- 21.5k stars
- <Star />
- </Button>
- </div>
- <div className="flex gap-2 items-center">
- <Button
- variant={'icon'}
- size={'icon'}
- onClick={navigateToHome}
- className={cn({
- 'bg-colors-background-inverse-strong': isHome,
- })}
- >
- <House
- className={cn({
- 'text-colors-text-inverse-strong': isHome,
- })}
- />
- </Button>
- <div className="h-8 w-[1px] bg-colors-outline-neutral-strong"></div>
- <Segmented
- options={options}
- value={currentPath}
- onChange={handleChange}
- className="bg-colors-background-inverse-standard text-backgroundInverseStandard-foreground"
- ></Segmented>
- </div>
- <div className="flex items-center gap-4">
- <Container className="bg-colors-background-inverse-standard hidden xl:flex">
- V 0.13.0
- <Button variant="secondary" className="size-8">
- <ChevronDown />
- </Button>
- </Container>
- <Container className="px-3 py-2 bg-colors-background-inverse-standard">
- <Avatar
- className="w-[30px] h-[30px] cursor-pointer"
- onClick={navigateToProfile}
- >
- <AvatarImage src="https://github.com/shadcn.png" />
- <AvatarFallback>CN</AvatarFallback>
- </Avatar>
- <span className="max-w-14 truncate"> yifanwu92@gmail.com</span>
- <Button
- variant="destructive"
- className="py-[2px] px-[8px] h-[23px] rounded-[4px]"
- >
- <Zap />
- Pro
- </Button>
- </Container>
- </div>
- </section>
- );
- }
|