Skip to content
Snippets Groups Projects
menu-language.tsx 3.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;
    }
    
    import {Component, h, Prop, Host, Watch, Element, Listen, State} 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;
    
      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;
    
        this.isMenuOpen = !this.isMenuOpen;
        const languageMenuSelector = event.target as HTMLElement;
    
        if (this.isMenuOpen) {
          let hyHeader = this.el.closest('.hy-site-header') as HTMLElement;
          const headerHeight = `${
            languageMenuSelector.offsetHeight +
            hyHeader.offsetTop +
            hyHeader.offsetHeight +
            8 -
            languageMenuSelector.offsetTop -
            languageMenuSelector.offsetHeight
          }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-mobile={this.isMobile}
                />
              );
            })}
          </Host>
        ) : (
    
          <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-mobile={this.isMobile}
                  />
                );
              })}
            </div>
          </Host>
        );
      }
    }