Skip to content

Commit c85d200

Browse files
authored
chore(build): Fix build script and Analytics services
1 parent 13f945e commit c85d200

File tree

4 files changed

+57
-25
lines changed

4 files changed

+57
-25
lines changed

src/analytics/analytics.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Inject, Injectable, InjectionToken, NgZone, Optional, PLATFORM_ID } from '@angular/core';
2-
import { EMPTY, of } from 'rxjs';
2+
import { EMPTY, Observable, of } from 'rxjs';
33
import { isPlatformBrowser } from '@angular/common';
44
import { map, shareReplay, switchMap, observeOn } from 'rxjs/operators';
55
import {
@@ -9,7 +9,7 @@ import {
99
ɵapplyMixins,
1010
FirebaseApp
1111
} from '@angular/fire';
12-
import { Analytics, setAnalyticsCollectionEnabled } from 'firebase/analytics';
12+
import { getAnalytics, Analytics, setAnalyticsCollectionEnabled } from 'firebase/analytics';
1313
import { proxyPolyfillCompat } from './base';
1414
import { ɵfetchInstance } from '@angular/fire';
1515

@@ -41,6 +41,7 @@ export class AngularFireAnalytics {
4141

4242
private measurementId: string;
4343
private analyticsInitialized: Promise<void> = new Promise(() => {});
44+
analytics$: Observable<Analytics>;
4445

4546
async updateConfig(config: Config) {
4647
await this.analyticsInitialized;
@@ -142,16 +143,16 @@ export class AngularFireAnalytics {
142143

143144
}
144145

145-
const analytics = of(undefined).pipe(
146+
this.analytics$ = of(undefined).pipe(
146147
observeOn(new ɵAngularFireSchedulers(zone).outsideAngular),
147-
switchMap(() => isPlatformBrowser(platformId) ? zone.runOutsideAngular(() => import('firebase/analytics')) : EMPTY),
148+
// switchMap(() => isPlatformBrowser(platformId) ? zone.runOutsideAngular(() => import('firebase/analytics')) : EMPTY),
148149
// SEMVER can switch to isSupported() when we only target v8
149150
// switchMap(() => isSupported().then(it => it, () => false)),
150151
// TODO server-side investigate use of the Universal Analytics API
151152
// switchMap(supported => supported ? of(undefined) : EMPTY),
152153
map(() => {
153154
return ɵfetchInstance(`analytics`, 'AngularFireAnalytics', app, () => {
154-
const analytics = app.analytics();
155+
const analytics = getAnalytics(app);
155156
if (analyticsCollectionEnabled === false) {
156157
setAnalyticsCollectionEnabled(analytics, false);
157158
}
@@ -161,9 +162,8 @@ export class AngularFireAnalytics {
161162
shareReplay({ bufferSize: 1, refCount: false })
162163
);
163164

164-
// TODO(davideast, jamesdaniels): Hardcore zone patch or just patch here?
165-
return ɵlazySDKProxy(this, analytics, zone);
166-
165+
// TODO(team): Hardcore zone patch or just patch here?
166+
return ɵlazySDKProxy(this, this.analytics$, zone);
167167
}
168168

169169
}

src/analytics/screen-tracking.service.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { AngularFireAnalytics } from './analytics';
1414
import { Title } from '@angular/platform-browser';
1515
import { isPlatformBrowser } from '@angular/common';
1616
import { UserTrackingService } from './user-tracking.service';
17+
import { logEvent } from 'firebase/analytics';
1718

1819
const FIREBASE_EVENT_ORIGIN_KEY = 'firebase_event_origin';
1920
const FIREBASE_PREVIOUS_SCREEN_CLASS_KEY = 'firebase_previous_class';
@@ -143,11 +144,19 @@ export class ScreenTrackingService implements OnDestroy {
143144
...current
144145
} : current
145146
),
146-
switchMap(async params => {
147+
mergeMap(([prior, current]) => {
148+
return analytics.analytics$.pipe(
149+
map(analytics => {
150+
return { prior, current, analytics };
151+
})
152+
);
153+
}),
154+
switchMap(async ({ prior, current, analytics }) => {
147155
if (userTrackingService) {
148156
await userTrackingService.initialized;
149157
}
150-
return await analytics.logEvent(SCREEN_VIEW_EVENT, params);
158+
// TODO(team): Why do we need to cast a string to a string here?
159+
return await logEvent(analytics, SCREEN_VIEW_EVENT as string, { prior, current });
151160
})
152161
))
153162
).subscribe();

src/analytics/user-tracking.service.ts

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import { Inject, Injectable, NgZone, OnDestroy, PLATFORM_ID } from '@angular/cor
33
import { AngularFireAnalytics } from './analytics';
44
import { AngularFireAuth } from '@angular/fire/auth';
55
import { Subscription } from 'rxjs';
6+
import { switchMap, map } from 'rxjs/operators';
7+
import { setUserId, logEvent } from 'firebase/analytics';
8+
import { getAdditionalUserInfo } from 'firebase/auth';
69

710
@Injectable()
811
export class UserTrackingService implements OnDestroy {
@@ -22,20 +25,35 @@ export class UserTrackingService implements OnDestroy {
2225
if (!isPlatformServer(platformId)) {
2326
let resolveInitialized;
2427
this.initialized = zone.runOutsideAngular(() => new Promise(resolve => resolveInitialized = resolve));
28+
2529
this.disposables = [
26-
auth.authState.subscribe(user => {
27-
analytics.setUserId(user?.uid);
30+
analytics.analytics$.pipe(
31+
switchMap(analytics => {
32+
return auth.authState.pipe(
33+
map(user => ({ user, analytics }))
34+
);
35+
})
36+
).subscribe(({ user, analytics }) => {
37+
setUserId(analytics, user?.uid);
2838
resolveInitialized();
2939
}),
30-
auth.credential.subscribe(credential => {
40+
41+
analytics.analytics$.pipe(
42+
switchMap(analytics => {
43+
return auth.credential.pipe(
44+
map(credential => ({ credential, analytics }))
45+
);
46+
})
47+
).subscribe(({ credential, analytics }) => {
3148
if (credential) {
32-
const method = credential.user.isAnonymous ? 'anonymous' : credential.additionalUserInfo.providerId;
33-
if (credential.additionalUserInfo.isNewUser) {
34-
analytics.logEvent('sign_up', { method });
49+
const additionalUserInfo = getAdditionalUserInfo(credential);
50+
const method = credential.user.isAnonymous ? 'anonymous' : additionalUserInfo.providerId;
51+
if (additionalUserInfo.isNewUser) {
52+
logEvent(analytics, 'sign_up', { method });
3553
}
36-
analytics.logEvent('login', { method });
54+
logEvent(analytics, 'login', { method });
3755
}
38-
})
56+
}),
3957
];
4058
} else {
4159
this.initialized = Promise.resolve();

tools/build.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@ import { prettySize } from 'pretty-size';
44
import { sync as gzipSync } from 'gzip-size';
55
import { dirname, join } from 'path';
66
import { keys as tsKeys } from 'ts-transformer-keys';
7-
import firebase from 'firebase/app';
7+
import { Analytics } from 'firebase/analytics';
8+
import { Auth } from 'firebase/auth';
9+
import { FirebaseMessaging } from 'firebase/messaging';
10+
import { FirebasePerformance } from 'firebase/performance';
11+
import { Functions } from 'firebase/functions';
12+
import { RemoteConfig } from 'firebase/remote-config';
813

914
// TODO infer these from the package.json
1015
const MODULES = [
@@ -18,12 +23,12 @@ const ENTRY_NAMES = MODULES.map(m => m === 'core' ? '@angular/fire' : `@angular/
1823

1924
function proxyPolyfillCompat() {
2025
const defaultObject = {
21-
analytics: tsKeys<firebase.analytics.Analytics>(),
22-
auth: tsKeys<firebase.auth.Auth>(),
23-
functions: tsKeys<firebase.functions.Functions>(),
24-
messaging: tsKeys<firebase.messaging.Messaging>(),
25-
performance: tsKeys<firebase.performance.Performance>(),
26-
'remote-config': tsKeys<firebase.remoteConfig.RemoteConfig>(),
26+
analytics: tsKeys<Analytics>(),
27+
auth: tsKeys<Auth>(),
28+
functions: tsKeys<Functions>(),
29+
messaging: tsKeys<FirebaseMessaging>(),
30+
performance: tsKeys<FirebasePerformance>(),
31+
'remote-config': tsKeys<RemoteConfig>(),
2732
};
2833

2934
return Promise.all(Object.keys(defaultObject).map(module =>

0 commit comments

Comments
 (0)