Skip to content

Commit 3e1c93f

Browse files
authored
feat(analytics-provider-data-layer,core)!: support async data layer trackers (#3045)
* feat(core): add `MaybeAsync` * feat(analytics-provider-data-layer)!: support async trackers BREAKING CHANGE: `DataLayerTracker` return type is now `MaybeAsync`
1 parent 3988924 commit 3e1c93f

File tree

5 files changed

+18
-7
lines changed

5 files changed

+18
-7
lines changed

libs/analytics-provider-data-layer/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"@daffodil/analytics": "0.0.0-PLACEHOLDER"
3333
},
3434
"devDependencies": {
35-
"@daffodil/analytics": "0.0.0-PLACEHOLDER"
35+
"@daffodil/analytics": "0.0.0-PLACEHOLDER",
36+
"@daffodil/core": "0.0.0-PLACEHOLDER"
3637
}
3738
}

libs/analytics-provider-data-layer/src/lib/provider-data-layer-tracker.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,23 @@ import {
22
FactoryProvider,
33
inject,
44
} from '@angular/core';
5-
import { of } from 'rxjs';
5+
import { map } from 'rxjs';
66

77
import {
88
DaffAnalyticsEvent,
99
DaffAnalyticsServices,
1010
} from '@daffodil/analytics';
11+
import {
12+
MaybeAsync,
13+
observe,
14+
} from '@daffodil/core';
1115

1216
import { DataLayerItem } from './data-layer';
1317
import { DaffAnalyticsDataLayer } from './data-layer.service';
1418

15-
16-
1719
export type DataLayerTracker<T extends DaffAnalyticsEvent> = (
1820
action: T
19-
) => DataLayerItem;
21+
) => MaybeAsync<DataLayerItem>;
2022

2123
export function provideDataLayerTracker<T extends DaffAnalyticsEvent>(
2224
tracker: DataLayerTracker<T>,
@@ -25,7 +27,9 @@ export function provideDataLayerTracker<T extends DaffAnalyticsEvent>(
2527
provide: DaffAnalyticsServices,
2628
useFactory: () => {
2729
const dataLayer = inject(DaffAnalyticsDataLayer);
28-
return (action: T) => of(dataLayer.push(tracker(action)));
30+
return (action: T) => observe(tracker(action)).pipe(
31+
map((data) => dataLayer.push(data)),
32+
);
2933
},
3034
multi: true,
3135
};

libs/core/src/async/maybe.type.ts

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { Observable } from 'rxjs';
2+
3+
export type MaybeAsync<T> = Promise<T> | Observable<T> | T;

libs/core/src/public_api.ts

+1
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ export * from './filters/public_api';
1818
export * from './injection-tokens/public_api';
1919

2020
export { DaffOrderable } from './orderable/orderable';
21+
export { MaybeAsync } from './async/maybe.type';

libs/core/src/utils/observe.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import {
44
from,
55
} from 'rxjs';
66

7+
import { MaybeAsync } from '../async/maybe.type';
8+
79
/**
810
* Converts a value to an observable.
911
* If the value is an observable, just returns that observable.
1012
* If the value is a promise, converts it to an observable (see rxjs `from`).
1113
* If the value is neither, just returns an observable that immediately emits the value.
1214
*/
13-
export function observe<T>(val: T | Promise<T> | Observable<T>): Observable<T> {
15+
export function observe<T>(val: MaybeAsync<T>): Observable<T> {
1416
return isObservable(val) ? val : from(Promise.resolve(val));
1517
}

0 commit comments

Comments
 (0)