e40b66c5f1286e47ff807b8aa6cf3a05ebf0d7a7
[oweals/peertube.git] / client / src / app / app.module.ts
1 import { ApplicationRef, NgModule } from '@angular/core';
2 import { BrowserModule } from '@angular/platform-browser';
3 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
4 import { HttpModule, RequestOptions, XHRBackend } from '@angular/http';
5 import { RouterModule } from '@angular/router';
6 import { removeNgStyles, createNewHosts } from '@angularclass/hmr';
7
8 import { BytesPipe } from 'angular-pipes/src/math/bytes.pipe';
9
10 import { DropdownModule } from 'ng2-bootstrap/components/dropdown';
11 import { ProgressbarModule } from 'ng2-bootstrap/components/progressbar';
12 import { PaginationModule } from 'ng2-bootstrap/components/pagination';
13 import { ModalModule } from 'ng2-bootstrap/components/modal';
14
15 import { FileUploadModule } from 'ng2-file-upload/ng2-file-upload';
16
17 import { MetaConfig, MetaModule } from 'ng2-meta';
18
19 /*
20  * Platform and Environment providers/directives/pipes
21  */
22 import { ENV_PROVIDERS } from './environment';
23 import { routes } from './app.routes';
24 // App is our top level component
25 import { AppComponent } from './app.component';
26 import { AppState } from './app.service';
27
28 import {
29   AdminComponent,
30   FriendsComponent,
31   FriendAddComponent,
32   FriendListComponent,
33   FriendService,
34   MenuAdminComponent,
35   RequestsComponent,
36   RequestStatsComponent,
37   RequestService,
38   UsersComponent,
39   UserAddComponent,
40   UserListComponent,
41   UserService
42 } from './admin';
43 import { AccountComponent, AccountService } from './account';
44 import { LoginComponent } from './login';
45 import { MenuComponent } from './menu.component';
46 import { AuthService, AuthHttp, RestExtractor, RestService, SearchComponent, SearchService } from './shared';
47 import {
48   LoaderComponent,
49   VideosComponent,
50   VideoAddComponent,
51   VideoListComponent,
52   VideoMiniatureComponent,
53   VideoSortComponent,
54   VideoWatchComponent,
55   VideoService,
56   WebTorrentService
57 } from './videos';
58
59 const metaConfig: MetaConfig = {
60   //Append a title suffix such as a site name to all titles
61   //Defaults to false
62   useTitleSuffix: true,
63   defaults: {
64     title: 'PeerTube'
65   }
66 };
67
68 // Application wide providers
69 const APP_PROVIDERS = [
70   AppState,
71
72   {
73     provide: AuthHttp,
74     useFactory: (backend: XHRBackend, defaultOptions: RequestOptions, authService: AuthService) => {
75       return new AuthHttp(backend, defaultOptions, authService);
76     },
77     deps: [ XHRBackend, RequestOptions, AuthService ]
78   },
79
80   AuthService,
81   RestExtractor,
82   RestService,
83
84   VideoService,
85   SearchService,
86   FriendService,
87   RequestService,
88   UserService,
89   AccountService,
90   WebTorrentService
91 ];
92 /**
93  * `AppModule` is the main entry point into Angular2's bootstraping process
94  */
95 @NgModule({
96   bootstrap: [ AppComponent ],
97   declarations: [
98     AccountComponent,
99     AdminComponent,
100     AppComponent,
101     BytesPipe,
102     FriendAddComponent,
103     FriendListComponent,
104     FriendsComponent,
105     LoaderComponent,
106     LoginComponent,
107     MenuAdminComponent,
108     MenuComponent,
109     RequestsComponent,
110     RequestStatsComponent,
111     SearchComponent,
112     UserAddComponent,
113     UserListComponent,
114     UsersComponent,
115     VideoAddComponent,
116     VideoListComponent,
117     VideoMiniatureComponent,
118     VideosComponent,
119     VideoSortComponent,
120     VideoWatchComponent,
121   ],
122   imports: [ // import Angular's modules
123     BrowserModule,
124     FormsModule,
125     ReactiveFormsModule,
126     HttpModule,
127     RouterModule.forRoot(routes),
128
129     DropdownModule,
130     ProgressbarModule,
131     PaginationModule,
132     ModalModule,
133
134     FileUploadModule,
135
136     MetaModule.forRoot(metaConfig)
137   ],
138   providers: [ // expose our Services and Providers into Angular's dependency injection
139     ENV_PROVIDERS,
140     APP_PROVIDERS
141   ]
142 })
143 export class AppModule {
144   constructor(public appRef: ApplicationRef, public appState: AppState) {}
145   hmrOnInit(store) {
146     if (!store || !store.state) return;
147     console.log('HMR store', store);
148     this.appState._state = store.state;
149     this.appRef.tick();
150     delete store.state;
151   }
152   hmrOnDestroy(store) {
153     const cmpLocation = this.appRef.components.map(cmp => cmp.location.nativeElement);
154     // recreate elements
155     const state = this.appState._state;
156     store.state = state;
157     store.disposeOldHosts = createNewHosts(cmpLocation);
158     // remove styles
159     removeNgStyles();
160   }
161   hmrAfterDestroy(store) {
162     // display new elements
163     store.disposeOldHosts();
164     delete store.disposeOldHosts;
165   }
166 }