Skip to content

Commit deaf43b

Browse files
authored
refactor: adding type and reading from window freshpaint (#1166)
* refactor: adding type and reading from window freshpaint * refactor: adding type and reading from window freshpaint * refactor: fixing lint * refactor: fixining formatting
1 parent b65d383 commit deaf43b

File tree

5 files changed

+57
-21
lines changed

5 files changed

+57
-21
lines changed

projects/common/src/telemetry/providers/freshpaint/freshpaint-provider.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ import { FreshPaint, loadFreshPaint } from './load-snippet';
66
@Injectable({ providedIn: 'root' })
77
export class FreshPaintTelemetry<InitConfig extends TelemetryProviderConfig>
88
implements UserTelemetryProvider<InitConfig> {
9-
private freshPaint?: FreshPaint;
9+
private get freshPaint(): FreshPaint | undefined {
10+
return window.freshpaint;
11+
}
1012

1113
public initialize(config: InitConfig): void {
12-
this.freshPaint = loadFreshPaint();
13-
this.freshPaint.init(config.orgId);
14+
loadFreshPaint();
15+
this.freshPaint?.init(config.orgId);
1416
}
1517

1618
public identify(userTraits: UserTraits): void {
@@ -23,7 +25,9 @@ export class FreshPaintTelemetry<InitConfig extends TelemetryProviderConfig>
2325
}
2426

2527
public trackPage(name: string, eventData: Dictionary<unknown>): void {
26-
this.freshPaint?.page(name, name, eventData);
28+
this.freshPaint?.addPageviewProperties({ url: name, ...eventData });
29+
this.freshPaint?.page('product-ui', name, eventData);
30+
this.freshPaint?.track(name, eventData);
2731
}
2832

2933
public trackError(name: string, eventData: Dictionary<unknown>): void {

projects/common/src/telemetry/providers/freshpaint/load-snippet/index.d.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
1-
export function loadFreshPaint(): FreshPaint;
1+
export function loadFreshPaint(): void;
22

33
export interface FreshPaint {
44
init(orgId: string): void;
5+
ready(callback: () => void): void;
56
identify(uid?: string, userVars?: UserVars): void;
67
identify(userVars?: UserVars): void;
78
track(eventName: string, properties?: {}): void;
89
addEventProperties(userVars?: UserVars): void;
10+
addPageviewProperties(properties: { [key: string]: any }): void;
911
page(category?: string, name?: string, userVars?: UserVars): void;
1012
}
1113

14+
declare global {
15+
interface Window {
16+
freshpaint?: FreshPaint;
17+
}
18+
}
19+
1220
interface UserVars {
1321
displayName?: string;
1422
email?: string;

projects/common/src/telemetry/providers/freshpaint/load-snippet/index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
const loadFreshPaint = () => {
44
if (window.freshpaint) {
5-
return window.freshpaint;
5+
return getFreshPaint;
66
}
7+
78
(function (c, a) {
89
if (!a.__SV) {
910
var b = window;
@@ -77,7 +78,7 @@ const loadFreshPaint = () => {
7778
}
7879
})(document, window.freshpaint || []);
7980

80-
return freshpaint;
81+
return window.freshpaint;
8182
};
8283

8384
module.exports = {

projects/common/src/telemetry/user-telemetry-impl.service.test.ts

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,21 @@ describe('User Telemetry helper service', () => {
5858

5959
// TrackEvent
6060
spectator.service.trackEvent('eventA', { target: 'unknown' });
61-
expect(telemetryProvider.trackEvent).toHaveBeenCalledWith('eventA', { target: 'unknown' });
61+
expect(telemetryProvider.trackEvent).toHaveBeenCalledWith('eventA', {
62+
target: 'unknown',
63+
eventCategory: 'user-action'
64+
});
6265

6366
// TrackPage
6467
spectator.service.trackPageEvent('/abs', { target: 'unknown' });
65-
expect(telemetryProvider.trackPage).toHaveBeenCalledWith('/abs', { target: 'unknown' });
68+
expect(telemetryProvider.trackPage).toHaveBeenCalledWith('/abs', { target: 'unknown', eventCategory: 'page-view' });
6669

6770
// TrackError
6871
spectator.service.trackErrorEvent('console error', { target: 'unknown' });
69-
expect(telemetryProvider.trackError).toHaveBeenCalledWith('Error: console error', { target: 'unknown' });
72+
expect(telemetryProvider.trackError).toHaveBeenCalledWith('Error: console error', {
73+
target: 'unknown',
74+
eventCategory: 'error'
75+
});
7076
});
7177

7278
test('should not capture events if event tracking is disabled', () => {
@@ -112,11 +118,14 @@ describe('User Telemetry helper service', () => {
112118

113119
// TrackPage
114120
spectator.service.trackPageEvent('/abs', { target: 'unknown' });
115-
expect(telemetryProvider.trackPage).toHaveBeenCalledWith('/abs', { target: 'unknown' });
121+
expect(telemetryProvider.trackPage).toHaveBeenCalledWith('/abs', { target: 'unknown', eventCategory: 'page-view' });
116122

117123
// TrackError
118124
spectator.service.trackErrorEvent('console error', { target: 'unknown' });
119-
expect(telemetryProvider.trackError).toHaveBeenCalledWith('Error: console error', { target: 'unknown' });
125+
expect(telemetryProvider.trackError).toHaveBeenCalledWith('Error: console error', {
126+
target: 'unknown',
127+
eventCategory: 'error'
128+
});
120129
});
121130

122131
test('should not capture page events if page event tracking is disabled', () => {
@@ -158,15 +167,21 @@ describe('User Telemetry helper service', () => {
158167

159168
// TrackEvent
160169
spectator.service.trackEvent('eventA', { target: 'unknown' });
161-
expect(telemetryProvider.trackEvent).toHaveBeenCalledWith('eventA', { target: 'unknown' });
170+
expect(telemetryProvider.trackEvent).toHaveBeenCalledWith('eventA', {
171+
target: 'unknown',
172+
eventCategory: 'user-action'
173+
});
162174

163175
// TrackPage
164176
spectator.service.trackPageEvent('/abs', { target: 'unknown' });
165177
expect(telemetryProvider.trackPage).not.toHaveBeenCalled();
166178

167179
// TrackError
168180
spectator.service.trackErrorEvent('console error', { target: 'unknown' });
169-
expect(telemetryProvider.trackError).toHaveBeenCalledWith('Error: console error', { target: 'unknown' });
181+
expect(telemetryProvider.trackError).toHaveBeenCalledWith('Error: console error', {
182+
target: 'unknown',
183+
eventCategory: 'error'
184+
});
170185
});
171186

172187
test('should not capture error events if eror event tracking is disabled', () => {
@@ -208,11 +223,14 @@ describe('User Telemetry helper service', () => {
208223

209224
// TrackEvent
210225
spectator.service.trackEvent('eventA', { target: 'unknown' });
211-
expect(telemetryProvider.trackEvent).toHaveBeenCalledWith('eventA', { target: 'unknown' });
226+
expect(telemetryProvider.trackEvent).toHaveBeenCalledWith('eventA', {
227+
target: 'unknown',
228+
eventCategory: 'user-action'
229+
});
212230

213231
// TrackPage
214232
spectator.service.trackPageEvent('/abs', { target: 'unknown' });
215-
expect(telemetryProvider.trackPage).toHaveBeenCalledWith('/abs', { target: 'unknown' });
233+
expect(telemetryProvider.trackPage).toHaveBeenCalledWith('/abs', { target: 'unknown', eventCategory: 'page-view' });
216234

217235
// TrackError
218236
spectator.service.trackPageEvent('console error', { target: 'unknown' });

projects/common/src/telemetry/user-telemetry-impl.service.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Injectable, Injector, Optional } from '@angular/core';
22
import { NavigationEnd, Router } from '@angular/router';
3-
import { filter } from 'rxjs/operators';
3+
import { delay, filter } from 'rxjs/operators';
44
import { Dictionary } from '../utilities/types/types';
55
import { UserTelemetryProvider, UserTelemetryRegistrationConfig, UserTraits } from './telemetry';
66
import { UserTelemetryService } from './user-telemetry.service';
@@ -46,19 +46,21 @@ export class UserTelemetryImplService extends UserTelemetryService {
4646
public trackEvent(name: string, data: Dictionary<unknown>): void {
4747
this.initializedTelemetryProviders
4848
.filter(provider => provider.enableEventTracking)
49-
.forEach(provider => provider.telemetryProvider.trackEvent?.(name, data));
49+
.forEach(provider => provider.telemetryProvider.trackEvent?.(name, { ...data, eventCategory: 'user-action' }));
5050
}
5151

5252
public trackPageEvent(url: string, data: Dictionary<unknown>): void {
5353
this.initializedTelemetryProviders
5454
.filter(provider => provider.enablePageTracking)
55-
.forEach(provider => provider.telemetryProvider.trackPage?.(url, data));
55+
.forEach(provider => provider.telemetryProvider.trackPage?.(url, { ...data, eventCategory: 'page-view' }));
5656
}
5757

5858
public trackErrorEvent(error: string, data: Dictionary<unknown>): void {
5959
this.initializedTelemetryProviders
6060
.filter(provider => provider.enableErrorTracking)
61-
.forEach(provider => provider.telemetryProvider.trackError?.(`Error: ${error}`, data));
61+
.forEach(provider =>
62+
provider.telemetryProvider.trackError?.(`Error: ${error}`, { ...data, eventCategory: 'error' })
63+
);
6264
}
6365

6466
private buildTelemetryProvider(config: UserTelemetryRegistrationConfig<unknown>): UserTelemetryInternalConfig {
@@ -72,7 +74,10 @@ export class UserTelemetryImplService extends UserTelemetryService {
7274

7375
private setupAutomaticPageTracking(): void {
7476
this.router?.events
75-
.pipe(filter((event): event is NavigationEnd => event instanceof NavigationEnd))
77+
.pipe(
78+
filter((event): event is NavigationEnd => event instanceof NavigationEnd),
79+
delay(50)
80+
)
7681
.subscribe(route => this.trackPageEvent(`Visited: ${route.url}`, { url: route.url }));
7782
}
7883
}

0 commit comments

Comments
 (0)