import { Fragment, useCallback, useEffect, useId, useMemo, useState } from 'react'; import classnames from 'classnames'; import getChildrenToArray from './getChildrenToArray'; import SideNavigationGroupContent from './GroupContent'; import Box from '../Box'; import { NestingProvider, useNesting } from '../contexts/NestingProvider'; import { useSideNavigation } from '../contexts/SideNavigationProvider'; import Flex from '../Flex'; import Heading from '../Heading'; import IconButton from '../IconButton'; import InternalDismissButton from '../sharedSubcomponents/InternalDismissButton'; import styles from '../SideNavigation.css'; import { Props } from '../SideNavigationGroup'; import TapArea from '../TapArea'; type SideNavigationGroupMobileProps = Props & { hasActiveChild: boolean; }; export default function SideNavigationGroupMobile({ children, badge, counter, display = 'expandable', hasActiveChild = false, icon, label, primaryAction, notificationAccessibilityLabel, }: SideNavigationGroupMobileProps) { // Manages PrimaryAction const [compression, setCompression] = useState<'compress' | 'none'>('compress'); const [hovered, setHovered] = useState(false); const [focused, setFocused] = useState(false); // Manages children const itemId = useId(); const { nestedLevel } = useNesting(); const { dismissButton, selectedItemId, setSelectedItemId, setSelectedMobileChildren, hideActiveChildren, setHideActiveChildren, } = useSideNavigation(); const isTopLevel = nestedLevel === 0; const childrenArray = getChildrenToArray({ children, filterLevel: 'nested', }); const childrenList = useMemo( () => ( ), [itemId, childrenArray], ); const [expanded, setExpanded] = useState(false); let topLevelChildrenList; if (isTopLevel) { topLevelChildrenList = ( { setHideActiveChildren(true); setSelectedMobileChildren(null); }} size="lg" tooltip={{ text: 'Go to previous item', idealDirection: 'up', }} /> {label} dismissButton?.onDismiss()} /> {childrenList} ); } const passedChildren = isTopLevel ? topLevelChildrenList : childrenList; const elevateChildrenToParent = useCallback( () => setSelectedMobileChildren( {passedChildren} , ), [passedChildren, setSelectedMobileChildren], ); useEffect(() => { if (isTopLevel && hasActiveChild && !hideActiveChildren) { elevateChildrenToParent(); } else if (hasActiveChild && !hideActiveChildren) { setExpanded(true); } }, [isTopLevel, hasActiveChild, hideActiveChildren, itemId, elevateChildrenToParent]); return (
  • setFocused(false)} onFocus={() => setFocused(true)} onMouseEnter={() => setHovered(true)} onMouseLeave={() => setHovered(false)} onTap={() => { if (isTopLevel) { elevateChildrenToParent(); } else { setExpanded((value) => { if (!value) setSelectedItemId(itemId); return !value; }); } }} rounding={2} tapStyle={compression} > {expanded ? passedChildren : null}
  • ); }