"use client";
import { useEffect, useState } from "react";
import ReactDom from "react-dom";
type Props = {
active: boolean;
setActive: React.Dispatch<React.SetStateAction<boolean>>;
children: string | JSX.Element | JSX.Element[];
};
const Drawer = ({ active, setActive, children }: Props) => {
const [isVisible, setIsVisible] = useState(false);
const closeDrawer = () => {
setIsVisible(false);
setTimeout(() => {
setActive(false);
}, 300);
};
useEffect(() => {
if (active) {
setIsVisible(true);
}
}, [active]);
if (!active) return null;
return ReactDom.createPortal(
<div
role="dialog"
aria-modal="true"
style={{
opacity: isVisible ? "1" : "0",
visibility: isVisible ? "visible" : "hidden",
}}
onClick={closeDrawer}
className="fixed left-0 top-0 z-50 flex h-[100dvh] w-screen items-start justify-start bg-white/05 backdrop-blur-md transition-all duration-300">
<div
onClick={e => e.stopPropagation()}
style={{
transform: `translateX(${isVisible ? "0" : "-300px"})`,
}}
className="z-10 h-full w-[300px] border-r border-white/15 bg-black/50 font-bold transition-transform duration-300">
{children ? children : <h1>Drawer</h1>}
</div>
</div>,
document.getElementById("drawer") as HTMLElement
// don't forget to add
// <div id="drawer"></div>
// to index.html
);
};
export default Drawer;