diff --git a/src/components/Layout/Sidebar/SidebarLink.tsx b/src/components/Layout/Sidebar/SidebarLink.tsx index 9650e95fa8f..5d13dd141a5 100644 --- a/src/components/Layout/Sidebar/SidebarLink.tsx +++ b/src/components/Layout/Sidebar/SidebarLink.tsx @@ -28,6 +28,7 @@ interface SidebarLinkProps { icon?: React.ReactNode; isExpanded?: boolean; hideArrow?: boolean; + onToggle?: () => void; isPending: boolean; } @@ -39,6 +40,7 @@ export function SidebarLink({ level, isExpanded, hideArrow, + onToggle, isPending, }: SidebarLinkProps) { const ref = useRef(null); @@ -58,67 +60,72 @@ export function SidebarLink({ target = '_blank'; } return ( - 0, - 'ps-5': level < 2, - 'text-base font-bold': level === 0, - 'text-primary dark:text-primary-dark': level === 0 && !selected, - 'text-base text-secondary dark:text-secondary-dark': - level > 0 && !selected, - 'text-base text-link dark:text-link-dark bg-highlight dark:bg-highlight-dark border-blue-40 hover:bg-highlight hover:text-link dark:hover:bg-highlight-dark dark:hover:text-link-dark': - selected, - 'dark:bg-gray-70 bg-gray-3 dark:hover:bg-gray-70 hover:bg-gray-3': - isPending, - } - )}> - {/* This here needs to be refactored ofc */} -
- {title}{' '} - {version === 'major' && ( - - React 19 - - )} - {version === 'canary' && ( - - )} - {version === 'experimental' && ( - - )} - {version === 'rc' && ( - - )} -
- - {isExpanded != null && !hideArrow && ( - + 0, + 'ps-5': level < 2, + 'text-base font-bold': level === 0, + 'text-primary dark:text-primary-dark': level === 0 && !selected, + 'text-base text-secondary dark:text-secondary-dark': + level > 0 && !selected, + 'text-base text-link dark:text-link-dark bg-highlight dark:bg-highlight-dark border-blue-40 hover:bg-highlight hover:text-link dark:hover:bg-highlight-dark dark:hover:text-link-dark': + selected, + 'dark:bg-gray-70 bg-gray-3 dark:hover:bg-gray-70 hover:bg-gray-3': + isPending, + } + )}> +
+ {title}{' '} + {version === 'major' && ( + + React 19 + + )} + {version === 'canary' && ( + + )} + {version === 'experimental' && ( + + )} + {version === 'rc' && ( + + )} +
+ + {isExpanded != null && !hideArrow && onToggle != null && ( + )} - + ); } diff --git a/src/components/Layout/Sidebar/SidebarRouteTree.tsx b/src/components/Layout/Sidebar/SidebarRouteTree.tsx index 863355bfdc8..d8e783e0fe0 100644 --- a/src/components/Layout/Sidebar/SidebarRouteTree.tsx +++ b/src/components/Layout/Sidebar/SidebarRouteTree.tsx @@ -9,7 +9,7 @@ * Copyright (c) Facebook, Inc. and its affiliates. */ -import {useRef, useLayoutEffect, Fragment} from 'react'; +import {useRef, useLayoutEffect, useState, Fragment} from 'react'; import cn from 'classnames'; import {useRouter} from 'next/router'; @@ -87,6 +87,9 @@ export function SidebarRouteTree({ const slug = useRouter().asPath.split(/[\?\#]/)[0]; const pendingRoute = usePendingRoute(); const currentRoutes = routeTree.routes as RouteItem[]; + const [expandedRoutes, setExpandedRoutes] = useState>( + {} + ); return (
    {currentRoutes.map( @@ -119,7 +122,9 @@ export function SidebarRouteTree({ const isBreadcrumb = breadcrumbs.length > 1 && breadcrumbs[breadcrumbs.length - 1].path === path; - const isExpanded = isForceExpanded || isBreadcrumb || selected; + const isExpanded = + isForceExpanded || + (expandedRoutes[path] ?? (isBreadcrumb || selected)); listItem = (
  • + setExpandedRoutes((previous) => ({ + ...previous, + [path]: !isExpanded, + })) + } />