Skip to content

Commit 13b3d18

Browse files
author
Andrea Barbasso
committed
[DSC-1570] set up store for datadog rum
1 parent 16ce735 commit 13b3d18

5 files changed

Lines changed: 98 additions & 19 deletions

File tree

src/app/core/core-state.model.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { JsonPatchOperationsState } from './json-patch/json-patch-operations.red
1111
import { MetaTagState } from './metadata/meta-tag.reducer';
1212
import { RouteState } from './services/route.reducer';
1313
import { RequestState } from './data/request-state.model';
14+
import { DatadogRumState } from '../shared/datadog-rum/datadog-rum.reducer';
1415

1516
/**
1617
* The core sub-state in the NgRx store
@@ -27,4 +28,5 @@ export interface CoreState {
2728
'json/patch': JsonPatchOperationsState;
2829
'metaTag': MetaTagState;
2930
'route': RouteState;
31+
'datadogRum': DatadogRumState;
3032
}

src/app/core/core.reducers.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
import { historyReducer } from './history/history.reducer';
1515
import { metaTagReducer } from './metadata/meta-tag.reducer';
1616
import { CoreState } from './core-state.model';
17+
import { datadogRumReducer } from '../shared/datadog-rum/datadog-rum.reducer';
1718

1819
export const coreReducers: ActionReducerMap<CoreState> = {
1920
'bitstreamFormats': bitstreamFormatReducer,
@@ -26,5 +27,6 @@ export const coreReducers: ActionReducerMap<CoreState> = {
2627
'auth': authReducer,
2728
'json/patch': jsonPatchOperationsReducer,
2829
'metaTag': metaTagReducer,
29-
'route': routeReducer
30+
'route': routeReducer,
31+
'datadogRum': datadogRumReducer,
3032
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Action } from '@ngrx/store';
2+
import { type } from '../ngrx/type';
3+
4+
export const DatadogRumActionTypes = {
5+
SET_STATUS: type('dspace/datadog-rum/SET_IS_INITIALIZED'),
6+
};
7+
8+
export class setDatadogRumStatusAction implements Action {
9+
type = DatadogRumActionTypes.SET_STATUS;
10+
payload: {
11+
isInitialized?: boolean;
12+
isRunning?: boolean;
13+
};
14+
15+
constructor(status: { isInitialized?: boolean, isRunning?: boolean }) {
16+
this.payload = status;
17+
}
18+
}
19+
20+
export type DatadogRumAction = setDatadogRumStatusAction;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { DatadogRumAction, DatadogRumActionTypes } from './datadog-rum.actions';
2+
3+
export interface DatadogRumState {
4+
isInitialized: boolean;
5+
isRunning: boolean;
6+
}
7+
8+
const initialState: DatadogRumState = Object.create({isInitialized: false, isRunning: false});
9+
10+
export function datadogRumReducer(state = initialState, action: DatadogRumAction): DatadogRumState {
11+
12+
switch (action.type) {
13+
14+
case DatadogRumActionTypes.SET_STATUS: {
15+
return setDatadogRumStatus(state, action);
16+
}
17+
18+
default: {
19+
return state;
20+
}
21+
}
22+
}
23+
24+
function setDatadogRumStatus(state: DatadogRumState, action: DatadogRumAction) {
25+
return {
26+
...state,
27+
...action.payload
28+
};
29+
}

src/app/shared/datadog-rum/datadog-rum.service.ts

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,67 @@ import { Injectable } from '@angular/core';
22
import { environment } from '../../../environments/environment';
33
import { datadogRum } from '@datadog/browser-rum';
44
import { CookieConsents, KlaroService } from '../cookies/klaro.service';
5-
import { BehaviorSubject } from 'rxjs';
5+
import { BehaviorSubject, Observable } from 'rxjs';
6+
import { createSelector, Store } from '@ngrx/store';
7+
import { setDatadogRumStatusAction } from './datadog-rum.actions';
8+
import { DatadogRumState } from './datadog-rum.reducer';
9+
import { distinctUntilChanged, take } from 'rxjs/operators';
10+
import { coreSelector } from '../../core/core.selectors';
11+
import { CoreState } from '../../core/core-state.model';
12+
13+
export const getDatadogRumState = createSelector(coreSelector, (state: CoreState) => state.datadogRum);
614

715
@Injectable({
816
providedIn: 'root'
917
})
1018
export class DatadogRumService {
1119

1220
consentUpdates$: BehaviorSubject<CookieConsents>;
13-
isDatadogInitialized = false;
14-
isDatadogRunning = false;
1521

1622
constructor(
17-
private klaroService: KlaroService
23+
private klaroService: KlaroService,
24+
private store: Store
1825
) {
1926
}
2027

2128
initDatadogRum() {
2229
this.klaroService.watchConsentUpdates();
2330
this.consentUpdates$ = this.klaroService.consentsUpdates$;
2431
this.consentUpdates$.subscribe(savedPreferences => {
25-
if (savedPreferences?.datadog &&
26-
environment.datadogRum?.clientToken && environment.datadogRum?.applicationId &&
27-
environment.datadogRum?.service && environment.datadogRum?.env) {
28-
if (!this.isDatadogInitialized) {
29-
this.isDatadogInitialized = true;
30-
this.isDatadogRunning = true;
31-
datadogRum.init(environment.datadogRum);
32-
} else if (!this.isDatadogRunning) {
33-
this.isDatadogRunning = true;
34-
datadogRum.startSessionReplayRecording();
32+
this.getDatadogRumState().subscribe((state) => {
33+
if (savedPreferences?.datadog &&
34+
environment.datadogRum?.clientToken && environment.datadogRum?.applicationId &&
35+
environment.datadogRum?.service && environment.datadogRum?.env) {
36+
if (!state.isInitialized) {
37+
this.store.dispatch(new setDatadogRumStatusAction({
38+
isInitialized: true,
39+
isRunning: true
40+
}));
41+
datadogRum.init(environment.datadogRum);
42+
} else if (!state.isRunning) {
43+
this.store.dispatch(new setDatadogRumStatusAction({
44+
isRunning: true
45+
}));
46+
datadogRum.startSessionReplayRecording();
47+
}
48+
} else {
49+
datadogRum.stopSessionReplayRecording();
50+
this.store.dispatch(new setDatadogRumStatusAction({
51+
isRunning: false
52+
}));
3553
}
36-
} else {
37-
datadogRum.stopSessionReplayRecording();
38-
this.isDatadogRunning = false;
39-
}
54+
});
4055
});
4156
}
57+
58+
59+
getDatadogRumState(): Observable<DatadogRumState> {
60+
return this.store
61+
.select(getDatadogRumState)
62+
.pipe(
63+
distinctUntilChanged(),
64+
take(1),
65+
);
66+
}
4267
}
68+

0 commit comments

Comments
 (0)