Files
prestashop/admin_o2w/themes/new-theme/js/components/navbar-transition-handler.ts
2026-04-09 18:31:51 +02:00

76 lines
2.2 KiB
TypeScript

/**
* For the full copyright and license information, please view the
* docs/licenses/LICENSE.txt file that was distributed with this source code.
*/
/**
* Toggle a class on $mainMenu after the end of an event (transition, animation...)
* @param {jQuery element} $navBar - The navbar item which get a css transition property.
* @param {jQuery element} $mainMenu - The menu inside the $navBar element.
* @param {string} endTransitionEvent - The name of the event.
* @param {jQuery element} $body - The body of the page.
* @method showNavBarContent - Toggle the class based on event and if body got a class.
* @method toggle - Add the listener if there is no transition launched yet.
* @return {Object} The object with methods wich permit to toggle on specific event.
*/
export const MAX_MOBILE_WIDTH = 1023;
const windowWidth = <number>$(window).width();
interface NavbarTransitionType {
$body: JQuery;
transitionFired: boolean;
$navBar: HTMLElement;
$mainMenu: JQuery;
endTransitionEvent: string;
showNavBarContent: (event: Event) => void;
toggle: () => void;
}
export function NavbarTransitionHandler(
this: NavbarTransitionType,
$navBar: JQuery,
$mainMenu: JQuery,
endTransitionEvent: string,
$body: JQuery,
): void {
this.$body = $body;
this.transitionFired = false;
this.$navBar = $navBar.get(0)!;
this.$mainMenu = $mainMenu;
this.endTransitionEvent = endTransitionEvent;
this.showNavBarContent = (event) => {
// @ts-ignore-next-line
if (event.propertyName !== 'width') {
return;
}
this.$navBar.removeEventListener(
this.endTransitionEvent,
this.showNavBarContent,
);
const isSidebarClosed = this.$body.hasClass('page-sidebar-closed');
if (windowWidth > MAX_MOBILE_WIDTH) {
this.$mainMenu.toggleClass('sidebar-closed', isSidebarClosed);
}
this.transitionFired = false;
};
this.toggle = () => {
if (!this.transitionFired) {
this.$navBar.addEventListener(
this.endTransitionEvent,
this.showNavBarContent.bind(this),
);
} else {
this.$navBar.removeEventListener(
this.endTransitionEvent,
this.showNavBarContent,
);
}
this.transitionFired = !this.transitionFired;
};
}