2021-07-08 12:55:42 +02:00

64 lines
1.5 KiB
TypeScript

import { FC, useEffect, useRef } from 'react'
import s from './Sidebar.module.css'
import cn from 'classnames'
import {
disableBodyScroll,
enableBodyScroll,
clearAllBodyScrollLocks,
} from 'body-scroll-lock'
interface SidebarProps {
children: any
onClose: () => void
}
const Sidebar: FC<SidebarProps> = ({ children, onClose }) => {
const innerRef = useRef() as React.MutableRefObject<HTMLDivElement>
const ref = useRef() as React.MutableRefObject<HTMLDivElement>
const onKeyDownSidebar = (event: React.KeyboardEvent<HTMLDivElement>) => {
if (event.code === 'Escape') {
onClose()
}
}
useEffect(() => {
if (ref.current) {
ref.current.focus()
}
if (innerRef.current) {
disableBodyScroll(innerRef.current, { reserveScrollBarGap: true })
}
return () => {
if (innerRef && innerRef.current) {
enableBodyScroll(innerRef.current)
}
clearAllBodyScrollLocks()
}
}, [])
return (
<div
className={cn(s.root)}
ref={ref}
onKeyDown={onKeyDownSidebar}
tabIndex={1}
>
<div className="absolute inset-0 overflow-hidden">
<div className={s.backdrop} onClick={onClose} />
<section className="absolute inset-y-0 right-0 max-w-full flex outline-none pl-10">
<div className="h-full w-full md:w-screen md:max-w-md">
<div className={s.sidebar} ref={innerRef}>
{children}
</div>
</div>
</section>
</div>
</div>
)
}
export default Sidebar