Skip to content

Commit 72c2a05

Browse files
authored
fix(react): uishell sidenavmenu active descendants (#15027)
1 parent 541bae9 commit 72c2a05

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

packages/react/src/components/UIShell/SideNavMenu.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ const SideNavMenu = React.forwardRef<HTMLElement, SideNavMenuProps>(
8989
const className = cx({
9090
[`${prefix}--side-nav__item`]: true,
9191
[`${prefix}--side-nav__item--active`]:
92-
isActive || (hasActiveChild(children) && !isExpanded),
92+
isActive || (hasActiveDescendant(children) && !isExpanded),
9393
[`${prefix}--side-nav__item--icon`]: IconElement,
9494
[`${prefix}--side-nav__item--large`]: large,
9595
[customClassName as string]: !!customClassName,
@@ -200,7 +200,7 @@ SideNavMenu.propTypes = {
200200
Defining the children parameter with the type ReactNode | ReactNode[]. This allows for various possibilities:
201201
a single element, an array of elements, or null or undefined.
202202
**/
203-
function hasActiveChild(children: ReactNode | ReactNode[]): boolean {
203+
function hasActiveDescendant(children: ReactNode | ReactNode[]): boolean {
204204
if (Array.isArray(children)) {
205205
return children.some((child) => {
206206
if (!React.isValidElement(child)) {
@@ -213,9 +213,14 @@ function hasActiveChild(children: ReactNode | ReactNode[]): boolean {
213213
const props = child.props as {
214214
isActive?: boolean;
215215
'aria-current'?: string;
216+
children: ReactNode | ReactNode[];
216217
};
217218

218-
if (props.isActive === true || props['aria-current']) {
219+
if (
220+
props.isActive === true ||
221+
props['aria-current'] ||
222+
(props.children instanceof Array && hasActiveDescendant(props.children))
223+
) {
219224
return true;
220225
}
221226

0 commit comments

Comments
 (0)