Improve navbar menu

This commit is contained in:
Hazem Krimi
2023-04-06 22:23:44 +01:00
parent 82a16a7852
commit ca2b2de8bd
+13 -20
View File
@@ -15,45 +15,38 @@ type MenuProps = {
const Menu = ({ items, component, className }: MenuProps) => { const Menu = ({ items, component, className }: MenuProps) => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const ref = useRef<HTMLDivElement>(null); const componentRef = useRef<HTMLDivElement>(null);
const parentComponentRef = useRef<HTMLDivElement>();
useEffect(() => {
const wrapper = ref.current;
const openMenu = () => setOpen(true); const openMenu = () => setOpen(true);
const closeMenu = () => setOpen(false); const closeMenu = () => setOpen(false);
(document.querySelector(`#${component}`) as HTMLElement)?.addEventListener( useEffect(() => {
'mouseenter', parentComponentRef.current = document.querySelector(`#${component}`) as HTMLDivElement;
openMenu
); parentComponentRef.current?.addEventListener('mouseenter', openMenu);
ref.current?.addEventListener('mouseleave', closeMenu); componentRef.current?.addEventListener('mouseleave', closeMenu);
return () => { return () => {
( parentComponentRef.current?.removeEventListener('mouseenter', openMenu);
document.querySelector(`#${component}`) as HTMLElement componentRef.current?.removeEventListener('mouseleave', closeMenu);
)?.removeEventListener('mouseenter', openMenu);
wrapper?.addEventListener('mouseleave', closeMenu);
}; };
}, []);
// eslint-disable-next-line
}, [ref.current]);
return ( return (
<Wrapper <Wrapper
ref={ref} ref={componentRef}
className={className} className={className}
top={ top={
(document.querySelector(`#${component}`) as HTMLElement)?.offsetTop + 30 (parentComponentRef.current as HTMLDivElement)?.getBoundingClientRect().top + 30
} }
left={ left={
(document.querySelector(`#${component}`) as HTMLElement)?.offsetLeft (parentComponentRef.current as HTMLDivElement)?.getBoundingClientRect()?.left
} }
> >
{open && ( {open && (
<ul> <ul>
{items.map(({ icon, label, avoid, action }) => ( {items.map(({ icon, label, avoid, action }) => (
// eslint-disable-next-line
<li <li
onClick={() => { onClick={() => {
if (action) { if (action) {