import { NgModule } from '@angular/core'; import { Http } from '@angular/http'; import { FormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; import { UniversalModule, isBrowser, isNode } from 'angular2-universal/node'; // for AoT we need to manually split universal packages import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { TranslateLoader, TranslateModule, TranslateStaticLoader } from 'ng2-translate'; import { AppModule, AppComponent } from './app/app.module'; import { SharedModule } from './app/shared/shared.module'; import { CoreModule } from "./app/core/core.module"; import { StoreModule, Store } from "@ngrx/store"; import { RouterStoreModule } from "@ngrx/router-store"; import { StoreDevtoolsModule } from "@ngrx/store-devtools"; import { rootReducer, AppState, NGRX_CACHE_KEY } from './app/app.reducers'; import { effects } from './app/app.effects'; // Will be merged into @angular/platform-browser in a later release // see https://github.com/angular/angular/pull/12322 import { Meta } from './angular2-meta'; export function createTranslateLoader(http: Http) { return new TranslateStaticLoader(http, './assets/i18n', '.json'); } export function getLRU() { return new Map(); } export function getRequest() { return Zone.current.get('req') || {}; } export function getResponse() { return Zone.current.get('res') || {}; } export const UNIVERSAL_KEY = 'UNIVERSAL_CACHE'; @NgModule({ bootstrap: [AppComponent], imports: [ TranslateModule.forRoot({ provide: TranslateLoader, useFactory: (createTranslateLoader), deps: [Http] }), NgbModule.forRoot(), UniversalModule, // BrowserModule, HttpModule, and JsonpModule are included FormsModule, RouterModule.forRoot([], { useHash: false }), CoreModule.forRoot(), SharedModule, AppModule, StoreModule.provideStore(rootReducer), RouterStoreModule.connectRouter(), StoreDevtoolsModule.instrumentOnlyWithExtension(), effects ], providers: [ { provide: 'isBrowser', useValue: isBrowser }, { provide: 'isNode', useValue: isNode }, { provide: 'req', useFactory: getRequest }, { provide: 'res', useFactory: getResponse }, { provide: 'LRU', useFactory: getLRU, deps: [] }, Meta, ] }) export class MainModule { constructor(public store: Store) { } /** * We need to use the arrow function here to bind the context as this is a gotcha * in Universal for now until it's fixed */ universalDoDehydrate = (universalCache) => { this.store.take(1).subscribe(state => { universalCache[NGRX_CACHE_KEY] = state; }); }; /** * Clear the cache after it's rendered */ universalAfterDehydrate = () => { // comment out if LRU provided at platform level to be shared between each user // this.cache.clear(); //TODO is this necessary in dspace's case? } }