@@ -100,19 +100,12 @@ function ExpandableSidebarItem({
100100 breadcrumbs,
101101 selected,
102102 pendingRoute,
103- } : ExpandableSidebarItemProps ) {
104- const isBreadcrumb =
105- breadcrumbs . length > 1 &&
106- breadcrumbs [ breadcrumbs . length - 1 ] . path === path ;
107- const defaultExpanded = isForceExpanded || isBreadcrumb || selected ;
108- const [ isExpanded , setIsExpanded ] = useState ( defaultExpanded ) ;
109-
110- useEffect ( ( ) => {
111- if ( defaultExpanded ) {
112- setIsExpanded ( true ) ;
113- }
114- } , [ defaultExpanded ] ) ;
115-
103+ isExpanded,
104+ onToggle,
105+ } : ExpandableSidebarItemProps & {
106+ isExpanded : boolean ;
107+ onToggle : ( ) => void ;
108+ } ) {
116109 return (
117110 < li key = { `${ title } -${ path } -${ level } -heading` } >
118111 < SidebarLink
@@ -123,11 +116,11 @@ function ExpandableSidebarItem({
123116 level = { level }
124117 title = { title }
125118 version = { version }
126- isExpanded = { isExpanded }
119+ isExpanded = { isForceExpanded || isExpanded }
127120 hideArrow = { isForceExpanded }
128- onToggle = { ( ) => setIsExpanded ( ! isExpanded ) }
121+ onToggle = { onToggle }
129122 />
130- < CollapseWrapper duration = { 250 } isExpanded = { isExpanded } >
123+ < CollapseWrapper duration = { 250 } isExpanded = { isForceExpanded || isExpanded } >
131124 < SidebarRouteTree
132125 isForceExpanded = { isForceExpanded }
133126 routeTree = { { title, routes} }
@@ -148,6 +141,25 @@ export function SidebarRouteTree({
148141 const slug = useRouter ( ) . asPath . split ( / [ \? \# ] / ) [ 0 ] ;
149142 const pendingRoute = usePendingRoute ( ) ;
150143 const currentRoutes = routeTree . routes as RouteItem [ ] ;
144+
145+ const defaultExpandedPath = currentRoutes . find ( ( { path} ) => {
146+ const isBreadcrumb =
147+ breadcrumbs . length > 1 &&
148+ breadcrumbs [ breadcrumbs . length - 1 ] . path === path ;
149+ const selected = slug === path ;
150+ return isBreadcrumb || selected ;
151+ } ) ?. path || null ;
152+
153+ const [ expandedPath , setExpandedPath ] = useState < string | null > (
154+ defaultExpandedPath
155+ ) ;
156+
157+ useEffect ( ( ) => {
158+ if ( defaultExpandedPath ) {
159+ setExpandedPath ( defaultExpandedPath ) ;
160+ }
161+ } , [ defaultExpandedPath ] ) ;
162+
151163 return (
152164 < ul >
153165 { currentRoutes . map (
@@ -189,6 +201,10 @@ export function SidebarRouteTree({
189201 breadcrumbs = { breadcrumbs }
190202 selected = { selected }
191203 pendingRoute = { pendingRoute }
204+ isExpanded = { expandedPath === path }
205+ onToggle = { ( ) =>
206+ setExpandedPath ( expandedPath === path ? null : ( path || null ) )
207+ }
192208 />
193209 ) ;
194210 } else {
0 commit comments