import React, {useEffect, useMemo} from 'react';
import clsx from 'clsx';
import {
  ThemeClassNames,
  useThemeConfig,
  usePrevious,
  Collapsible,
  useCollapsible,
} from '@docusaurus/theme-common';
import {
  isActiveSidebarItem,
  findFirstSidebarItemLink,
  useDocSidebarItemsExpandedState,
  isSamePath,
} from '@docusaurus/theme-common/internal';
import Link from '@docusaurus/Link';
import {translate} from '@docusaurus/Translate';
import useIsBrowser from '@docusaurus/useIsBrowser';
import DocSidebarItems from '@theme/DocSidebarItems';
// If we navigate to a category and it becomes active, it should automatically
// expand itself
function useAutoExpandActiveCategory({isActive, collapsed, updateCollapsed}) {
  const wasActive = usePrevious(isActive);
  useEffect(() => {
    const justBecameActive = isActive && !wasActive;
    if (justBecameActive && collapsed) {
      updateCollapsed(false);
    }
  }, [isActive, wasActive, collapsed, updateCollapsed]);
}
/**
 * When a collapsible category has no link, we still link it to its first child
 * during SSR as a temporary fallback. This allows to be able to navigate inside
 * the category even when JS fails to load, is delayed or simply disabled
 * React hydration becomes an optional progressive enhancement
 * see https://github.com/facebookincubator/infima/issues/36#issuecomment-772543188
 * see https://github.com/facebook/docusaurus/issues/3030
 */
function useCategoryHrefWithSSRFallback(item) {
  const isBrowser = useIsBrowser();
  return useMemo(() => {
    if (item.href && !item.linkUnlisted) {
      return item.href;
    }
    // In these cases, it's not necessary to render a fallback
    // We skip the "findFirstCategoryLink" computation
    if (isBrowser || !item.collapsible) {
      return undefined;
    }
    return findFirstSidebarItemLink(item);
  }, [item, isBrowser]);
}
function CollapseButton({collapsed, categoryLabel, onClick}) {
  return (
    <button
      aria-label={
        collapsed
          ? translate(
              {
                id: 'theme.DocSidebarItem.expandCategoryAriaLabel',
                message: "Expand sidebar category '{label}'",
                description: 'The ARIA label to expand the sidebar category',
              },
              {label: categoryLabel},
            )
          : translate(
              {
                id: 'theme.DocSidebarItem.collapseCategoryAriaLabel',
                message: "Collapse sidebar category '{label}'",
                description: 'The ARIA label to collapse the sidebar category',
              },
              {label: categoryLabel},
            )
      }
      type="button"
      className="clean-btn menu__caret"
      onClick={onClick}
    />
  );
}
export default function DocSidebarItemCategory({
  item,
  onItemClick,
  activePath,
  level,
  index,
  ...props
}) {
  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 = !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,
        })}>
        <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}
          aria-expanded={collapsible ? !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" collapsed={collapsed}>
        <DocSidebarItems
          items={items}
          tabIndex={collapsed ? -1 : 0}
          onItemClick={onItemClick}
          activePath={activePath}
          level={level + 1}
        />
      </Collapsible>
    </li>
  );
}

Synonyms

