Skip to content
Snippets Groups Projects
menu.tsx 2.38 KiB
Newer Older
  • Learn to ignore specific revisions
  • import {
      Component,
      Prop,
      Listen,
      h,
      State,
      Event,
      EventEmitter,
      Element
    } from '@stencil/core';
    
    @Component({
      tag: 'hy-menu-mobile',
      styleUrl: 'menu-mobile.scss',
      shadow: true
    })
    export class MenuMobile {
      @Element() el: HTMLElement;
      @Prop() open = true;
      @Prop() menuType: string = 'desktop';
      @State() breadcrumbs: any;
      @State() newBreadcrumb;
    
      @Event() menuContainerToggled: EventEmitter;
    
      @Listen('removeBreadcrumb')
      removeBreadcrumb(data) {
        let breadcrumbs = JSON.parse(JSON.stringify(this.breadcrumbs));
        let currentBreadcrumb = breadcrumbs
          .map(function (e) {
            return e.bid;
          })
          .indexOf(data.detail.bid);
        breadcrumbs.length = currentBreadcrumb;
    
        for (let i = currentBreadcrumb, l = this.breadcrumbs.length; i < l; i++) {
          this.menuContainerToggled.emit({triggerItem: this.breadcrumbs[i].bid, triggerType: 'remove'});
        }
        this.breadcrumbs = [];
        this.breadcrumbs = breadcrumbs;
    
        // Reset if home has been clicked.
        if (currentBreadcrumb === 0) {
          this.breadcrumbs = [];
        }
      }
    
      @Listen('addBreadcrumb')
      addBreadcrumb(event) {
        this.breadcrumbs = [
          ...this.breadcrumbs,
          {
            label: event.detail.label,
            bid: event.detail.bid,
            url: event.detail.url
          }
        ];
      }
    
      componentWillLoad() {
        this.breadcrumbs = [];
      }
    
      componentWillUpdate() {
        this.el.children[0].setAttribute('menu-type', this.menuType);
      }
    
      render() {
        if (this.menuType === 'desktop') {
          return (
            <nav role={'navigation'}>
              <div
                aria-hidden={this.open ? 'false' : 'true'}
                class={{
                  'hy-menu--desktop': true,
                  'is-open': this.open
                }}
              >
                <slot />
              </div>
            </nav>
          );
        }
        else {
          return (
            <nav role={'navigation'}>
              <div class={'hy-menu-mobile-breadcrumb-container'}>
                {this.breadcrumbs.map((breadcrumb, index) => {
                  return <hy-menu-mobile-breadcrumb label={breadcrumb.label} bid={breadcrumb.bid} is-first={index === 0} />;
                })}
              </div>
              <div
                aria-hidden={this.open ? 'false' : 'true'}
                class={{
                  'hy-menu-mobile': true,
                  'is-open': this.open
                }}
              >
                <slot />
              </div>
            </nav>
          );
        }
      }
    }