import classNames from 'classnames'; import React, { useState, useEffect, useRef } from 'react'; import { isUrl } from '../../../utils/navigation'; import { Link } from '../Link'; import { NavbarItem } from '../Navbar'; import { ModalContextProvider, ModalTrigger, Modal } from '../../data-display/Modal'; import { IsArrowless } from '../../../stories/navigation/Dropdown.stories'; interface Props { className?: string; items: NavbarItem[]; isArrowless?: boolean; isRight?: boolean; isActiveOnClick?: boolean; isModal?: boolean; displayDot?: boolean; } export const NavbarDropdown: React.FC = (props) => { const [isActive, setIsActive] = useState(false); /* state for the dropdown menu */ let onClickHandler = () => setIsActive(!isActive); let dropDownContent = ( <> {/** * Link content is populated by children prop * This is the only way a dash component can take a component as a prop */} {props.children}
{props.items.map((item, i) => { if (item.isDivider) { /** Use an
for dividers */ return
; } else if (item.isMenuLabel) { /** Use a and the menu-label class for menu labels */ return ( {item.label} ); } else if (item.href && isUrl(item.href)) { /** Use a regular tag for full external links */ return ( setIsActive(false)} > {item.label} ); } else { /** Use a component for internal links */ return ( setIsActive(false)} key={i}> {item.label} ); } })}
); if (props.isModal) { return (
{/** * Link content is populated by children prop * This is the only way a dash component can take a component as a prop */} {props.children}
{props.items.map((item, i) => { return ( /** prevent the dropwdown from closing */
e.stopPropagation()}> {item.label}
{item.header && item.header}
{item.content && item.content}
); })}
); } else if (props.isActiveOnClick) { return (
setIsActive(!isActive)} > {dropDownContent}
); } else { return (
setIsActive(true)} onMouseLeave={() => setIsActive(false)} > {dropDownContent}
); } }; NavbarDropdown.defaultProps = { items: [] };