Advertisement
Guest User

Untitled

a guest
Nov 16th, 2023
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
TypeScript 17.50 KB | Source Code | 0 0
  1. /**
  2.  * Navigation components.
  3.  * @module components/theme/Navigation/Navigation
  4.  */
  5.  
  6. import React, { Component } from 'react';
  7. import PropTypes from 'prop-types';
  8. import { connect } from 'react-redux';
  9. import { compose } from 'redux';
  10. import { defineMessages, injectIntl } from 'react-intl';
  11. import { Menu } from 'semantic-ui-react';
  12. import cx from 'classnames';
  13. import { BodyClass, getBaseUrl, hasApiExpander } from '@plone/volto/helpers';
  14. import config from '@plone/volto/registry';
  15. import { getNavigation } from '@plone/volto/actions';
  16. import { CSSTransition } from 'react-transition-group';
  17. import NavItems from '@plone/volto/components/theme/Navigation/NavItems';
  18. import { Link, NavLink, withRouter } from 'react-router-dom';
  19. import { Logo, UniversalLink } from '@plone/volto/components';
  20. import { links } from './megamenu';
  21.  
  22.  
  23. class Navigation extends Component {
  24.  
  25.   static propTypes = {
  26.     getNavigation: PropTypes.func.isRequired,
  27.     pathname: PropTypes.string.isRequired,
  28.     items: PropTypes.arrayOf(PropTypes.shape({
  29.       title: PropTypes.string, url: PropTypes.string,
  30.     })).isRequired,
  31.     lang: PropTypes.string.isRequired,
  32.   };
  33.  
  34.   static defaultProps = {
  35.     token: null,
  36.   };
  37.  
  38.   componentDidMount() {
  39.     const { settings } = config;
  40.     if (!hasApiExpander('navigation', getBaseUrl(this.props.pathname))) {
  41.       this.props.getNavigation(getBaseUrl(this.props.pathname), settings.navDepth);
  42.     }
  43.   }
  44.  
  45.   UNSAFE_componentWillReceiveProps(nextProps) {
  46.     const { settings } = config;
  47.     if (nextProps.pathname !== this.props.pathname || nextProps.token !== this.props.token) {
  48.       if (!hasApiExpander('navigation', getBaseUrl(this.props.pathname))) {
  49.         this.props.getNavigation(getBaseUrl(nextProps.pathname), settings.navDepth);
  50.       }
  51.     }
  52.   }
  53.  
  54.   state = {
  55.     mobileMenu: false,
  56.     primaryNav: '',
  57.     secondaryNav: '',
  58.     tertiaryNav: '',
  59.     sectionNav: '',
  60.   };
  61.   closeMobileMenu = () => {
  62.     this.setState({
  63.       primaryNav: '',
  64.       secondaryNav: '',
  65.       tertiaryNav: '',
  66.       sectionNav: '',
  67.       mobileMenu: false,
  68.     });
  69.   };
  70.  
  71.   render() {
  72.     return (<>
  73.         <div className={`${this.state.mobileMenu === true ? 'cd-main-header nav-is-visible' : 'cd-main-header'}`}>
  74.           <Link className='cd-logo' to='/' onClick={this.closeMobileMenu}><Logo /></Link>
  75.           <ul className='cd-header-buttons'>
  76.             <li><a aria-label='Search'
  77.               className={`${this.state.primaryNav === 'search' ? 'cd-search-trigger search-is-visible' : 'cd-search-trigger'}`}
  78.               onClick={() => {
  79.                 this.setState(prevState => ({
  80.                   primaryNav:
  81.                     prevState.primaryNav !== 'search' ? 'search' : '',
  82.                   secondaryNav: '',
  83.                   sectionNav: '',
  84.                   mobileMenu: false,
  85.                 }));
  86.               }} href='javascript:'><span></span><span className='is-hidden'>Search</span></a></li>
  87.             <li><a
  88.               className={`${this.state.mobileMenu === true ? 'cd-nav-trigger nav-is-visible' : 'cd-nav-trigger'}`}
  89.               onClick={() => {
  90.                 this.setState(prevState => ({
  91.                   mobileMenu: !prevState.mobileMenu,
  92.                   primaryNav: '',
  93.                   secondaryNav: '',
  94.                   sectionNav: '',
  95.                 }));
  96.               }} href='javascript:'><span>Menu</span></a></li>
  97.           </ul>
  98.           <nav className={`${this.state.mobileMenu === true ? 'cd-nav cd-nav-is-visible' : 'cd-nav'}`}
  99.                id='navigation' aria-label='navigation'>
  100.             <ul id='cd-primary-nav'
  101.                 className={`${this.state.mobileMenu === true ? 'cd-primary-nav nav-is-visible' : 'cd-primary-nav'} ${this.state.primaryNav !== '' ? 'moves-out' : ''}`}>
  102.  
  103.               {links.map((link) => (
  104.                 <li className='has-children'>
  105.                   <a className={`${this.state.primaryNav === link.name ? 'selected' : ''}`}
  106.                      onClick={(event) => {
  107.                        event.preventDefault();
  108.                        this.state.primaryNav !== link.name ? this.setState(prevState => ({ primaryNav: link.name })) : this.setState(prevState => ({ primaryNav: '' }));
  109.                        this.setState(prevState => ({ secondaryNav: '' }));
  110.                        this.setState(prevState => ({ tertiaryNav: '' }));
  111.                        this.setState(prevState => ({ sectionNav: '' }));
  112.                      }} href={link.link}>
  113.                     {link.name}</a>
  114.  
  115.                   <CSSTransition
  116.                     in={this.state.primaryNav === link.name}
  117.                     timeout={500}
  118.                     classNames='primary'
  119.                     unmountOnExit>
  120.                     <ul
  121.                       className={link.styles + ` ${this.state.primaryNav !== link.name ? 'cd-hidden' : ''}` + ` ${this.state.secondaryNav !== '' ? 'moves-out' : ''}`}>
  122.                       <li className='go-back'><a href='#' onClick={(event) => {
  123.                         event.preventDefault();
  124.                         this.state.primaryNav !== link.name ? this.setState(prevState => ({ primaryNav: link.name })) : this.setState(prevState => ({ primaryNav: '' }));
  125.                         this.setState(prevState => ({ secondaryNav: '' }));
  126.                         this.setState(prevState => ({ sectionNav: '' }));
  127.                       }}>Main Menu</a></li>
  128.                       <li className='see-all'>
  129.                         {link.link.startsWith('http') ?
  130.                           <a href={link.link} onClick={this.closeMobileMenu}>{link.name} Resources</a> :
  131.                           <Link to={link.link} onClick={this.closeMobileMenu}>{link.name} Resources</Link>
  132.                         }
  133.                       </li>
  134.                       {link.styles === 'cd-nav-icons' && (
  135.                         link.sublinks.map((secondary) => (
  136.                           <li>
  137.                             {secondary.link.startsWith('http') ?
  138.                               <a className={'cd-nav-item ' + secondary.styles}
  139.                                  href={secondary.link} onClick={this.closeMobileMenu}>
  140.                                 <h3>{secondary.name}</h3>
  141.                                 <p>{secondary.description}</p>
  142.                               </a> :
  143.                               <Link className={'cd-nav-item ' + secondary.styles}
  144.                                     to={secondary.link} onClick={this.closeMobileMenu}>
  145.                                 <h3>{secondary.name}</h3>
  146.                                 <p>{secondary.description}</p>
  147.                               </Link>}
  148.                           </li>
  149.                         ))
  150.                       )}
  151.  
  152.                       {link.styles === 'cd-nav-gallery' && (
  153.                         link.sublinks.map((secondary) => (
  154.                           <li>
  155.                             {secondary.link.startsWith('http') ?
  156.                               <a className={'cd-nav-item ' + secondary.styles}
  157.                                  href={secondary.link} onClick={this.closeMobileMenu}>
  158.                                 <img src={secondary.image}
  159.                                      className='img-circle' alt=' ' />
  160.                                 <h3>{secondary.name}</h3>
  161.                               </a> :
  162.                               <Link className={'cd-nav-item ' + secondary.styles}
  163.                                     to={secondary.link} onClick={this.closeMobileMenu}>
  164.                                 <img src={secondary.image}
  165.                                      className='img-circle' alt=' ' />
  166.                                 <h3>{secondary.name}</h3>
  167.                               </Link>}
  168.                           </li>
  169.                         ))
  170.                       )}
  171.  
  172.                       {link.styles === 'cd-secondary-nav' && (
  173.                         link.sublinks.map((secondary) => (
  174.                           <li className='has-children'>
  175.                             <a href={secondary.link}
  176.                                onClick={(event) => {
  177.                                  event.preventDefault();
  178.                                  this.state.secondaryNav !== secondary.name ?
  179.                                    this.setState(prevState => ({ secondaryNav: secondary.name })) :
  180.                                    this.setState(prevState => ({ secondaryNav: '' }));
  181.                                  this.setState(prevState => ({ tertiaryNav: '' }));
  182.                                }}>{secondary.name}</a>
  183.                             <ul
  184.                               className={`${this.state.secondaryNav !== secondary.name ? 'cd-hidden' : ''}` + ` ${this.state.tertiaryNav !== '' & this.state.secondaryNav === secondary.name ? 'moves-out' : ''}`}>
  185.                               {this.state.mobileMenu === true && (
  186.                                 <>
  187.                                   <li className='go-back'><a href='#'
  188.                                                              onClick={(event) => {
  189.                                                                event.preventDefault();
  190.                                                                this.setState(prevState => ({ secondaryNav: '' }));
  191.                                                                this.setState(prevState => ({ tertiaryNav: '' }));
  192.                                                              }}>Back to {link.name}</a></li>
  193.                                   <li className='see-all'>
  194.  
  195.                                       <a href={secondary.link}
  196.                                          onClick={this.closeMobileMenu}>{secondary.name}</a>
  197.  
  198.                                   </li>
  199.                                 </>)}
  200.                               {secondary.sublink.map((tertiaryNav) => (
  201.                                 tertiaryNav.styles === 'has-children' ?
  202.                                   <li className='has-children'>
  203.                                     <a href={tertiaryNav.link}
  204.                                        onClick={(event) => {
  205.                                          event.preventDefault();
  206.                                          this.setState(prevState => ({ tertiaryNav: tertiaryNav.name }));
  207.                                        }}>{tertiaryNav.name}</a>
  208.                                     <ul
  209.                                       className={`${this.state.tertiaryNav !== tertiaryNav.name ? 'cd-hidden' : ''}` + ' tertiaryNav'}>
  210.  
  211.                                       <li className='go-back'><a href='#'
  212.                                                                  onClick={(event) => {
  213.                                                                    event.preventDefault();
  214.                                                                    this.setState(prevState => ({ tertiaryNav: '' }));
  215.                                                                  }}>Back to {secondary.name}</a></li>
  216.                                       <li className='see-all'>
  217.  
  218.                                           <a href={tertiaryNav.link}
  219.                                              onClick={this.closeMobileMenu}>{tertiaryNav.name}</a>
  220.                                       </li>
  221.  
  222.                                       {tertiaryNav.sublink.map((fourNav) => (
  223.                                         <li>
  224.                                           {fourNav.link.startsWith('http') ?
  225.                                             <a className={fourNav.styles} href={fourNav.link}
  226.                                                onClick={this.closeMobileMenu}>{fourNav.name}</a> :
  227.                                             <Link className={fourNav.styles} to={fourNav.link}
  228.                                                   onClick={this.closeMobileMenu}>{fourNav.name}</Link>}
  229.                                         </li>))}
  230.                                     </ul>
  231.                                   </li> :
  232.                                   <li>
  233.                                     {tertiaryNav.link.startsWith('http') ?
  234.                                       <a className={tertiaryNav.styles} href={tertiaryNav.link}
  235.                                          onClick={this.closeMobileMenu}>{tertiaryNav.name}</a> :
  236.                                       <Link className={tertiaryNav.styles} to={tertiaryNav.link}
  237.                                             onClick={this.closeMobileMenu}>{tertiaryNav.name}</Link>}
  238.                                   </li>
  239.                               ))}
  240.                             </ul>
  241.                           </li>
  242.                         ))
  243.                       )}
  244.  
  245.                     </ul>
  246.                   </CSSTransition>
  247.                 </li>))}
  248.  
  249.               <li className='cd-section'>
  250.                 <ul className={this.state.sectionNav !== '' ? 'section-menu moves-out' : 'section-menu'}>
  251.                   {this.props.items.map((item) => (<>
  252.                     {item.items && item.items.length ? (<li className='has-children'
  253.                     >
  254.                       {this.state.mobileMenu === false && (
  255.                         item.url.startsWith('http') ? <a href={item.url} key={item.url}>
  256.                             {item.title}
  257.                           </a> :
  258.                           <NavLink to={item.url === '' ? '/' : item.url} key={item.url}>
  259.                             {item.title}
  260.                           </NavLink>
  261.                       )}
  262.                       {this.state.mobileMenu === true && (
  263.                         <NavLink to={item.url === '' ? '/' : item.url}
  264.                                  onClick={(event) => {
  265.                                    event.preventDefault();
  266.                                    this.state.sectionNav !== item.title ? this.setState(prevState => ({ sectionNav: item.title })) : this.setState(prevState => ({ sectionNav: '' }));
  267.                                    this.setState(prevState => ({ secondaryNav: '' }));
  268.                                  }}>
  269.                           {item.title}
  270.                         </NavLink>
  271.                       )}
  272.                       <ul className={this.state.sectionNav !== item.title ? 'cd-hidden' : 'is-visible'}>
  273.                         {this.state.mobileMenu === true && (
  274.                           <>
  275.                             <li className='go-back'><a href='#' onClick={(event) => {
  276.                               event.preventDefault();
  277.                               this.state.sectionNav !== item.title ? this.setState(prevState => ({ sectionNav: item.title })) :
  278.                                 this.setState(prevState => ({ sectionNav: '' }));
  279.                               this.setState(prevState => ({ secondaryNav: '' }));
  280.                             }}>Section Menu</a></li>
  281.                             <li className='see-all'><NavLink activeClassName='active'
  282.                                                              to={item.url === '' ? '/' : item.url}
  283.                                                              onClick={this.closeMobileMenu}>{item.title}</NavLink>
  284.                             </li>
  285.                           </>)}
  286.                         {item.items.map((subitem) => (
  287.                           <li key={subitem.url}>
  288.                             {subitem.url.startsWith('http') ?
  289.                               <a activeClassName='active' href={subitem.url}
  290.                                  onClick={this.closeMobileMenu}>{subitem.title}</a> :
  291.                               <NavLink activeClassName='active' to={subitem.url} key={subitem.url}
  292.                                        onClick={this.closeMobileMenu}>{subitem.title}</NavLink>
  293.                             }
  294.                           </li>
  295.                         ))}
  296.                       </ul>
  297.                     </li>) : (<li>
  298.                       {item.url.startsWith('http') ?
  299.                         <a activeClassName='active' href={item.url} onClick={this.closeMobileMenu}>{item.title}</a> :
  300.                         <NavLink activeClassName='active' to={item.url} key={item.url}
  301.                                  onClick={this.closeMobileMenu}>{item.title}</NavLink>
  302.                       }
  303.                     </li>)}
  304.                   </>))}</ul>
  305.               </li>
  306.  
  307.             </ul>
  308.           </nav>
  309.         </div>
  310.         <CSSTransition
  311.           in={this.state.mobileMenu === true | this.state.primaryNav !== ''}
  312.           timeout={500}
  313.           classNames='in'
  314.           unmountOnExit>
  315.           <div className='cd-overlay is-visible'
  316.                onClick={this.closeMobileMenu} />
  317.         </CSSTransition>
  318.  
  319.  
  320.         <CSSTransition
  321.           in={this.state.primaryNav === 'search'}
  322.           timeout={500}
  323.           classNames='cd-search'
  324.           unmountOnExit>
  325.           <div id='cd-search' className='cd-search is-visible' role='search'>
  326.             <form action='https://www.google.com/cse' id='cse-search-box'>
  327.               <input name='cx' type='hidden' value='014698858644969705766:fdu3aeb0rno' />
  328.               <input name='ie' type='hidden' value='UTF-8' />
  329.               <input name='q' size='30' type='search' placeholder='Search...' aria-label='Search text' />
  330.               <input name='sa' type='submit' value='Search' className='gs' aria-label='Search' />
  331.             </form>
  332.           </div>
  333.         </CSSTransition>
  334.  
  335.       </>
  336.  
  337.     );
  338.   }
  339. }
  340.  
  341. export default compose(injectIntl, connect((state) => ({
  342.   token: state.userSession.token, items: state.navigation.items, lang: state.intl.locale,
  343. }), { getNavigation }))(Navigation);
  344.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement