exadel-inc/esl

View on GitHub
packages/esl-website/src/banner/banner.ts

Summary

Maintainability
A
0 mins
Test Coverage
import {attr, prop, listen} from '@exadel/esl/modules/esl-utils/decorators';
import {ESLIntersectionTarget} from '@exadel/esl/modules/esl-event-listener/core';
import {ESLToggleable} from '@exadel/esl/modules/esl-toggleable/core';
import type {ESLIntersectionEvent} from '@exadel/esl/modules/esl-event-listener/core';
import type {ESLToggleableActionParams} from '@exadel/esl/modules/esl-toggleable/core';
 
export class ESLDemoBanner extends ESLToggleable {
public static override is = 'esl-d-banner';
 
@attr({parser: (str) => str && encodeURIComponent(str).trim()})
public cookieName: string;
@attr({defaultValue: 14, parser: parseInt})
public cookieTime: number;
 
 
@prop(true) public override closeOnEsc: boolean;
@prop('.close-button') public override closeTrigger: string;
 
public get $alert(): HTMLElement | null {
return this.querySelector('.alert')!;
}
 
/** Check if the coolie is active */
public get hasCookie(): boolean {
const {cookieName} = this;
return !!cookieName && document.cookie.indexOf(`${cookieName}=true`) !== -1;
}
 
/** Store cookie {@link cookieName} for {@link cookieTime} period */
public registerCookie(expireDays: number = this.cookieTime): void {
const {cookieName} = this;
if (!cookieName) return;
const expires = new Date(Date.now() + expireDays * 864e5).toUTCString();
document.cookie = `${cookieName}=true; path=/; expires=${expires};`;
}
 
protected override onShow(params: ESLToggleableActionParams): void {
super.onShow(params);
this.$alert?.classList.add('in');
this.$$off(this._onIntersect);
}
 
protected override onHide(param: ESLToggleableActionParams): void {
super.onHide(param);
if (param.initiator === 'close') this.registerCookie();
}
 
@listen({
event: 'intersects',
target: ($this: ESLDemoBanner) => ESLIntersectionTarget.for($this, {threshold: 0.99}),
condition: ($this: ESLDemoBanner) => !$this.hasCookie
})
protected _onIntersect(e: ESLIntersectionEvent): void {
this.toggle(e.isIntersecting, {showDelay: 750});
}
}