Newer
Older
Markus Kalijärvi
committed
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, Event, EventEmitter} from '@stencil/core';
@Component({
tag: 'hy-menu-language',
styleUrl: 'menu-language.scss',
shadow: true,
})
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.
@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;
}
@Listen('focus')
handleComponentFocus(event) {
// Close desktop menu panel if it's open.
this.menuLanguageToggled.emit();
event.stopPropagation();
}
Ekaterina Kondareva
committed
@Listen('click')
handleComponentClick(event) {
this.isMenuOpen = !this.isMenuOpen;
const languageMenuSelector = event.target as HTMLElement;
// Close desktop menu panel if it's open.
this.menuLanguageToggled.emit();
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;
}
Ekaterina Kondareva
committed
event.stopPropagation();
}
componentWillRender() {
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,
'is-open': this.isMenuOpen,
}}
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,
'is-open': this.isMenuOpen,
}}
>
{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}