gatsby-theme-docz
Version:
Gatsby theme created to use Docz
57 lines (54 loc) • 1.73 kB
JavaScript
/** @jsx jsx */
import { Fragment, forwardRef, useState, useRef, useEffect } from 'react'
import { Global } from '@emotion/react'
import { jsx, Box } from 'theme-ui'
import { useMenus, useCurrentDoc } from 'docz'
import * as styles from './styles'
import { NavSearch } from '../NavSearch'
import { NavLink } from '../NavLink'
import { NavGroup } from '../NavGroup'
export const Sidebar = forwardRef(function Sidebar(props, ref) {
const [query, setQuery] = useState('')
const menus = useMenus({ query })
const currentDoc = useCurrentDoc()
const currentDocRef = useRef()
const handleChange = ev => {
setQuery(ev.target.value)
}
useEffect(() => {
if (ref.current && currentDocRef.current) {
ref.current.scrollTo(0, currentDocRef.current.offsetTop)
}
}, [])
return (
<Fragment>
<Box onClick={props.onClick} sx={styles.overlay(props)}>
{props.open && <Global styles={styles.global} />}
</Box>
<Box ref={ref} sx={styles.wrapper(props)} data-testid="sidebar">
<NavSearch
placeholder="Type to search..."
value={query}
onChange={handleChange}
/>
{menus &&
menus.map(menu => {
if (!menu.route)
return <NavGroup key={menu.id} item={menu} sidebarRef={ref} />
if (menu.route === currentDoc.route) {
return (
<NavLink key={menu.id} item={menu} ref={currentDocRef}>
{menu.name}
</NavLink>
)
}
return (
<NavLink key={menu.id} item={menu}>
{menu.name}
</NavLink>
)
})}
</Box>
</Fragment>
)
})