Files
dspace-angular/src/app/navbar/navbar.effects.ts
2018-12-13 16:17:21 +01:00

63 lines
1.9 KiB
TypeScript

import { first, map, switchMap } from 'rxjs/operators';
import { Injectable } from '@angular/core';
import { Actions, Effect, ofType } from '@ngrx/effects'
import * as fromRouter from '@ngrx/router-store';
import { HostWindowActionTypes } from '../shared/host-window.actions';
import {
CollapseMenuAction,
ExpandMenuPreviewAction,
MenuActionTypes
} from '../shared/menu/menu.actions';
import { MenuID } from '../shared/menu/initial-menus-state';
import { MenuService } from '../shared/menu/menu.service';
import { MenuState } from '../shared/menu/menu.reducer';
@Injectable()
export class NavbarEffects {
menuID = MenuID.PUBLIC;
/**
* Effect that collapses the public menu on window resize
* @type {Observable<CollapseMenuAction>}
*/
@Effect() resize$ = this.actions$
.pipe(
ofType(HostWindowActionTypes.RESIZE),
map(() => new CollapseMenuAction(this.menuID))
);
/**
* Effect that collapses the public menu on reroute
* @type {Observable<CollapseMenuAction>}
*/
@Effect() routeChange$ = this.actions$
.pipe(
ofType(fromRouter.ROUTER_NAVIGATION),
map(() => new CollapseMenuAction(this.menuID))
);
/**
* Effect that collapses the public menu when the admin sidebar opens
* @type {Observable<CollapseMenuAction>}
*/
@Effect() openAdminSidebar$ = 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 { type: 'NO_ACTION' };
}));
})
);
constructor(private actions$: Actions, private menuService: MenuService) {
}
}