forked from M3-Academy/m3-academy-template-vtexio
140 lines
5.7 KiB
TypeScript
140 lines
5.7 KiB
TypeScript
/* eslint-disable no-prototype-builtins */
|
|
import React, { useEffect, useState } from "react";
|
|
import { MenuItemProps, SubMenuItemProps } from "../DynamicMenu";
|
|
import { Link } from "vtex.render-runtime";
|
|
|
|
import styles from "./MenuItemMobile.css";
|
|
|
|
const MenuItemMobile: React.FC<MenuItemProps> = ({
|
|
href,
|
|
title,
|
|
content,
|
|
internal,
|
|
items,
|
|
}: MenuItemProps) => {
|
|
const [subMenuItems, setSubMenuItems] = useState<SubMenuItemProps[]>([]);
|
|
const [showSubMenu, setShowSubMenu] = useState(false);
|
|
|
|
const standardizeSubItems = () => {
|
|
const newItems = items?.map((item) => {
|
|
if (item.hasOwnProperty("SubMenuItemProps")) {
|
|
return item.SubMenuItemProps;
|
|
}
|
|
return item;
|
|
});
|
|
setSubMenuItems(newItems as []);
|
|
};
|
|
|
|
useEffect(() => {
|
|
if (items) {
|
|
standardizeSubItems();
|
|
}
|
|
}, [items]);
|
|
|
|
return (
|
|
<>
|
|
<div className={styles.menuItemMobile}>
|
|
{subMenuItems.length === 0 ? (
|
|
<Link
|
|
className={styles.menuItemMobileLink}
|
|
to={href}
|
|
title={content}
|
|
target={internal ? "_self" : "_blank"}
|
|
>
|
|
{title}
|
|
</Link>
|
|
) : (
|
|
<button
|
|
className={styles.menuItemMobileSubToggler}
|
|
onClick={() => setShowSubMenu(!showSubMenu)}
|
|
>
|
|
{title}
|
|
</button>
|
|
)}
|
|
{subMenuItems && (
|
|
<div
|
|
className={`${styles.menuItemSubMenuContainer} ${
|
|
showSubMenu
|
|
? styles.menuItemSubMenuShown
|
|
: styles.menuItemSubMenuHidden
|
|
}`}
|
|
>
|
|
<button
|
|
className={styles.menuItemSubMenuClose}
|
|
onClick={() => setShowSubMenu(false)}
|
|
>
|
|
voltar
|
|
</button>
|
|
|
|
<a href={href} className={styles.titleMobile}>
|
|
{title}
|
|
</a>
|
|
|
|
<ul className={styles.menuItemSubMenuItems}>
|
|
{subMenuItems.map((item, i) => {
|
|
let isNextItemHighlight = false;
|
|
if (i > 0 || i !== subMenuItems.length) {
|
|
isNextItemHighlight = subMenuItems[i + 1]
|
|
?.highlight
|
|
? true
|
|
: false;
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<li
|
|
key={i}
|
|
className={`${
|
|
styles.menuItemSubMenuItem
|
|
}
|
|
${
|
|
isNextItemHighlight &&
|
|
styles.menuItemSubMenuLastItem
|
|
}`}
|
|
>
|
|
<Link
|
|
to={item.href}
|
|
title={item.content}
|
|
target={
|
|
item.internal
|
|
? "_self"
|
|
: "_blank"
|
|
}
|
|
className={`${
|
|
styles.menuItemSubMenuLink
|
|
} ${
|
|
item.highlight &&
|
|
styles.menuItemSubMenuLinkHighlight
|
|
}`}
|
|
data-highlight={item.highlight}
|
|
onClick={() => {
|
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
// @ts-ignore
|
|
Location.reload();
|
|
}}
|
|
>
|
|
{item.title}
|
|
</Link>
|
|
</li>
|
|
{isNextItemHighlight && (
|
|
<li
|
|
className={
|
|
styles.subMenuItemBreak
|
|
}
|
|
>
|
|
<span> </span>
|
|
</li>
|
|
)}
|
|
</>
|
|
);
|
|
})}
|
|
</ul>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export { MenuItemMobile };
|