import { Injectable } from '@angular/core'; import { Actions, createEffect, ofType, } from '@ngrx/effects'; import { ROUTER_NAVIGATION } from '@ngrx/router-store'; import { first, map, switchMap, } from 'rxjs/operators'; import { HostWindowActionTypes } from '../shared/host-window.actions'; import { CollapseMenuAction, ExpandMenuPreviewAction, MenuActionTypes, } from '../shared/menu/menu.actions'; import { MenuService } from '../shared/menu/menu.service'; import { MenuID } from '../shared/menu/menu-id.model'; import { MenuState } from '../shared/menu/menu-state.model'; import { NoOpAction } from '../shared/ngrx/no-op.action'; @Injectable() export class NavbarEffects { menuID = MenuID.PUBLIC; /** * Effect that collapses the public menu on window resize * @type {Observable<CollapseMenuAction>} */ resize$ = createEffect(() => this.actions$ .pipe( ofType(HostWindowActionTypes.RESIZE), map(() => new CollapseMenuAction(this.menuID)), )); /** * Effect that collapses the public menu on reroute * @type {Observable<CollapseMenuAction>} */ routeChange$ = createEffect(() => this.actions$ .pipe( ofType(ROUTER_NAVIGATION), map(() => new CollapseMenuAction(this.menuID)), )); /** * Effect that collapses the public menu when the admin sidebar opens * @type {Observable<CollapseMenuAction>} */ openAdminSidebar$ = createEffect(() => this.actions$ .pipe( ofType(MenuActionTypes.EXPAND_MENU_PREVIEW), switchMap((action: ExpandMenuPreviewAction) => { return this.menuService.getMenu(action.menuID).pipe( first(), map((menu: MenuState) => { if (menu.id === MenuID.ADMIN) { if (!menu.previewCollapsed && menu.collapsed) { return new CollapseMenuAction(MenuID.PUBLIC); } } return new NoOpAction(); })); }), )); constructor(private actions$: Actions, private menuService: MenuService) { } }