-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathapp.module.ts
More file actions
108 lines (106 loc) · 3.73 KB
/
Copy pathapp.module.ts
File metadata and controls
108 lines (106 loc) · 3.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import { AnnouncementComponent } from './announcement/announcement.component';
import { AnnouncementDialogComponent } from './announcement/announcement.component';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { ArchiveProjectService } from './services/archive-project.service';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { BrowserModule } from '@angular/platform-browser';
import { ConfigService } from './services/config.service';
import { FooterComponent } from './modules/footer/footer.component';
import { FormsModule } from '@angular/forms';
import { HeaderComponent } from './modules/header/header.component';
import { HomeModule } from './home/home.module';
import { HttpErrorInterceptor } from './http-error.interceptor';
import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
import { LogOutService } from './services/logOutService';
import { MatDialogModule } from '@angular/material/dialog';
import { MatSidenavModule } from '@angular/material/sidenav';
import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MAT_SNACK_BAR_DEFAULT_OPTIONS } from '@angular/material/snack-bar';
import { MobileMenuComponent } from './modules/mobile-menu/mobile-menu.component';
import { NgModule, inject, provideAppInitializer } from '@angular/core';
import { RecaptchaV3Module, RECAPTCHA_V3_SITE_KEY, RECAPTCHA_BASE_URL } from 'ng-recaptcha-2';
import { RouterModule } from '@angular/router';
import { StudentService } from './student/student.service';
import { TeacherService } from './teacher/teacher.service';
import { TrackScrollDirective } from './track-scroll.directive';
import { UserService } from './services/user.service';
export function initialize(
configService: ConfigService,
userService: UserService
): () => Promise<any> {
return (): Promise<any> => {
return new Promise((resolve) => {
userService.retrieveUserPromise().then(() => {
return userService.getUser().subscribe(() => {
return configService.retrieveConfig().subscribe((config) => {
resolve(config);
});
});
});
});
};
}
@NgModule({
declarations: [AppComponent, AnnouncementDialogComponent, TrackScrollDirective],
bootstrap: [AppComponent],
imports: [
AnnouncementComponent,
AppRoutingModule,
BrowserAnimationsModule,
BrowserModule,
FooterComponent,
FormsModule,
HeaderComponent,
HomeModule,
MatDialogModule,
MatSidenavModule,
MatSnackBarModule,
MobileMenuComponent,
RecaptchaV3Module,
RouterModule.forRoot([], {
scrollPositionRestoration: 'enabled',
anchorScrolling: 'enabled',
bindToComponentInputs: true,
onSameUrlNavigation: 'reload'
})
],
providers: [
ArchiveProjectService,
ConfigService,
LogOutService,
StudentService,
TeacherService,
UserService,
provideAppInitializer(() => {
const initializerFn = initialize(inject(ConfigService), inject(UserService));
return initializerFn();
}),
{
provide: MAT_SNACK_BAR_DEFAULT_OPTIONS,
useValue: {
duration: 10000,
verticalPosition: 'bottom',
horizontalPosition: 'start'
}
},
{
provide: HTTP_INTERCEPTORS,
useClass: HttpErrorInterceptor,
multi: true
},
{
provide: RECAPTCHA_V3_SITE_KEY,
useFactory: (configService: ConfigService) => {
return configService.getRecaptchaPublicKey();
},
deps: [ConfigService]
},
{
provide: RECAPTCHA_BASE_URL,
useValue: 'https://recaptcha.net/recaptcha/api.js'
},
provideHttpClient(withInterceptorsFromDi())
]
})
export class AppModule {}