baby_in_magento

menu.js

Apr 12th, 2024
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.23 KB | None | 0 0
  1. import React, { useEffect, useRef, useState } from 'react';
  2.  
  3. import { useIsInViewport } from '@magento/peregrine/lib/hooks/useIsInViewport';
  4. import { useMegaMenu } from '../../talons/MegaMenu/useMegaMenu';
  5. import { useStyle } from '@magento/venia-ui/lib/classify';
  6. import MegaMenuItem from './megaMenuItem';
  7. import defaultClasses from '@magento/venia-ui/lib/components/MegaMenu/megaMenu.module.css';
  8. import apiClient from '../../api';
  9. import { Link } from 'react-router-dom';
  10.  
  11. /**
  12. * The MegaMenu component displays menu with categories on desktop devices
  13. */
  14. const MegaMenu = props => {
  15. const mainNavRef = useRef(null);
  16.  
  17. const {
  18. megaMenuData,
  19. activeCategoryId,
  20. subMenuState,
  21. disableFocus,
  22. handleSubMenuFocus,
  23. categoryUrlSuffix,
  24. handleNavigate,
  25. handleClickOutside
  26. } = useMegaMenu({ mainNavRef });
  27.  
  28. const classes = useStyle(defaultClasses, props.classes);
  29.  
  30. const [mainNavWidth, setMainNavWidth] = useState(0);
  31. const shouldRenderItems = useIsInViewport({
  32. elementRef: mainNavRef
  33. });
  34.  
  35. const [banners, setBanners] = useState([]);
  36.  
  37. const getBanners = async () => {
  38. try {
  39. const response = await apiClient.get(apiClient.Urls.getSlider, {
  40. identifier: 'menu_banner'
  41. });
  42. if (response.success) {
  43. setBanners(response.data);
  44. }
  45. } catch (error) {
  46. console.log('error', error);
  47. }
  48. };
  49.  
  50. useEffect(() => {
  51. getBanners();
  52. }, []);
  53.  
  54. useEffect(() => {
  55. const handleResize = () => {
  56. const navWidth = mainNavRef.current
  57. ? mainNavRef.current.offsetWidth
  58. : null;
  59.  
  60. setMainNavWidth(navWidth);
  61. };
  62.  
  63. window.addEventListener('resize', handleResize);
  64.  
  65. handleResize();
  66.  
  67. return () => {
  68. window.removeEventListener('resize', handleResize);
  69. };
  70. });
  71.  
  72. let items = megaMenuData.children
  73. ? megaMenuData.children.map(category => {
  74. return (
  75. <MegaMenuItem
  76. category={category}
  77. activeCategoryId={activeCategoryId}
  78. categoryUrlSuffix={categoryUrlSuffix}
  79. mainNavWidth={mainNavWidth}
  80. onNavigate={handleNavigate}
  81. key={category.uid}
  82. subMenuState={subMenuState}
  83. disableFocus={disableFocus}
  84. handleSubMenuFocus={handleSubMenuFocus}
  85. handleClickOutside={handleClickOutside}
  86. banners={banners}
  87. />
  88. );
  89. })
  90. : null;
  91.  
  92. return (
  93. <nav
  94. ref={mainNavRef}
  95. className={classes.megaMenu}
  96. data-cy="MegaMenu-megaMenu"
  97. role="navigation"
  98. onFocus={handleSubMenuFocus}
  99. >
  100. {shouldRenderItems ? items : null}
  101. <Link to={'/crescent'} >
  102. <span className="megaMenuItem-megaMenuLink-TtE items-center inline-flex uppercase" ></span>
  103. </Link>
  104. </nav>
  105. );
  106. };
  107.  
  108. export default MegaMenu;
  109.  
Advertisement
Add Comment
Please, Sign In to add comment