import React, { useState, useEffect, useRef } from 'react' import PropTypes from 'prop-types' import classNames from 'classnames' import { window } from 'browser-monads' import Link from './link' import Dropdown from './dropdown' import classes from '../styles/sidebar.module.sass' function getActiveHeading(items, slug) { if (/^\/?universe/.test(slug)) return 'Universe' for (let section of items) { for (let { isActive, url } of section.items) { if (isActive || slug === url) { return section.label } } } return 'Documentation' } const DropdownNavigation = ({ items, defaultValue }) => { return (
{items.map((section, i) => section.items.map(({ text, url }, j) => ( )) )}
) } const Sidebar = ({ items, pageMenu, slug }) => { const [initialized, setInitialized] = useState(false) const [activeSection, setActiveSection] = useState(null) const activeRef = useRef() const activeHeading = getActiveHeading(items, slug) useEffect(() => { const handleInView = ({ detail }) => setActiveSection(detail) window.addEventListener('inview', handleInView, { passive: true }) if (!initialized) { if (activeRef && activeRef.current) { activeRef.current.scrollIntoView({ block: 'center' }) } setInitialized(true) } return () => { window.removeEventListener('inview', handleInView) } }, [initialized]) return (

{activeHeading}

{items.map((section, i) => ( ))}
) } Sidebar.defaultProps = { items: [], pageMenu: [], } Sidebar.propTypes = { items: PropTypes.arrayOf( PropTypes.shape({ label: PropTypes.string.isRequired, items: PropTypes.arrayOf( PropTypes.shape({ text: PropTypes.string.isRequired, url: PropTypes.string, onClick: PropTypes.func, menu: PropTypes.arrayOf( PropTypes.shape({ text: PropTypes.string.isRequired, id: PropTypes.string.isRequired, }) ), }) ).isRequired, }) ), pageMenu: PropTypes.arrayOf( PropTypes.shape({ text: PropTypes.string.isRequired, id: PropTypes.string.isRequired, }) ), } export default Sidebar