"use client"; import links from "@/_data/links"; import socials from "@/_data/socials"; import { Dismiss24Regular, Navigation24Regular } from "@fluentui/react-icons"; import React, { useCallback, useEffect, useRef, useState } from "react"; import Button, { ButtonProps } from "./Button"; import NavigationLinks from "./NavigationLinks"; import cls from "./Sidemenu.module.scss"; import SocialLinks from "./SocialLinks"; const Sidemenu: React.FC = ({ button, ...panelProps }) => { const [isOpen, setOpen] = useState(false); const dialogRef = useRef(null); const onCancel: React.ReactEventHandler = useCallback((args) => { args.preventDefault(); setOpen(false); return true; }, []); // We use this method to enable user to close the menu by clicking ouside it. const onClick: React.MouseEventHandler = useCallback((args) => { const wrapper = args.currentTarget.childNodes[0]; // If user clicked outside of the dialog boudaries, or clicked specifically on an anchor, we can close the menu if (!wrapper.contains(args.target as Node) || args.target instanceof HTMLAnchorElement) setOpen(false); }, []); useEffect(() => { if (isOpen) { dialogRef.current?.showModal(); } else if (dialogRef.current?.classList.contains(cls.show)) // This check is to prevent a bug when the menu is closed before opening { dialogRef.current?.addEventListener("transitionend", function WaitForClose() { dialogRef.current?.removeEventListener("transitionend", WaitForClose); dialogRef.current?.close(); }); } dialogRef.current?.classList.toggle(cls.show, isOpen); }, [isOpen]); return <> ; }; export default Sidemenu; export type SidemenuProps = React.DialogHTMLAttributes & { button?: ButtonProps; };