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) {