From bc07b18b880f366f76cb8b111942ee9fb151221b Mon Sep 17 00:00:00 2001 From: chanx <1243304602@qq.com> Date: Tue, 21 Jul 2026 13:20:44 +0800 Subject: [PATCH] Refactor: unify navbar icons through HomeIcon wrapper (#17143) --- web/src/layouts/components/global-navbar.tsx | 61 ++++++++++++++------ 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/web/src/layouts/components/global-navbar.tsx b/web/src/layouts/components/global-navbar.tsx index fb2a3978cd..f26c54a6df 100644 --- a/web/src/layouts/components/global-navbar.tsx +++ b/web/src/layouts/components/global-navbar.tsx @@ -2,22 +2,14 @@ import { useId, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Link, useLocation } from 'react-router'; -import { - LucideBrain, - LucideCpu, - LucideDatabase, - LucideFolderOpen, - LucideHouse, - LucideMenu, - LucideMessageSquareText, - LucideSearch, -} from 'lucide-react'; +import { LucideHouse, LucideMenu } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet'; import { cn } from '@/lib/utils'; import { Routes } from '@/routes'; import { supportsCssAnchor } from '@/utils/css-support'; +import { HomeIcon } from '@/components/svg-icon'; const PathMap = { [Routes.Datasets]: [Routes.Datasets, Routes.DatasetBase], @@ -33,29 +25,57 @@ const PathMap = { const matchesPath = (pathname: string, candidate: string) => pathname === candidate || pathname.startsWith(`${candidate}/`); +// Wrapper so dataset icon shares the same ComponentType<{ className? }> +// shape as Lucide icons in menuItems (avoids Element-vs-component union). +const MenuItemsIcon = ({ + className, + name, +}: { + className?: string; + name?: string; +}) => ; + const menuItems = [ { path: Routes.Root, name: 'header.home', icon: LucideHouse }, - { path: Routes.Datasets, name: 'header.dataset', icon: LucideDatabase }, + { + path: Routes.Datasets, + name: 'header.dataset', + icon: MenuItemsIcon, + icon_name: 'datasets', + }, { path: Routes.Chats, name: 'header.chat', - icon: LucideMessageSquareText, + icon: MenuItemsIcon, + icon_name: 'chats', 'data-testid': 'nav-chat', }, { path: Routes.Searches, name: 'header.search', - icon: LucideSearch, + icon: MenuItemsIcon, + icon_name: 'searches', 'data-testid': 'nav-search', }, { path: Routes.Agents, name: 'header.flow', - icon: LucideCpu, + icon: MenuItemsIcon, + icon_name: 'agents', 'data-testid': 'nav-agent', }, - { path: Routes.Memories, name: 'header.memories', icon: LucideBrain }, - { path: Routes.Files, name: 'header.fileManager', icon: LucideFolderOpen }, + { + path: Routes.Memories, + name: 'header.memories', + icon: MenuItemsIcon, + icon_name: 'memory', + }, + { + path: Routes.Files, + name: 'header.fileManager', + icon: MenuItemsIcon, + icon_name: 'file', + }, ]; function useActivePath() { @@ -185,12 +205,14 @@ export function DesktopNavbar() { function MobileNavItem({ label, icon: Icon, + icon_name, isActive, onClick, ...linkProps }: { label: string; - icon: React.ComponentType<{ className?: string }>; + icon: React.ComponentType<{ className?: string; name?: string }>; + icon_name?: string; isActive?: boolean; onClick?: () => void; to: string; @@ -209,7 +231,7 @@ function MobileNavItem({ )} aria-current={isActive ? 'page' : undefined} > - + {label} ); @@ -250,13 +272,14 @@ export function MobileNavbar({ renderFooter }: MobileNavbarProps) {