pussy-ts/src/components/index.js
cyb/src/components/index.js
cyb/netlify/prebuild/index.js
pussy-ts/netlify/prebuild/index.js
cybertensor-developer-docs/src/theme/Footer/index.js
cybertensor-developer-docs/src/theme/EditThisPage/index.js
cybertensor-developer-docs/src/theme/DocBreadcrumbs/index.js
cybertensor-developer-docs/src/theme/NavbarItem/index.js
cybertensor-developer-docs/src/theme/Navbar/index.js
cybertensor-developer-docs/src/theme/DocSidebarItem/index.js
cybertensor-developer-docs/src/theme/SearchBar/index.js
cybertensor-developer-docs/src/theme/DocSidebar/index.js
cybertensor-developer-docs/src/theme/TOC/index.js
cybertensor-developer-docs/src/theme/DocSidebarItems/index.js
cybertensor-developer-docs/src/theme/MDXComponents/index.js
cyb/src/pages/teleport/hooks/index.js
pussy-ts/src/containers/warp/pool/index.js
pussy-ts/src/containers/energy/tab/index.js
cybertensor-developer-docs/src/theme/Navbar/Search/index.js
pussy-ts/src/components/particle/components/index.js
cyb/src/containers/temple/hooks/index.js
cybertensor-developer-docs/src/theme/Navbar/MobileSidebar/index.js
cyb/src/containers/sigma/components/index.js
cybertensor-developer-docs/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.js
cybertensor-developer-docs/src/theme/DocItem/Content/index.js
cyb/src/containers/energy/component/index.js
cyb/src/containers/warp/pool/index.js
cybertensor-developer-docs/src/theme/Icon/LightMode/index.js
pussy-ts/src/containers/energy/ui/index.js
cybertensor-developer-docs/src/theme/Navbar/ColorModeToggle/index.js
pussy-ts/src/containers/temple/pages/index.js
cybertensor-developer-docs/src/theme/Footer/Layout/index.js
cybertensor-developer-docs/src/theme/MDXComponents/Ul/index.js
pussy-ts/src/pages/teleport/hooks/index.js
cybertensor-developer-docs/src/theme/DocSidebarItem/Html/index.js
cybertensor-developer-docs/src/theme/DocItem/Layout/index.js
cyb/src/components/particle/components/index.js
cybertensor-developer-docs/src/theme/Footer/Links/index.js
pussy-ts/src/containers/energy/component/index.js
cybertensor-developer-docs/src/theme/DocSidebar/Mobile/index.js
pussy-ts/src/containers/sigma/components/index.js
cybertensor-developer-docs/src/theme/DocItem/Footer/index.js
cybertensor-developer-docs/src/theme/DocSidebarItem/Link/index.js
cybertensor-developer-docs/src/theme/Footer/Logo/index.js
cybertensor-developer-docs/src/theme/Icon/DarkMode/index.js
cybertensor-developer-docs/src/theme/MDXComponents/Cards/index.js
pussy-ts/src/containers/nebula/components/index.js
cyb/src/containers/energy/ui/index.js
cybertensor-developer-docs/src/theme/Navbar/Content/index.js
cyb/src/containers/nebula/components/index.js
pussy-ts/src/containers/temple/hooks/index.js
cyb/src/containers/energy/tab/index.js
cybertensor-developer-docs/src/theme/DocSidebar/Desktop/index.js
cyb/src/containers/temple/pages/index.js
cybertensor-developer-docs/src/theme/Navbar/Layout/index.js
cybertensor-developer-docs/src/theme/Navbar/Logo/index.js
cybertensor-developer-docs/src/theme/Icon/ExternalLink/index.js
cybertensor-developer-docs/src/theme/Icon/Arrow/index.js
cybertensor-developer-docs/src/theme/Admonition/Layout/index.js
cybertensor-developer-docs/src/theme/Footer/LinkItem/index.js
cybertensor-developer-docs/src/theme/Footer/Copyright/index.js
cybertensor-developer-docs/src/theme/NavbarItem/DropdownNavbarItem/index.js
cyb/src/pages/teleport/components/Inputs/index.js
cybertensor-developer-docs/src/theme/Navbar/MobileSidebar/Header/index.js
pussy-ts/src/containers/sigma/components/cardUi/index.js
cybertensor-developer-docs/src/theme/DocBreadcrumbs/Items/Home/index.js
pussy-ts/src/containers/portal/components/avataIpfs/index.js
cybertensor-developer-docs/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.js
cyb/src/containers/temple/pages/play/index.js
cyb/src/pages/teleport/mainScreen/components/index.js
cybertensor-developer-docs/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.js
cybertensor-developer-docs/src/theme/Footer/Links/MultiColumn/index.js
cybertensor-developer-docs/src/theme/Navbar/MobileSidebar/Toggle/index.js
pussy-ts/src/pages/teleport/mainScreen/components/index.js
cybertensor-developer-docs/src/theme/DocSidebar/Desktop/CollapseButton/index.js
cybertensor-developer-docs/src/theme/DocSidebar/Desktop/Content/index.js
cybertensor-developer-docs/src/theme/Footer/Links/Simple/index.js
pussy-ts/src/pages/teleport/components/Inputs/index.js
cyb/src/containers/portal/components/avataIpfs/index.js
cyb/src/containers/sigma/components/cardUi/index.js
pussy-ts/src/containers/temple/pages/play/index.js
cybertensor-developer-docs/src/theme/Navbar/MobileSidebar/Layout/index.js
cyb/src/pages/robot/_refactor/account/hooks/index.js
pussy-ts/src/pages/robot/_refactor/account/hooks/index.js

Neighbours