import { Component } from '@angular/core'; import { Observable } from 'rxjs/internal/Observable'; import { createSelector, MemoizedSelector, select, Store } from '@ngrx/store'; import { AdminSidebarSectionsState, AdminSidebarSectionState } from './admin-sidebar.reducer'; import { hasValue } from '../../shared/empty.util'; import { map } from 'rxjs/operators'; import { AdminSidebarSectionToggleAction } from './admin-sidebar.actions'; const sidebarSectionStateSelector = (state: AdminSidebarSectionsState) => state.adminSidebarSection; const sectionByNameSelector = (name: string): MemoizedSelector => { return keySelector(name); }; export function keySelector(key: string): MemoizedSelector { return createSelector(sidebarSectionStateSelector, (state: AdminSidebarSectionState) => { if (hasValue(state)) { return state[key]; } else { return undefined; } }); } @Component({ selector: 'ds-admin-sidebar', templateUrl: './admin-sidebar.component.html', styleUrls: ['./admin-sidebar.component.scss'], }) export class AdminSidebarComponent { constructor(private store: Store) { } public active(name: string): Observable { return this.store.pipe( select(sectionByNameSelector(name)), map((state: AdminSidebarSectionState) => hasValue(state) ? !state.sectionCollapsed : false) ); } toggle(event: Event, name: string) { event.preventDefault(); this.store.dispatch(new AdminSidebarSectionToggleAction(name)); } }