'use client'; import { useState, useEffect, useRef } from 'react'; import { MenuItemType } from '@akinon/next/types'; import { useAppDispatch, useAppSelector } from '@akinon/next/redux/hooks'; import { closeMobileMenu } from '@akinon/next/redux/reducers/header'; import clsx from 'clsx'; import { UserMenu } from './user-menu'; import { Button, CurrencySelect, Icon, LanguageSelect, Link } from '@theme/components'; import { useLocalization } from '@akinon/next/hooks'; interface MobileMenuProps { menu: MenuItemType[]; } export default function MobileMenu(props: MobileMenuProps) { const { menu } = props; const dispatch = useAppDispatch(); const [selectedSubMenu, setSelectedSubMenu] = useState( null ); const { t } = useLocalization(); const isMobileMenuOpen = useAppSelector( (state) => state.header.isMobileMenuOpen ); const menuRef = useRef(null); useEffect(() => { function handleClickOutside(event: MouseEvent) { if ( isMobileMenuOpen && menuRef.current && !menuRef.current.contains(event.target as Node) ) { dispatch(closeMobileMenu()); setSelectedSubMenu(null); } } document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, [isMobileMenuOpen]); return ( <>
    {menu.map( (item, index) => item.label != null && (
  • { if (item.children.length > 0) { e.preventDefault(); e.stopPropagation(); setSelectedSubMenu(item); window?.parent?.postMessage( { type: 'MENU_TOGGLE', isMenuAction: true }, '*' ); } }} className="flex items-center justify-between" data-is-menu-toggle={ item.children.length > 0 ? 'true' : undefined } > {item.label}
  • ) )}
{selectedSubMenu?.label}
{selectedSubMenu?.children.map((child, index) => (
dispatch(closeMobileMenu())} href={child.url} className="text-xs font-bold py-4" > {child.label}
    {child.children.map((subChild, index) => (
  • dispatch(closeMobileMenu())} href={subChild.url} className="text-sm flex items-center justify-between py-4" > {subChild.label}
  • ))}
))}
); }