@ubertheme/mega-menu
Version:
UB Mega Menu Module for Magento PWA Studio
108 lines (99 loc) • 3.44 kB
JavaScript
import React from 'react';
import { func, number, shape, string } from 'prop-types';
import { mergeClasses } from '@magento/venia-ui/lib/classify';
import defaultClasses from './offCanvas.module.css';
import DEFAULT_OPERATIONS from '../../queries/getOffCanvasItems.graphql';
import { useMegaMenu } from '../../talons/MegaMenu/useMegaMenu';
import ItemLeaf from './itemLeaf';
import ItemBranch from './itemBranch';
import { Skeleton } from '@ubertheme/base';
const OffCanvas = props => {
const {
menuKey,
onNavigate,
parentMenuItemId,
setParentMenuItemId,
setBackMenuItem,
setNavTitle
} = props;
const { getMenuOffCanvasItemListQuery } = DEFAULT_OPERATIONS;
//Load menu items data via graphql
const talonProps = useMegaMenu({
query: getMenuOffCanvasItemListQuery,
menuKey,
parentMenuItemId,
setNavTitle,
setBackMenuItem
});
const { menuItems, error, loading } = talonProps;
const classes = mergeClasses(defaultClasses, props.classes);
let child;
if (error) {
child = (
<div className={classes['fetch_error']}>
Menu's Data Fetch Error: <pre>{error.message}</pre>
</div>
);
} else {
if (!menuItems) {
if (loading) {
child = (
<ul>
{[...new Array(5)].map((el, index) => (
<Skeleton
key={`skeleton-${index}`}
id={index}
classes={{
root: 'itemMobile'
}}
parentComponent="OffCanvas"
/>
))}
</ul>
);
}
} else if (menuItems.length === 0) {
child = (
<div className={classes.noResults}>No menu items found.</div>
);
} else {
child = (
<ul>
{Array.from(menuItems, menuItem => {
const hasChild =
menuItem.childs && menuItem.childs.length
? true
: false;
return hasChild ? (
<ItemBranch
key={menuItem.id}
item={menuItem}
setNavTitle={setNavTitle}
setParentMenuItemId={setParentMenuItemId}
/>
) : (
<ItemLeaf
key={menuItem.id}
item={menuItem}
onNavigate={onNavigate}
/>
);
})}
</ul>
);
}
}
return <div className={classes.root}>{child}</div>;
};
export default OffCanvas;
OffCanvas.propTypes = {
classes: shape({
root: string
}),
menuKey: string.isRequired,
parentMenuItemId: number.isRequired,
setParentMenuItemId: func.isRequired,
setBackMenuItem: func.isRequired,
setNavTitle: func.isRequired,
onNavigate: func.isRequired
};