diff --git a/packages/frontend/admin/src/app.tsx b/packages/frontend/admin/src/app.tsx index 7038cd2c90..e1c5225f8e 100644 --- a/packages/frontend/admin/src/app.tsx +++ b/packages/frontend/admin/src/app.tsx @@ -91,7 +91,12 @@ export const router = _createBrowserRouter( }, { path: 'settings', - lazy: () => import('./modules/settings'), + children: [ + { + path: '*', + lazy: () => import('./modules/settings'), + }, + ], }, ], }, diff --git a/packages/frontend/admin/src/components/ui/accordion.tsx b/packages/frontend/admin/src/components/ui/accordion.tsx index c2b0b9e5eb..cc7c484c8b 100644 --- a/packages/frontend/admin/src/components/ui/accordion.tsx +++ b/packages/frontend/admin/src/components/ui/accordion.tsx @@ -21,7 +21,7 @@ const AccordionTrigger = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => ( - + void; }) => { - const { activeSubTab, setActiveSubTab } = useNav(); + const location = useLocation(); + const activeSubTab = location.hash.slice(1); + const handleClick = useCallback( (id: string) => { const targetElement = document.getElementById(id); @@ -29,36 +29,45 @@ export const CollapsibleItem = ({ }); } changeModule?.(title); - setActiveSubTab(id); }, - [changeModule, setActiveSubTab, title] + [changeModule, title] ); - return ( - + { + return isActive + ? 'w-full bg-zinc-100 inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50' + : ''; + }} + > handleClick(title)} - className={`py-2 px-3 rounded ${activeSubTab === title ? 'bg-zinc-100' : ''}`} + className={`py-2 px-3 rounded`} > {title} - - + + {items.map((item, index) => ( - { + return isActive && activeSubTab === item + ? `transition-all overflow-hidden w-full bg-zinc-100 inline-flex items-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50` + : ''; + }} > handleClick(item)} - className={`py-1 px-2 rounded text-ellipsis whitespace-nowrap overflow-hidden ${activeSubTab === item ? 'bg-zinc-100' : ''}`} + className={`py-1 px-2 rounded text-ellipsis whitespace-nowrap overflow-hidden`} > {item} - + ))} diff --git a/packages/frontend/admin/src/modules/nav/nav.tsx b/packages/frontend/admin/src/modules/nav/nav.tsx index 945f0dc7e9..9dccbba36c 100644 --- a/packages/frontend/admin/src/modules/nav/nav.tsx +++ b/packages/frontend/admin/src/modules/nav/nav.tsx @@ -8,54 +8,38 @@ import { buttonVariants } from '@affine/admin/components/ui/button'; import { cn } from '@affine/admin/utils'; import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'; import { ClipboardListIcon, SettingsIcon, UsersIcon } from 'lucide-react'; -import { useEffect } from 'react'; -import { Link } from 'react-router-dom'; +import { NavLink } from 'react-router-dom'; import { useGetServerRuntimeConfig } from '../settings/use-get-server-runtime-config'; import { CollapsibleItem } from './collapsible-item'; import { useNav } from './context'; import { UserDropdown } from './user-dropdown'; -const TabsMap: { [key: string]: string } = { - accounts: 'Accounts', - ai: 'AI', - config: 'Config', - settings: 'Settings', -}; - export function Nav() { const { moduleList } = useGetServerRuntimeConfig(); - const { activeTab, setActiveTab, setCurrentModule } = useNav(); - - useEffect(() => { - const path = window.location.pathname; - for (const key in TabsMap) { - if (path.includes(key)) { - setActiveTab(TabsMap[key]); - return; - } - } - }, [setActiveTab]); + const { setCurrentModule } = useNav(); return (