Skip to content
Snippets Groups Projects
menu-language.tsx 4.63 KiB
Newer Older
  • Learn to ignore specific revisions
  • import {ComponentLabels} from '../../site-header/site-header';
    
    
    export interface MenuLanguage {
      langCode: string;
      url: string;
      abbr: string;
      label: string;
      isActive?: boolean;
    
      isDisabled?: boolean;
    
    import {Component, h, Prop, Host, Watch, Element, Listen, State, Event, EventEmitter} from '@stencil/core';
    
    
    @Component({
      tag: 'hy-menu-language',
      styleUrl: 'menu-language.scss',
    
    })
    export class MenuLanguage {
      @Element() el: HTMLElement;
      @Prop() dataMenuLanguage: MenuLanguage[] | string;
      @Prop() isMobile: boolean = false;
    
      @Prop() labels?: ComponentLabels[] | string;
      @State() isMenuOpen: boolean = false;
    
    
      @Event() menuLanguageToggled: EventEmitter;
    
    
      private _dataMenuLanguage: MenuLanguage[];
    
      private _labels: ComponentLabels[];
    
      @Watch('dataMenuLanguage') dataMenuLanguageWatcher(data: MenuLanguage[] | string) {
        this._dataMenuLanguage = typeof data === 'string' ? JSON.parse(data) : data;
      }
    
      @Watch('labels') labelsWatcher(data: ComponentLabels[] | string) {
        this._labels = typeof data === 'string' ? JSON.parse(data) : data;
    
      // Close the language menu if user clicks anywhere outside the Menu language component.
    
    druid's avatar
    druid committed
      @Listen('click', {target: 'window'})
      handleOutsideMenuClick(event) {
        this.isMenuOpen = false;
        event.stopPropagation();
      }
    
    
      // CLose the language menu if user opens the desktop menu panel.
      @Listen('menuDesktopToggled', {target: 'document'})
      desktopMenuToggled() {
        this.isMenuOpen = false;
    
    druid's avatar
    druid committed
      }
    
      // CLose the language menu if user opens the search panel
      @Listen('searchPanelToggled', {target: 'document'})
      searchPanelToggled() {
        this.isMenuOpen = false;
    
      }
    
      @Listen('focus')
      handleComponentFocus(event) {
        // Close desktop menu panel if it's open.
        this.menuLanguageToggled.emit();
    
        event.stopPropagation();
      }
    
    
        this.isMenuOpen = !this.isMenuOpen;
        const languageMenuSelector = event.target as HTMLElement;
    
        if (this.isMenuOpen) {
    
          // Close desktop menu panel if it's open.
          this.menuLanguageToggled.emit();
    
    
          let hyHeader = this.el.closest('.hy-site-header') as HTMLElement;
    
    druid's avatar
    druid committed
          let rectHeader = hyHeader.getBoundingClientRect();
          let rectLangMenu = languageMenuSelector.getBoundingClientRect();
    
          const headerHeight = `${languageMenuSelector.offsetHeight + rectHeader.bottom + 8 - rectLangMenu.bottom}px`;
    
          const languagePanel = languageMenuSelector.shadowRoot.querySelectorAll(
            `.menu--language__dropdown`
          )[0] as HTMLElement;
          languagePanel.style.top = headerHeight;
        }
    
        this.dataMenuLanguageWatcher(this.dataMenuLanguage);
        this.labelsWatcher(this.labels);
    
      }
    
      render() {
        const black = 'var(--brand-main-nearly-black)';
    
        return this.isMobile ? (
          <Host class={'menu--language'}>
            {this._dataMenuLanguage.map((item) => {
              return (
                <hy-menu-language-item
                  lang-code={item.langCode}
                  url={item.url}
                  label={item.label}
                  abbr={item.abbr}
                  is-active={item.isActive}
    
                  is-disabled={item.isDisabled}
    
          <Host
            class={{
              'menu--language': true,
              'menu--language__is-open': this.isMenuOpen,
            }}
          >
    
            <button
              class={{
                'menu--language__toggle': true,
    
              aria-label={this.isMenuOpen ? this._labels['close'] : this._labels['open']}
    
              <hy-icon class={'menu--language__globe-icon'} icon={'hy-icon-globe'} size={14} fill={black} />
    
              <span>
                {this._dataMenuLanguage.map((item) => {
                  if (item.isActive) {
                    return item.langCode;
                  }
                })}
              </span>
              <hy-icon class={'menu--language__toggle__caret'} icon={'hy-icon-caret-down'} size={8} fill={black} />
            </button>
            <div
              class={{
                'menu--language__dropdown': true,
    
              }}
            >
              {this._dataMenuLanguage.map((item) => {
                return (
                  <hy-menu-language-item
                    lang-code={item.langCode}
                    url={item.url}
                    label={item.label}
                    abbr={item.abbr}
                    is-active={item.isActive}
    
                    is-disabled={item.isDisabled}