import * as tabActions from '../action/tabs.action'; import { LocalState, initialState, adapter } from '../state/tabs.state'; import { assign, concat, get, includes, uniq } from 'lodash'; import { MemoizedSelector, createFeatureSelector, createSelector } from '@ngrx/store'; import { EntitySelectors } from '@ngrx/entity/src/models'; import { TabEntity } from '../models/tab-entity'; export function reducer(state: LocalState = initialState, action: tabActions.TabActions): LocalState { switch (action.type) { case tabActions.TabsActionTypes.AddTab: { return adapter.addOne({...action.payload, position: state.ids.length}, { ...state, activeTabIndex: !includes(state.ids, get(action.payload, 'tabName')) ? state.ids.length == 0 ? 0 : get(uniq(concat(state.ids, [get(action.payload, 'tabName')])), 'length') - 1 : state.activeTabIndex, }); } case tabActions.TabsActionTypes.AddMultipleTab: { return adapter.addMany( action.payload , { ...state, position: state.ids.length, activeTabIndex: state.ids.length, }); } case tabActions.TabsActionTypes.CloseTab: { return adapter.removeOne(action.payload, { ...state, activeTabIndex: 0, }); } case tabActions.TabsActionTypes.SetActiveTab: { return assign({}, state, { activeTabIndex: get(action, 'payload.position') || get(state, ['entities', action.payload.tabName, 'position']), }); } case tabActions.TabsActionTypes.ResetTab: { return adapter.removeAll(state); } default: { return state; } } } export interface TabState { tabState: LocalState; } export const reducers: any = { tabState: reducer, }; export interface State { tabState: TabState; } // tslint:disable-next-line:no-any export const getErrors: any = (state: LocalState) => state.errors; export const getSelectedId: any = ( state: LocalState ) => state.activeTabIndex; export const getTabState: MemoizedSelector = createFeatureSelector('tabs'); export const getTabsEntitiesState: MemoizedSelector = createSelector( getTabState, (state: TabState) => state.tabState, ); export const getSelectedEntityId: MemoizedSelector = createSelector( getTabsEntitiesState, getSelectedId ); export const { selectIds: getListIds, selectEntities: getListEntities, selectAll: getAllList, selectTotal: getTotalList, }: EntitySelectors = adapter.getSelectors(getTabsEntitiesState); export const getSelectedEntity: MemoizedSelector = createSelector( getAllList, getSelectedEntityId, (entities, selectedEntityId) => { return selectedEntityId && entities[selectedEntityId]; }, );