import 'client/homebrew/navbar/navbar.less'; import React, { useState, useRef, useEffect} from 'react'; import createReactClass from 'create-react-class'; import _ from 'lodash'; import cx from 'classnames'; import NaturalCritIcon from 'client/components/svg/naturalcrit-d20.svg.jsx'; const Nav = { base : createReactClass({ displayName : 'Nav.base', render : function(){ return ; } }), logo : function(){ return NaturalCrit ; }, section : createReactClass({ displayName : 'Nav.section', render : function(){ return
{this.props.children}
; } }), item : createReactClass({ displayName : 'Nav.item', getDefaultProps : function() { return { icon : null, href : null, newTab : false, onClick : function(){}, color : null }; }, handleClick : function(e){ this.props.onClick(e); }, render : function(){ const classes = cx('navItem', this.props.color, this.props.className); let icon; if(this.props.icon) icon = ; const props = _.omit(this.props, ['newTab']); if(this.props.href){ return {this.props.children} {icon} ; } else { return
{this.props.children} {icon}
; } } }), dropdown : function dropdown(props) { props = Object.assign({}, props, { trigger : 'hover click' }); const myRef = useRef(null); const [showDropdown, setShowDropdown] = useState(false); useEffect(()=>{ document.addEventListener('click', handleClickOutside); return ()=>{ document.removeEventListener('click', handleClickOutside); }; }, []); function handleClickOutside(e) { // Close dropdown when clicked outside if(!myRef.current?.contains(e.target)) { handleDropdown(false); } } function handleDropdown(show) { setShowDropdown(show ?? !showDropdown); } const dropdownChildren = React.Children.map(props.children, (child, i)=>{ if(i < 1) return; return child; }); return (
handleDropdown(true) : undefined } onMouseLeave = { props.trigger.includes('hover') ? ()=>handleDropdown(false) : undefined } onClick = { props.trigger.includes('click') ? ()=>handleDropdown(true) : undefined } > {props.children[0] || props.children /*children is not an array when only one child*/} {showDropdown &&
{dropdownChildren}
}
); } }; export default Nav;