Repository navigation
Expand file tree
/
Copy pathanalytics.module.ts
More file actions
78 lines (71 loc) · 2.63 KB
/
Copy pathanalytics.module.ts
File metadata and controls
78 lines (71 loc) · 2.63 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
import { NgModule, Optional, NgZone, InjectionToken, ModuleWithProviders, APP_INITIALIZER, Injector } from '@angular/core';
import { Analytics as FirebaseAnalytics } from 'firebase/analytics';
import { ɵgetDefaultInstanceOf, ɵAngularFireSchedulers, VERSION, ɵisAnalyticsSupportedFactory } from '@angular/fire';
import { Analytics, ANALYTICS_PROVIDER_NAME, AnalyticsInstances } from './analytics';
import { FirebaseApps, FirebaseApp } from '@angular/fire/app';
import { registerVersion } from 'firebase/app';
import { ScreenTrackingService } from './screen-tracking.service';
import { UserTrackingService } from './user-tracking.service';
export const PROVIDED_ANALYTICS_INSTANCES = new InjectionToken<Analytics[]>('angularfire2.analytics-instances');
export function defaultAnalyticsInstanceFactory(provided: FirebaseAnalytics[]|undefined, defaultApp: FirebaseApp) {
if (!ɵisAnalyticsSupportedFactory.sync()) { return null; }
const defaultAnalytics = ɵgetDefaultInstanceOf<FirebaseAnalytics>(ANALYTICS_PROVIDER_NAME, provided, defaultApp);
return defaultAnalytics && new Analytics(defaultAnalytics);
}
export function analyticsInstanceFactory(fn: (injector: Injector) => FirebaseAnalytics) {
return (zone: NgZone, injector: Injector) => {
if (!ɵisAnalyticsSupportedFactory.sync()) { return null; }
const analytics = zone.runOutsideAngular(() => fn(injector));
return new Analytics(analytics);
};
}
const ANALYTICS_INSTANCES_PROVIDER = {
provide: AnalyticsInstances,
deps: [
[new Optional(), PROVIDED_ANALYTICS_INSTANCES ],
]
};
const DEFAULT_ANALYTICS_INSTANCE_PROVIDER = {
provide: Analytics,
useFactory: defaultAnalyticsInstanceFactory,
deps: [
[new Optional(), PROVIDED_ANALYTICS_INSTANCES ],
FirebaseApp,
]
};
@NgModule({
providers: [
DEFAULT_ANALYTICS_INSTANCE_PROVIDER,
ANALYTICS_INSTANCES_PROVIDER,
{
provide: APP_INITIALIZER,
useValue: ɵisAnalyticsSupportedFactory.async,
multi: true,
}
]
})
export class AnalyticsModule {
constructor(
@Optional() _screenTrackingService: ScreenTrackingService,
@Optional() _userTrackingService: UserTrackingService,
) {
registerVersion('angularfire', VERSION.full, 'analytics');
}
}
export function provideAnalytics(fn: (injector: Injector) => FirebaseAnalytics, ...deps: any[]): ModuleWithProviders<AnalyticsModule> {
return {
ngModule: AnalyticsModule,
providers: [{
provide: PROVIDED_ANALYTICS_INSTANCES,
useFactory: analyticsInstanceFactory(fn),
multi: true,
deps: [
NgZone,
Injector,
ɵAngularFireSchedulers,
FirebaseApps,
...deps,
]
}]
};
}