'use client' import React, { Suspense, useCallback, useEffect, useMemo, useRef } from 'react' import { usePathname } from 'next/navigation' import Image from 'next/image' import '@/styles/userSidebar.scss' import { siteConfig } from '@/config/site' import Loading from '@/components/layouts/Loading' import SidebarUserFooter from '@/components/layouts/SidebarUserFooter' import SidebarNav from '@/components/layouts/sidebar/SidebarNav' import Button from '@/components/formElements/Button' import { MOBILE_SIDEBAR_WIDTH } from '@/config/sidebar' import MenuBurgerIcon from '@/components/icons/MenuBurgerIcon' import CloseIcon from '@/components/icons/CloseIcon' import { withBasePath } from '@/constants/images' const FOCUSABLE_SELECTOR = 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])' const SidebarMobile = () => { const [isOpen, setIsOpen] = React.useState(false) const triggerRef = useRef(null) const closeButtonRef = useRef(null) const panelRef = useRef(null) const pathname = usePathname() const accessibleMenus = useMemo(() => siteConfig().userSidebar, []) const handleLinkClick = () => { setIsOpen(false) } const closeMenu = useCallback(() => { setIsOpen(false) window.requestAnimationFrame(() => triggerRef.current?.focus()) }, []) useEffect(() => { if (!isOpen) return const previousOverflow = document.body.style.overflow const handleKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape') { closeMenu() return } if (event.key !== 'Tab') return const focusableElements = Array.from(panelRef.current?.querySelectorAll(FOCUSABLE_SELECTOR) ?? []) const firstElement = focusableElements[0] const lastElement = focusableElements.at(-1) if (!firstElement || !lastElement) return if (event.shiftKey && document.activeElement === firstElement) { event.preventDefault() lastElement.focus() } else if (!event.shiftKey && document.activeElement === lastElement) { event.preventDefault() firstElement.focus() } } document.body.style.overflow = 'hidden' document.addEventListener('keydown', handleKeyDown) window.requestAnimationFrame(() => closeButtonRef.current?.focus()) return () => { document.body.style.overflow = previousOverflow document.removeEventListener('keydown', handleKeyDown) } }, [closeMenu, isOpen]) return ( <> {isOpen ? (