Skip to content

Commit f5f67ad

Browse files
committed
Cleaning things up
1 parent 1cf961b commit f5f67ad

File tree

4 files changed

+44
-30
lines changed

4 files changed

+44
-30
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@angular/fire",
3-
"version": "5.2.1",
3+
"version": "5.3.0",
44
"description": "The official library of Firebase and Angular.",
55
"private": true,
66
"scripts": {

src/analytics/analytics.ts

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
import { Injectable, Inject, Optional, NgZone, InjectionToken } from '@angular/core';
2-
import { Observable, from, of } from 'rxjs';
3-
import { map, switchMap, tap, filter } from 'rxjs/operators';
2+
import { Observable, from } from 'rxjs';
3+
import { map, tap, filter, withLatestFrom } from 'rxjs/operators';
44
import { FirebaseAppConfig, FirebaseOptions, runOutsideAngular } from '@angular/fire';
5-
import { Router, NavigationEnd } from '@angular/router';
5+
import { Router, NavigationEnd, ActivationEnd } from '@angular/router';
66
import { FirebaseAnalytics, FIREBASE_OPTIONS, FIREBASE_APP_NAME, _firebaseAppFactory } from '@angular/fire';
77

88
export const AUTOMATICALLY_SET_CURRENT_SCREEN = new InjectionToken<boolean>('angularfire2.analytics.setCurrentScreen');
99
export const ANALYTICS_COLLECTION_ENABLED = new InjectionToken<boolean>('angularfire2.analytics.analyticsCollectionEnabled');
1010
export const AUTOMATICALLY_TRACK_USER_IDENTIFIER = new InjectionToken<boolean>('angularfire2.analytics.trackUserIdentifier');
11+
export const APP_VERSION = new InjectionToken<string>('angularfire2.analytics.appVersion');
12+
export const APP_NAME = new InjectionToken<string>('angularfire2.analytics.appName');
13+
14+
export const DEFAULT_APP_VERSION = '?';
15+
export const DEFAULT_APP_NAME = 'Angular App';
1116

1217
@Injectable()
1318
export class AngularFireAnalytics {
@@ -24,45 +29,46 @@ export class AngularFireAnalytics {
2429
@Optional() @Inject(AUTOMATICALLY_SET_CURRENT_SCREEN) automaticallySetCurrentScreen:boolean|null,
2530
@Optional() @Inject(ANALYTICS_COLLECTION_ENABLED) analyticsCollectionEnabled:boolean|null,
2631
@Optional() @Inject(AUTOMATICALLY_TRACK_USER_IDENTIFIER) automaticallyTrackUserIdentifier:boolean|null,
27-
private zone: NgZone
32+
@Optional() @Inject(APP_VERSION) providedAppVersion:string|null,
33+
@Optional() @Inject(APP_NAME) providedAppName:string|null,
34+
zone: NgZone
2835
) {
2936
// @ts-ignore zapping in the UMD in the build script
3037
const requireAnalytics = from(import('firebase/analytics'));
38+
const app = _firebaseAppFactory(options, nameOrConfig);
3139

3240
this.analytics = requireAnalytics.pipe(
33-
map(() => _firebaseAppFactory(options, nameOrConfig)),
34-
map(app => app.analytics()),
41+
map(() => app.analytics()),
3542
tap(analytics => {
36-
if (analyticsCollectionEnabled == false) { analytics.setAnalyticsCollectionEnabled(false) }
43+
if (analyticsCollectionEnabled === false) { analytics.setAnalyticsCollectionEnabled(false) }
3744
}),
3845
runOutsideAngular(zone)
3946
);
4047

4148
if (router && automaticallySetCurrentScreen !== false) {
42-
this.analytics.pipe(
43-
switchMap(analytics =>
44-
router.events.pipe(
45-
filter<NavigationEnd>(e => e instanceof NavigationEnd),
46-
tap(e => console.log(e)),
47-
tap(e => analytics.setCurrentScreen(e.url))
48-
)
49-
)
49+
const app_name = providedAppName || DEFAULT_APP_NAME;
50+
const app_version = providedAppVersion || DEFAULT_APP_VERSION;
51+
const activationEndEvents = router.events.pipe(filter<ActivationEnd>(e => e instanceof ActivationEnd));
52+
const navigationEndEvents = router.events.pipe(filter<NavigationEnd>(e => e instanceof NavigationEnd));
53+
navigationEndEvents.pipe(
54+
withLatestFrom(activationEndEvents, this.analytics),
55+
tap(([navigationEnd, activationEnd, analytics]) => {
56+
const url = navigationEnd.url;
57+
const screen_name = activationEnd.snapshot.routeConfig && activationEnd.snapshot.routeConfig.path || undefined;
58+
const outlet = activationEnd.snapshot.outlet;
59+
analytics.logEvent("screen_view", { app_name, app_version, screen_name, outlet, url });
60+
// TODO when is screen_name undefined?
61+
analytics.setCurrentScreen(screen_name || url, { global: outlet == "primary" })
62+
}),
63+
runOutsideAngular(zone)
5064
).subscribe();
5165
}
5266

53-
if (automaticallyTrackUserIdentifier !== false) {
54-
this.analytics.pipe(
55-
switchMap(analytics => {
56-
if (analytics.app.auth) {
57-
const auth = analytics.app.auth();
58-
return new Observable<firebase.User|null>(auth.onAuthStateChanged.bind(auth)).pipe(
59-
tap(user => console.log("uid", user && user.uid)),
60-
tap(user => user ? analytics.setUserId(user.uid) : analytics.setUserId(null!))
61-
)
62-
} else {
63-
return of()
64-
}
65-
}),
67+
// TODO do something other than just check auth presence, what if it's lazy loaded?
68+
if (app.auth && automaticallyTrackUserIdentifier !== false) {
69+
new Observable<firebase.User|null>(app.auth().onAuthStateChanged.bind(app.auth())).pipe(
70+
withLatestFrom(this.analytics),
71+
tap(([user, analytics]) => analytics.setUserId(user ? user.uid : null!, { global: true })),
6672
runOutsideAngular(zone)
6773
).subscribe()
6874
}

src/remote-config/remote-config.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import { map, switchMap, tap } from 'rxjs/operators';
44
import { FirebaseAppConfig, FirebaseOptions, FIREBASE_OPTIONS, FIREBASE_APP_NAME } from '@angular/fire';
55
import { remoteConfig } from 'firebase/app';
66

7+
// @ts-ignore
8+
import firebase from 'firebase/app';
9+
710
export interface DefaultConfig {[key:string]: string|number|boolean};
811

912
export const REMOTE_CONFIG_SETTINGS = new InjectionToken<remoteConfig.Settings>('angularfire2.remoteConfig.settings');
@@ -30,10 +33,14 @@ export class AngularFireRemoteConfig {
3033
@Optional() @Inject(DEFAULT_CONFIG) defaultConfig:DefaultConfig|null,
3134
private zone: NgZone
3235
) {
36+
// import('firebase/remote-config') isn't working for some reason...
37+
// it might have something to do with https://github.com/firebase/firebase-js-sdk/pull/2229
38+
// import from @firebase/remote-config so I can manually register on the Firebase instance
3339
// @ts-ignore zapping in the UMD in the build script
34-
const requireRemoteConfig = from(import('firebase/remote-config'));
40+
const requireRemoteConfig = from(import('@firebase/remote-config'));
3541

3642
this.remoteConfig = requireRemoteConfig.pipe(
43+
map(rc => rc.registerRemoteConfig(firebase)),
3744
map(() => _firebaseAppFactory(options, nameOrConfig)),
3845
map(app => app.remoteConfig()),
3946
tap(rc => {

tools/build.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const GLOBALS = {
3030
'firebase/functions': 'firebase',
3131
'firebase/performance': 'firebase',
3232
'firebase/remote-config': 'firebase',
33+
'@firebase/remote-config': 'firebase',
3334
'firebase/storage': 'firebase',
3435
'@angular/fire': 'angularfire2',
3536
'@angular/fire/auth': 'angularfire2.auth',

0 commit comments

Comments
 (0)