in src/theme/DocSidebarItem/Category/index.tsx [104:230]
export default function DocSidebarItemCategory({
item,
onItemClick,
activePath,
level,
index,
length,
...props
}: DocSidebarItemCategoryProps): JSX.Element {
const [isDocsPage] = useIsDocPage(false);
const { items, label, collapsible, className, href } = item;
const {
docs: {
sidebar: { autoCollapseCategories },
},
} = useThemeConfig();
const hrefWithSSRFallback = useCategoryHrefWithSSRFallback(item);
const isActive = isActiveSidebarItem(item, activePath);
const isCurrentPage = isSamePath(href, activePath);
const { collapsed, setCollapsed } = useCollapsible({
// Active categories are always initialized as expanded. The default
// (`item.collapsed`) is only used for non-active categories.
initialState: () => {
if (!collapsible) {
return false;
}
return isActive ? false : item.collapsed;
},
});
const { expandedItem, setExpandedItem } = useDocSidebarItemsExpandedState();
// Use this instead of `setCollapsed`, because it is also reactive
const updateCollapsed = (toCollapsed: boolean = !collapsed) => {
setExpandedItem(toCollapsed ? null : index);
setCollapsed(toCollapsed);
};
useAutoExpandActiveCategory({ isActive, collapsed, updateCollapsed });
useEffect(() => {
if (collapsible && expandedItem != null && expandedItem !== index && autoCollapseCategories) {
setCollapsed(true);
}
}, [collapsible, expandedItem, index, setCollapsed, autoCollapseCategories]);
return (
<li
className={clsx(
ThemeClassNames.docs.docSidebarItemCategory,
ThemeClassNames.docs.docSidebarItemCategoryLevel(level),
'menu__list-item',
{
'menu__list-item--collapsed': collapsed,
},
className,
)}
>
<div
className={clsx('menu__list-item-collapsible', {
'menu__list-item-collapsible--active': isCurrentPage,
})}
>
{level === 1 && isDocsPage ? (
<p className={clsx('title_level_1')}>{label}</p>
) : (
<>
<Link
className={clsx('menu__link', {
'menu__link--sublist': collapsible,
'menu__link--sublist-caret': !href && collapsible,
'menu__link--active': isActive,
})}
onClick={
collapsible
? e => {
onItemClick?.(item);
if (href) {
updateCollapsed(false);
} else {
e.preventDefault();
updateCollapsed();
}
}
: () => {
onItemClick?.(item);
}
}
aria-current={isCurrentPage ? 'page' : undefined}
role={collapsible && !href ? 'button' : undefined}
aria-expanded={collapsible && !href ? !collapsed : undefined}
href={collapsible ? hrefWithSSRFallback ?? '#' : hrefWithSSRFallback}
{...props}
>
{label}
</Link>
{href && collapsible && (
<CollapseButton
collapsed={collapsed}
categoryLabel={label}
onClick={e => {
e.preventDefault();
updateCollapsed();
}}
/>
)}
</>
)}
</div>
<Collapsible
lazy
as="ul"
className={`menu__list ${level === 1 ? 'menu__list_level_2' : ''} ${level === 1 && !isDocsPage ? 'community_level_2' : ''} `}
collapsed={collapsed}
>
<DocSidebarItems
items={items}
tabIndex={collapsed ? -1 : 0}
onItemClick={onItemClick}
activePath={activePath}
level={level + 1}
/>
</Collapsible>
{level === 1 && index !== length - 1 && isDocsPage ? <div className="divider"></div> : null}
</li>
);
}