@24i/bigscreen-sdk 1.0.54-alpha.2836 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +6 -0
- package/README.md +3 -2
- package/package.json +10 -10
- package/packages/analytics/src/clients/GoogleAnalytics/GoogleAnalytics.ts +14 -10
- package/packages/analytics/src/clients/GoogleAnalytics/constants.ts +2 -10
- package/packages/analytics/src/clients/GoogleAnalytics/interface.ts +1 -6
- package/packages/analytics/src/clients/GoogleAnalytics/mapPayload.ts +0 -1
- package/packages/analytics/src/clients/TealiumAnalytics/TealiumAnalytics.ts +24 -36
- package/packages/analytics/src/clients/TealiumAnalytics/constants.ts +1 -5
- package/packages/analytics/src/clients/TealiumAnalytics/findIdForLanguage.ts +9 -0
- package/packages/analytics/src/clients/TealiumAnalytics/index.ts +1 -1
- package/packages/analytics/src/clients/TealiumAnalytics/interface.ts +1 -3
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/__mocks__/mediaPayload.ts +14 -16
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSceneView.ts +1 -1
- package/packages/analytics/src/clients/TealiumAnalytics/types.ts +14 -19
- package/packages/analytics/src/clients/TwentyFourIQ/TwentyFourIQClient.ts +22 -13
- package/packages/analytics/src/clients/TwentyFourIQ/constants.ts +3 -15
- package/packages/analytics/src/clients/TwentyFourIQ/interface.ts +4 -7
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdLoaded.ts +13 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdSkipped.ts +16 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBase.ts +3 -6
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBuffering.ts +2 -2
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerClose.ts +3 -4
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerOpen.ts +3 -2
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapSceneView.ts +2 -2
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapScroll.ts +2 -2
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoComplete.ts +3 -4
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoPause.ts +3 -4
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoProgress.ts +3 -4
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStart.ts +2 -2
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStop.ts +2 -2
- package/packages/analytics/src/clients/TwentyFourIQ/types.ts +28 -45
- package/packages/create-package/dist/createPackage.js +66 -0
- package/packages/create-package/dist/createPackage.js.map +1 -0
- package/packages/create-package/dist/index.js +5 -0
- package/packages/create-package/dist/index.js.map +1 -0
- package/packages/create-package/dist/questionnaire/questions.js +35 -0
- package/packages/create-package/dist/questionnaire/questions.js.map +1 -0
- package/packages/create-package/dist/settings/Settings.js +10 -0
- package/packages/create-package/dist/settings/Settings.js.map +1 -0
- package/packages/create-package/dist/types.js +3 -0
- package/packages/create-package/dist/types.js.map +1 -0
- package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoProvider.ts +2 -23
- package/packages/developer-tools/src/TechnicalInfo/__mocks__/Device.ts +0 -8
- package/packages/developer-tools/src/TechnicalInfo/translations.ts +0 -4
- package/packages/driver-androidtv/src/DeviceAndroidTV.ts +0 -38
- package/packages/driver-androidtv/src/__mocks__/javaScriptBridge.ts +0 -9
- package/packages/driver-androidtv/src/index.ts +0 -1
- package/packages/driver-androidtv/src/types.ts +0 -42
- package/packages/driver-base/src/DeviceBase.ts +0 -19
- package/packages/driver-base/src/__mocks__/DeviceBase.ts +0 -24
- package/packages/driver-base/src/index.ts +0 -3
- package/packages/driver-browser/src/DeviceBrowser.ts +0 -26
- package/packages/driver-entone/src/DeviceEntone.ts +1 -31
- package/packages/driver-firetv/src/DeviceFireTV.ts +1 -74
- package/packages/driver-firetv/src/__mocks__/javaScriptBridge.ts +0 -9
- package/packages/driver-hbbtv/src/DeviceHbbTV.ts +0 -26
- package/packages/driver-kreatv/src/DeviceKreaTV.ts +0 -26
- package/packages/driver-saphi/src/DeviceSaphi.ts +0 -26
- package/packages/driver-smartcast/src/DeviceSmartCast.ts +1 -78
- package/packages/driver-smartcast/src/__mocks__/api.ts +2 -32
- package/packages/driver-smartcast/src/types.ts +2 -48
- package/packages/driver-tizen/src/DeviceTizen.ts +7 -126
- package/packages/driver-tizen/src/ITizen.ts +202 -15116
- package/packages/driver-tizen/src/IWebapis.ts +87 -8643
- package/packages/driver-tizen/src/TizenKeys.ts +2 -2
- package/packages/driver-tizen/src/__mocks__/tizen.ts +8 -7
- package/packages/driver-tizen/src/constants.ts +195 -1
- package/packages/driver-tizen/src/types.ts +14 -0
- package/packages/driver-vidaa/src/DeviceVidaa.ts +0 -26
- package/packages/driver-webos/src/DeviceWebos.ts +0 -47
- package/packages/driver-webos/src/__mocks__/webos.ts +0 -33
- package/packages/driver-webos/src/constants.ts +0 -1
- package/packages/driver-webos/src/types.ts +0 -30
- package/packages/driver-xbox/src/DeviceXbox.ts +1 -30
- package/packages/grid/src/UnifiedGridController/UnifiedGridController.ts +6 -6
- package/packages/input/README.md +3 -0
- package/packages/input/src/Input.tsx +62 -32
- package/packages/input/src/utils.ts +71 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/index.ts +0 -1
- package/packages/keyboard/src/utils/caret.ts +8 -5
- package/packages/keyboard/src/utils/input.ts +6 -5
- package/packages/list/src/BasicList/BasicList.tsx +7 -7
- package/packages/list/src/CenteredList/CenteredList.tsx +2 -2
- package/packages/list/src/EdgeOffsetList/EdgeOffsetList.tsx +7 -7
- package/packages/list/src/FirstOnlyList/FirstOnlyList.tsx +2 -2
- package/packages/list/src/FirstOnlyVariedList/FirstOnlyVariedList.tsx +2 -2
- package/packages/list/src/FixedToEndList/FixedToEndList.tsx +2 -2
- package/packages/list/src/interface.ts +2 -2
- package/packages/logger/src/loggers/ConsoleLogger/ConsoleLogger.ts +1 -7
- package/packages/logger/src/loggers/SentryLogger/SentryLogger.ts +1 -3
- package/packages/router/README.md +0 -1
- package/packages/router/src/Router.tsx +1 -4
- package/packages/router/src/utils.ts +1 -1
- package/utils/release/release.ts +5 -7
- package/ci/is_ci_job_skippable.sh +0 -153
- package/packages/analytics/src/clients/TealiumAnalytics/findForLanguage.ts +0 -9
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppOpen.ts +0 -13
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdEvent.ts +0 -20
- package/packages/driver-base/src/types/AdInfo.ts +0 -5
- package/packages/driver-base/src/types/InAppPurchase.ts +0 -25
- package/packages/driver-firetv/src/types.ts +0 -1
- package/packages/input/src/handleOverflow.ts +0 -29
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/spanish.ts +0 -26
- package/packages/keyboard/src/utils/setInputSelectionRange.ts +0 -10
package/README.md
CHANGED
|
@@ -6,8 +6,9 @@ sidebar_label: README
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# SmartApps BIGscreen SDK
|
|
9
|
-
|
|
10
|
-
[](https://travis-ci.com/24i/smartapps-bigscreen-sdk)
|
|
11
|
+
[](https://coveralls.io/github/24i/smartapps-bigscreen-sdk?branch=development)
|
|
11
12
|
|
|
12
13
|
* [GitHub](https://github.com/24i/smartapps-bigscreen-sdk)
|
|
13
14
|
* [Confluence](https://24imedia.atlassian.net/wiki/spaces/PRDNGBIGSCR/overview)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@24i/bigscreen-sdk",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "SmartApps BIGscreen SDK monorepo",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -38,11 +38,11 @@
|
|
|
38
38
|
},
|
|
39
39
|
"homepage": "https://github.com/24i/smartapps-bigscreen-sdk#readme",
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@24i/appstage-shared-analytics": "1.0.
|
|
41
|
+
"@24i/appstage-shared-analytics": "1.0.20-alpha.72",
|
|
42
42
|
"@24i/appstage-shared-events-manager": "1.0.11",
|
|
43
43
|
"@24i/appstage-shared-perf-utils": "1.0.11",
|
|
44
|
-
"@24i/bigscreen-players-engine-base": "4.
|
|
45
|
-
"@24i/smartapps-datalayer": "3.0.
|
|
44
|
+
"@24i/bigscreen-players-engine-base": "4.0.8",
|
|
45
|
+
"@24i/smartapps-datalayer": "3.0.15",
|
|
46
46
|
"@sentry/browser": "7.35.0",
|
|
47
47
|
"@sentry/types": "7.35.0",
|
|
48
48
|
"csstype": "^3.1.3",
|
|
@@ -54,14 +54,14 @@
|
|
|
54
54
|
"@24i/bigscreen-sdk": "file:.",
|
|
55
55
|
"@24i/eslint-config-smartapps-bigscreen-linters": "file:./libs/linters",
|
|
56
56
|
"@24i/smartapps-bigscreen-changelog-generator": "0.17.0",
|
|
57
|
-
"@babel/core": "^7.24.
|
|
58
|
-
"@babel/preset-env": "^7.24.
|
|
57
|
+
"@babel/core": "^7.24.5",
|
|
58
|
+
"@babel/preset-env": "^7.24.5",
|
|
59
59
|
"@types/fs-extra": "^11.0.4",
|
|
60
60
|
"@types/gtag.js": "^0.0.19",
|
|
61
61
|
"@types/inquirer": "^9.0.7",
|
|
62
62
|
"@types/jest": "^29.5.12",
|
|
63
63
|
"@types/minimist": "^1.2.5",
|
|
64
|
-
"@types/node": "^20.
|
|
64
|
+
"@types/node": "^20.12.7",
|
|
65
65
|
"@types/prop-types": "^15.7.12",
|
|
66
66
|
"@types/react": "18.0.33",
|
|
67
67
|
"@types/scheduler": "^0.23.0",
|
|
@@ -72,16 +72,16 @@
|
|
|
72
72
|
"fs-extra": "^11.2.0",
|
|
73
73
|
"full-icu": "^1.5.0",
|
|
74
74
|
"identity-obj-proxy": "^3.0.0",
|
|
75
|
-
"inquirer": "^9.2.
|
|
75
|
+
"inquirer": "^9.2.20",
|
|
76
76
|
"jest": "^29.7.0",
|
|
77
77
|
"jest-canvas-mock": "^2.5.2",
|
|
78
78
|
"jest-environment-jsdom": "^29.7.0",
|
|
79
79
|
"jest-sonar": "^0.2.15",
|
|
80
80
|
"minimist": "^1.2.8",
|
|
81
81
|
"patch-package": "^8.0.0",
|
|
82
|
-
"sass": "^1.
|
|
82
|
+
"sass": "^1.76.0",
|
|
83
83
|
"sass-true": "^8.0.0",
|
|
84
|
-
"ts-jest": "^29.1.
|
|
84
|
+
"ts-jest": "^29.1.2",
|
|
85
85
|
"ts-node": "^10.9.2",
|
|
86
86
|
"tsconfig-paths-jest": "0.0.1",
|
|
87
87
|
"typescript": "^5.4.5"
|
|
@@ -5,7 +5,7 @@ import { createTimeout } from '@24i/bigscreen-sdk/utils/timers';
|
|
|
5
5
|
import { MINUTE_IN_MS } from '@24i/bigscreen-sdk/utils/timeConstants';
|
|
6
6
|
import { generateUuid } from '@24i/bigscreen-sdk/utils/generateUuid';
|
|
7
7
|
import { i18n } from '@24i/bigscreen-sdk/i18n';
|
|
8
|
-
import type { AnalyticsClient, AnalyticsEventsMap,
|
|
8
|
+
import type { AnalyticsClient, AnalyticsEventsMap, SceneInfo } from '../../interface';
|
|
9
9
|
import { mapEventParamsToUrlParams, mapPayload } from './mapPayload';
|
|
10
10
|
import { prepareBody } from './prepareBody';
|
|
11
11
|
import { getUrl } from './getUrl';
|
|
@@ -74,7 +74,7 @@ export class GoogleAnalytics implements AnalyticsClient {
|
|
|
74
74
|
params.cid = generateUuid();
|
|
75
75
|
await Storage.setItem(GA_CLIENT_ID, params.cid);
|
|
76
76
|
}
|
|
77
|
-
this.firstVisit = !(await Storage.getItem(GA_FIRST_VISIT));
|
|
77
|
+
this.firstVisit = !(await Storage.getItem(GA_FIRST_VISIT)) ?? true;
|
|
78
78
|
if (this.firstVisit) {
|
|
79
79
|
await Storage.setItem(GA_FIRST_VISIT, '0');
|
|
80
80
|
}
|
|
@@ -123,10 +123,18 @@ export class GoogleAnalytics implements AnalyticsClient {
|
|
|
123
123
|
this.lastOnEvent = now;
|
|
124
124
|
await Promise.all(events.map(async (event, index) => {
|
|
125
125
|
const sessionInfo = await this.getSessionInfo(
|
|
126
|
-
|
|
126
|
+
index === 0 ? engagementTime : undefined,
|
|
127
127
|
);
|
|
128
|
-
const gtagPayload = mapPayload(
|
|
129
|
-
|
|
128
|
+
const gtagPayload = mapPayload(
|
|
129
|
+
event, triggerName, {
|
|
130
|
+
...payload,
|
|
131
|
+
...sessionInfo,
|
|
132
|
+
},
|
|
133
|
+
);
|
|
134
|
+
const urlParams = mapEventParamsToUrlParams({
|
|
135
|
+
...sessionInfo as SessionInfo,
|
|
136
|
+
...payload as SceneInfo,
|
|
137
|
+
});
|
|
130
138
|
this.send(event, gtagPayload, urlParams);
|
|
131
139
|
}));
|
|
132
140
|
}
|
|
@@ -169,10 +177,7 @@ export class GoogleAnalytics implements AnalyticsClient {
|
|
|
169
177
|
|
|
170
178
|
private sendQueueWithDelay = debounce(this.sendQueue, SEND_DEBOUNCE_MS);
|
|
171
179
|
|
|
172
|
-
private async getSessionInfo(
|
|
173
|
-
payload: AnyPayload,
|
|
174
|
-
engagementTime: number | undefined,
|
|
175
|
-
): Promise<SessionInfo> {
|
|
180
|
+
private async getSessionInfo(engagementTime: number | undefined): Promise<SessionInfo> {
|
|
176
181
|
const sessionStarted = !this.sessionStartSent;
|
|
177
182
|
this.sessionStartSent = true;
|
|
178
183
|
const { firstEvent } = this;
|
|
@@ -189,7 +194,6 @@ export class GoogleAnalytics implements AnalyticsClient {
|
|
|
189
194
|
sessionStarted,
|
|
190
195
|
engagementTime,
|
|
191
196
|
firstEvent,
|
|
192
|
-
isAuthenticated: payload?.userId ? '1' : '0',
|
|
193
197
|
firstVisit: firstVisit as boolean,
|
|
194
198
|
};
|
|
195
199
|
}
|
|
@@ -31,12 +31,8 @@ export const GOOGLE_ANALYTICS_TRIGGERS = [
|
|
|
31
31
|
AnalyticsTriggers.SEARCH,
|
|
32
32
|
AnalyticsTriggers.RATE_CONTENT,
|
|
33
33
|
// ads triggers
|
|
34
|
-
AnalyticsTriggers.
|
|
35
|
-
AnalyticsTriggers.AD_COMPLETE,
|
|
36
|
-
AnalyticsTriggers.AD_ERROR,
|
|
34
|
+
AnalyticsTriggers.AD_LOADED,
|
|
37
35
|
AnalyticsTriggers.AD_SKIPPED,
|
|
38
|
-
AnalyticsTriggers.AD_START,
|
|
39
|
-
AnalyticsTriggers.AD_STOP,
|
|
40
36
|
// user triggers
|
|
41
37
|
AnalyticsTriggers.LOGIN,
|
|
42
38
|
AnalyticsTriggers.LOGOUT,
|
|
@@ -91,12 +87,8 @@ export const TRIGGER_NAME_TO_GA_EVENTS: Record<
|
|
|
91
87
|
[AnalyticsTriggers.RATE_CONTENT]: ['rate_content'],
|
|
92
88
|
|
|
93
89
|
// ads triggers
|
|
94
|
-
[AnalyticsTriggers.
|
|
95
|
-
[AnalyticsTriggers.AD_COMPLETE]: ['ad_complete'],
|
|
96
|
-
[AnalyticsTriggers.AD_ERROR]: ['ad_error'],
|
|
90
|
+
[AnalyticsTriggers.AD_LOADED]: ['ad_loaded'],
|
|
97
91
|
[AnalyticsTriggers.AD_SKIPPED]: ['ad_skipped'],
|
|
98
|
-
[AnalyticsTriggers.AD_START]: ['ad_start'],
|
|
99
|
-
[AnalyticsTriggers.AD_STOP]: ['ad_stop'],
|
|
100
92
|
|
|
101
93
|
// user triggers
|
|
102
94
|
[AnalyticsTriggers.LOGIN]: ['login'],
|
|
@@ -17,12 +17,8 @@ export type GAEventsNames = (
|
|
|
17
17
|
| 'favorite_add' // When a user add asset to favorites
|
|
18
18
|
| 'favorite_remove' // When a user remove asset froms favorites
|
|
19
19
|
| 'user_engagement' // Periodically, while the app is in the foreground
|
|
20
|
-
| '
|
|
21
|
-
| 'ad_complete' // When advertisement has been completed
|
|
22
|
-
| 'ad_error' // When advertisement has an error
|
|
20
|
+
| 'ad_loaded' // When advertisement has been loaded
|
|
23
21
|
| 'ad_skipped' // When user skipped current advertisement
|
|
24
|
-
| 'ad_start' // When advertisement has been started
|
|
25
|
-
| 'ad_stop' // When advertisement has been stopped
|
|
26
22
|
| 'app_exception' // When application throws an error
|
|
27
23
|
| 'rate_content' // When user rates an asset
|
|
28
24
|
);
|
|
@@ -42,7 +38,6 @@ export type SessionInfo = {
|
|
|
42
38
|
referrer: string,
|
|
43
39
|
engagementTime: number | undefined,
|
|
44
40
|
sessionStarted: boolean,
|
|
45
|
-
isAuthenticated: '0' | '1',
|
|
46
41
|
firstEvent: boolean,
|
|
47
42
|
firstVisit: boolean,
|
|
48
43
|
};
|
|
@@ -2,7 +2,7 @@ import { Storage } from '@24i/bigscreen-sdk/storage';
|
|
|
2
2
|
import { MINUTE_IN_MS } from '@24i/bigscreen-sdk/utils/timeConstants';
|
|
3
3
|
import { createTimeout } from '@24i/bigscreen-sdk/utils/timers';
|
|
4
4
|
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
5
|
-
import {
|
|
5
|
+
import { findIdForLanguage } from './findIdForLanguage';
|
|
6
6
|
import {
|
|
7
7
|
BIGSCREEN_APP_TYPE,
|
|
8
8
|
BIGSCREEN_OTT_TYPE,
|
|
@@ -18,8 +18,8 @@ import type {
|
|
|
18
18
|
TealiumAnalyticsConfiguration,
|
|
19
19
|
TeaResult,
|
|
20
20
|
TealiumDataMapper,
|
|
21
|
+
TealiumCustomConfiguration,
|
|
21
22
|
CustomMappers,
|
|
22
|
-
TeaDynamicCoreResult,
|
|
23
23
|
} from './types';
|
|
24
24
|
|
|
25
25
|
// eslint-disable-next-line no-magic-numbers
|
|
@@ -30,7 +30,11 @@ const TEALIUM_BASE_URL = 'https://collect.tealiumiq.com/event';
|
|
|
30
30
|
const DEFAULT_PAYLOAD: TeaStaticCoreResult = {
|
|
31
31
|
tealium_account: '',
|
|
32
32
|
tealium_profile: '',
|
|
33
|
+
language: '',
|
|
34
|
+
language_service: '',
|
|
33
35
|
entity: '',
|
|
36
|
+
property_id: '',
|
|
37
|
+
short_language_service: '',
|
|
34
38
|
platform_short: BIGSCREEN_PLATFORM_SHORT,
|
|
35
39
|
platform_type: BIGSCREEN_PLATFORM_TYPE,
|
|
36
40
|
app_type: BIGSCREEN_APP_TYPE,
|
|
@@ -74,38 +78,32 @@ export class TealiumAnalytics implements AnalyticsClient {
|
|
|
74
78
|
datasource,
|
|
75
79
|
customMappers,
|
|
76
80
|
dataMapper = {} as TealiumDataMapper,
|
|
77
|
-
} = this.config;
|
|
78
|
-
const {
|
|
81
|
+
} = this.config || {} as TealiumCustomConfiguration;
|
|
82
|
+
const {
|
|
83
|
+
entity,
|
|
84
|
+
property_ids: propertyIds,
|
|
85
|
+
language,
|
|
86
|
+
short_language_service: shortLanguageService,
|
|
87
|
+
platform_short: platformShort,
|
|
88
|
+
platform_type: platformType,
|
|
89
|
+
app_type: appType,
|
|
90
|
+
} = dataMapper || {} as TealiumDataMapper;
|
|
79
91
|
this.customMappers = customMappers;
|
|
80
92
|
this.constantPayload = {
|
|
81
93
|
tealium_account: account,
|
|
82
94
|
tealium_profile: profile,
|
|
83
95
|
tealium_environment: environment,
|
|
84
|
-
entity,
|
|
85
96
|
...(datasource && { tealium_datasource: datasource }),
|
|
97
|
+
language: language || '',
|
|
98
|
+
language_service: `${entity} ${language}`,
|
|
99
|
+
entity,
|
|
100
|
+
property_id: findIdForLanguage(propertyIds, language || '').toString(),
|
|
101
|
+
short_language_service: shortLanguageService || '',
|
|
86
102
|
platform_short: platformShort ?? BIGSCREEN_PLATFORM_SHORT,
|
|
87
103
|
platform_type: platformType ?? BIGSCREEN_PLATFORM_TYPE,
|
|
88
104
|
app_type: appType ?? BIGSCREEN_APP_TYPE,
|
|
89
105
|
ott_type: BIGSCREEN_OTT_TYPE,
|
|
90
|
-
app_id: `${entity} ${
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
getDynamicPayload({ language: payloadLanguage }: AnyPayload): TeaDynamicCoreResult {
|
|
95
|
-
if (!this.config || !this.config.dataMapper) {
|
|
96
|
-
console.warn(`[${this.name}] getDynamicPayload missing configuration`);
|
|
97
|
-
return {
|
|
98
|
-
language: '', language_service: '', property_id: '', short_language_service: '',
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
const { dataMapper } = this.config;
|
|
102
|
-
const { entity, languageMap, propertyIdsMap, shortLanguageServiceMap } = dataMapper;
|
|
103
|
-
const tealiumLanguage = findForLanguage(languageMap, payloadLanguage) || '';
|
|
104
|
-
return {
|
|
105
|
-
language: tealiumLanguage || '',
|
|
106
|
-
language_service: `${entity} ${tealiumLanguage}`,
|
|
107
|
-
property_id: findForLanguage(propertyIdsMap, payloadLanguage) || '',
|
|
108
|
-
short_language_service: findForLanguage(shortLanguageServiceMap, payloadLanguage) || '',
|
|
106
|
+
app_id: `${entity} ${language}:${this.appVersion}`,
|
|
109
107
|
};
|
|
110
108
|
}
|
|
111
109
|
|
|
@@ -159,19 +157,9 @@ export class TealiumAnalytics implements AnalyticsClient {
|
|
|
159
157
|
}
|
|
160
158
|
const eventBody = {
|
|
161
159
|
...this.constantPayload,
|
|
162
|
-
...
|
|
163
|
-
...mappingFunction(triggerName, payload as Payload, this.config),
|
|
160
|
+
...mappingFunction(triggerName, payload as Payload),
|
|
164
161
|
};
|
|
165
|
-
|
|
166
|
-
(acc: any, [key, value]) => {
|
|
167
|
-
if (value != null && value !== '') {
|
|
168
|
-
acc[key] = value;
|
|
169
|
-
}
|
|
170
|
-
return acc;
|
|
171
|
-
},
|
|
172
|
-
{} as TeaResult,
|
|
173
|
-
);
|
|
174
|
-
if (eventBody) await this.sendEvent(filteredEventBody);
|
|
162
|
+
if (eventBody) await this.sendEvent(eventBody);
|
|
175
163
|
} catch (e) {
|
|
176
164
|
console.warn(`[${this.name}] Error onEvent: `, e);
|
|
177
165
|
}
|
|
@@ -10,7 +10,6 @@ export const BIGSCREEN_PLATFORM_TYPE = 'ott';
|
|
|
10
10
|
|
|
11
11
|
export const TEALIUM_TRIGGERS = [
|
|
12
12
|
// App
|
|
13
|
-
AnalyticsTriggers.APP_OPEN,
|
|
14
13
|
AnalyticsTriggers.APP_CLOSE,
|
|
15
14
|
AnalyticsTriggers.APP_ERROR,
|
|
16
15
|
|
|
@@ -43,7 +42,6 @@ export const TEALIUM_TRIGGERS = [
|
|
|
43
42
|
];
|
|
44
43
|
|
|
45
44
|
export const AppEvents = {
|
|
46
|
-
[AnalyticsTriggers.APP_OPEN]: '',
|
|
47
45
|
[AnalyticsTriggers.SCENE_VIEW]: '',
|
|
48
46
|
[AnalyticsTriggers.PLAYBACK_10]: 'media_milestone_10_video',
|
|
49
47
|
[AnalyticsTriggers.PLAYBACK_50]: 'media_milestone_50_video',
|
|
@@ -52,7 +50,7 @@ export const AppEvents = {
|
|
|
52
50
|
[AnalyticsTriggers.PLAYBACK_PAUSE]: 'video_pause',
|
|
53
51
|
[AnalyticsTriggers.PLAYBACK_UNPAUSE]: 'video_resume',
|
|
54
52
|
[AnalyticsTriggers.PLAYBACK_START]: 'video_play',
|
|
55
|
-
[AnalyticsTriggers.PLAYER_OPEN]: '
|
|
53
|
+
[AnalyticsTriggers.PLAYER_OPEN]: 'player_x',
|
|
56
54
|
[AnalyticsTriggers.PLAYER_CLOSE]: 'player_x',
|
|
57
55
|
[AnalyticsTriggers.FAVORITE_ADD]: 'subscribe_to_fav',
|
|
58
56
|
[AnalyticsTriggers.FAVORITE_REMOVE]: 'subscribe_to_fav',
|
|
@@ -63,7 +61,6 @@ export const AppEvents = {
|
|
|
63
61
|
} as const;
|
|
64
62
|
|
|
65
63
|
export enum EVENTS {
|
|
66
|
-
APP_OPEN = 'app_open',
|
|
67
64
|
SCENE_VIEW = 'scene_view',
|
|
68
65
|
VIDEO_PROGRESS = 'video_progress',
|
|
69
66
|
VIDEO_START = 'video_start',
|
|
@@ -85,7 +82,6 @@ export enum TrackEventType {
|
|
|
85
82
|
}
|
|
86
83
|
|
|
87
84
|
export const TRIGGER_NAME_TO_TEALIUM_EVENTS: { [K in AnalyticsTriggers]?: EVENTS[]; } = {
|
|
88
|
-
[AnalyticsTriggers.APP_OPEN]: [EVENTS.APP_OPEN],
|
|
89
85
|
[AnalyticsTriggers.SCENE_VIEW]: [EVENTS.SCENE_VIEW],
|
|
90
86
|
[AnalyticsTriggers.PLAYBACK_10]: [EVENTS.VIDEO_PROGRESS],
|
|
91
87
|
[AnalyticsTriggers.PLAYBACK_50]: [EVENTS.VIDEO_PROGRESS],
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { PropertyIds } from '@24i/bigscreen-sdk/analytics/TealiumAnalytics';
|
|
2
|
+
|
|
3
|
+
export const findIdForLanguage = (
|
|
4
|
+
property_ids: PropertyIds = {},
|
|
5
|
+
language: string,
|
|
6
|
+
): number => {
|
|
7
|
+
const languageKey = Object.keys(property_ids).find((key) => key.endsWith(language));
|
|
8
|
+
return languageKey ? property_ids[languageKey] : -1;
|
|
9
|
+
};
|
|
@@ -13,12 +13,10 @@ import { mapFavoriteRemove } from './mappers/mapFavoriteRemove';
|
|
|
13
13
|
import { mapVideoResume } from './mappers/mapVideoResume';
|
|
14
14
|
import { mapSearchSuccess } from './mappers/mapSearchSuccess';
|
|
15
15
|
import { mapSearchFailed } from './mappers/mapSearchFailed';
|
|
16
|
-
import { mapAppError } from './mappers/mapAppError';
|
|
17
|
-
import { mapAppOpen } from './mappers/mapAppOpen';
|
|
18
16
|
import { EventMappingFunction } from './types';
|
|
17
|
+
import { mapAppError } from './mappers/mapAppError';
|
|
19
18
|
|
|
20
19
|
export const EVENTS_MAPPING: Record<EVENTS, EventMappingFunction> = {
|
|
21
|
-
[EVENTS.APP_OPEN]: mapAppOpen,
|
|
22
20
|
[EVENTS.SCENE_VIEW]: mapSceneView,
|
|
23
21
|
[EVENTS.PLAYER_OPEN]: mapPlayerOpen,
|
|
24
22
|
[EVENTS.PLAYER_CLOSE]: mapPlayerClose,
|
|
@@ -6,14 +6,15 @@ export const MEDIA_PAYLOAD: Payload = {
|
|
|
6
6
|
title: 'Test Video',
|
|
7
7
|
url: 'https://example.com/video',
|
|
8
8
|
contentType: 'video/mp4',
|
|
9
|
+
externalId: '',
|
|
9
10
|
percent: 2,
|
|
10
11
|
provider: 'provider',
|
|
11
12
|
assetId: '12345',
|
|
12
13
|
app_id: 'app_id',
|
|
13
14
|
app_type: 'html5',
|
|
14
|
-
sceneName: '
|
|
15
|
-
sceneId: '
|
|
16
|
-
sceneType: '
|
|
15
|
+
sceneName: '',
|
|
16
|
+
sceneId: '',
|
|
17
|
+
sceneType: '',
|
|
17
18
|
sessionId: 1,
|
|
18
19
|
sessionNumber: 1,
|
|
19
20
|
userId: '10',
|
|
@@ -24,22 +25,18 @@ export const MEDIA_PAYLOAD: Payload = {
|
|
|
24
25
|
deviceType: 'smarttv',
|
|
25
26
|
searchTerm: '',
|
|
26
27
|
itemId: '',
|
|
27
|
-
pubDate: '2012/02/12',
|
|
28
28
|
message: 'error message',
|
|
29
29
|
section: 'BROWSE',
|
|
30
|
-
subcontentType: '
|
|
31
|
-
seriesTitle: 'section',
|
|
32
|
-
language: 'en',
|
|
33
|
-
resolution: '1920x1080',
|
|
30
|
+
subcontentType: '',
|
|
34
31
|
};
|
|
35
32
|
|
|
36
33
|
export const TEALIUM_PAGEINFO_PAYLOAD = {
|
|
37
|
-
categories: '
|
|
34
|
+
categories: '',
|
|
38
35
|
content_type: 'video',
|
|
39
|
-
page_name: '
|
|
40
|
-
page_title: '
|
|
41
|
-
section: '
|
|
42
|
-
subcontent_type: '
|
|
36
|
+
page_name: '',
|
|
37
|
+
page_title: '',
|
|
38
|
+
section: '',
|
|
39
|
+
subcontent_type: '',
|
|
43
40
|
};
|
|
44
41
|
|
|
45
42
|
export const TEALIUM_STATIC_CORE_PAYLOAD = {
|
|
@@ -47,7 +44,7 @@ export const TEALIUM_STATIC_CORE_PAYLOAD = {
|
|
|
47
44
|
tealium_profile: 'main',
|
|
48
45
|
tealium_environment: 'dev',
|
|
49
46
|
tealium_datasource: 'abc',
|
|
50
|
-
app_id: 'auto
|
|
47
|
+
app_id: 'auto english:v1.0-test',
|
|
51
48
|
app_type: 'html5',
|
|
52
49
|
entity: 'auto',
|
|
53
50
|
language: 'english',
|
|
@@ -64,9 +61,10 @@ export const TEALIUM_MEDIA_PAYLOAD = {
|
|
|
64
61
|
byline: 'N/A',
|
|
65
62
|
canonical_url: 'https://example.com/video',
|
|
66
63
|
media_type: 'video/mp4',
|
|
67
|
-
pub_date: '
|
|
64
|
+
pub_date: '',
|
|
65
|
+
tags: '',
|
|
68
66
|
video_length: 120,
|
|
69
67
|
video_name: 'Test Video',
|
|
70
68
|
video_position: 60,
|
|
71
|
-
video_series_title: '
|
|
69
|
+
video_series_title: '',
|
|
72
70
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
|
|
2
2
|
import { AppEvents, EVENTS, TrackEventType as TrackEventTypeEnum } from './constants';
|
|
3
3
|
import type {
|
|
4
|
-
UserInfo,
|
|
4
|
+
UserInfo, AppInfo, VideoProgress, SceneInfo, PlayerSession, ErrorInfo,
|
|
5
5
|
} from '../../interface';
|
|
6
6
|
|
|
7
7
|
export type TeaEventType = 'view' | 'link';
|
|
@@ -12,20 +12,20 @@ type TeaTrackEventType = `${TrackEventTypeEnum}`;
|
|
|
12
12
|
type TeaAppEventValues = typeof AppEvents[keyof typeof AppEvents];
|
|
13
13
|
type TeaAnalyticsTriggerValues = `${AnalyticsTriggers}`;
|
|
14
14
|
|
|
15
|
-
export interface
|
|
16
|
-
[key: string]:
|
|
15
|
+
export interface PropertyIds {
|
|
16
|
+
[key: string]: number;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export type CustomMappers = Partial<Record<EVENTS, EventMappingFunction>>;
|
|
20
20
|
|
|
21
21
|
export type TealiumDataMapper = {
|
|
22
|
-
|
|
22
|
+
app_type: TeaAppType, // e.g. 'html5' for bigscreen
|
|
23
23
|
entity: string, // e.g: 'rfe'
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
property_ids: PropertyIds, // e.g: 414
|
|
25
|
+
language?: string, // e.g: 'english'
|
|
26
|
+
platform_short?: string,
|
|
27
|
+
platform_type?: string,
|
|
28
|
+
short_language_service?: string, // e.g: 'eng'
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
export type TealiumCustomConfiguration = {
|
|
@@ -71,7 +71,6 @@ export type SubPageInfo = {
|
|
|
71
71
|
};
|
|
72
72
|
|
|
73
73
|
export type Payload = CorePayload &
|
|
74
|
-
GeneralAppData &
|
|
75
74
|
AppInfo &
|
|
76
75
|
SceneInfo &
|
|
77
76
|
SubPageInfo &
|
|
@@ -84,17 +83,9 @@ ErrorInfo;
|
|
|
84
83
|
|
|
85
84
|
export type EventMappingFunction = (
|
|
86
85
|
triggerName: AnalyticsTriggers,
|
|
87
|
-
payload: Payload
|
|
88
|
-
config?: TealiumAnalyticsConfiguration,
|
|
86
|
+
payload: Payload
|
|
89
87
|
) => TeaResult;
|
|
90
88
|
|
|
91
|
-
export type TeaDynamicCoreResult = {
|
|
92
|
-
language: string;
|
|
93
|
-
language_service: string;
|
|
94
|
-
property_id: string;
|
|
95
|
-
short_language_service: string;
|
|
96
|
-
};
|
|
97
|
-
|
|
98
89
|
export type TeaStaticCoreResult = {
|
|
99
90
|
tealium_account: string,
|
|
100
91
|
tealium_profile: string,
|
|
@@ -104,9 +95,13 @@ export type TeaStaticCoreResult = {
|
|
|
104
95
|
app_id: string;
|
|
105
96
|
app_type: TeaAppType;
|
|
106
97
|
entity: string;
|
|
98
|
+
language: string;
|
|
99
|
+
language_service: string;
|
|
107
100
|
ott_type: TeaOttType;
|
|
108
101
|
platform_short: string;
|
|
109
102
|
platform_type: string;
|
|
103
|
+
property_id: string;
|
|
104
|
+
short_language_service: string;
|
|
110
105
|
};
|
|
111
106
|
|
|
112
107
|
export type TeaCoreResult = {
|
|
@@ -14,19 +14,25 @@ import { CorePayload, DeviceInfo, EventBody, Payload, SessionInfo } from './type
|
|
|
14
14
|
// eslint-disable-next-line no-magic-numbers
|
|
15
15
|
const SESSION_TIMEOUT = 30 * MINUTE_IN_MS;
|
|
16
16
|
|
|
17
|
-
const
|
|
17
|
+
const TWENYFOURIQ_SESSION_COUNTER = '24iQ_session_counter';
|
|
18
18
|
|
|
19
19
|
export class TwentyFourIQClient implements AnalyticsClient {
|
|
20
20
|
name = '24iQ';
|
|
21
21
|
|
|
22
|
+
deviceInfo = {
|
|
23
|
+
manufacturer: '',
|
|
24
|
+
platform: '',
|
|
25
|
+
platformVersion: '',
|
|
26
|
+
deviceId: '',
|
|
27
|
+
appVersion: '',
|
|
28
|
+
applicationId: '',
|
|
29
|
+
deviceType: '',
|
|
30
|
+
};
|
|
31
|
+
|
|
22
32
|
constantPayload: CorePayload & SessionInfo & DeviceInfo = {
|
|
23
33
|
sessionNumber: 0,
|
|
24
34
|
sessionId: 0,
|
|
25
|
-
|
|
26
|
-
deviceId: '',
|
|
27
|
-
manufacturer: '',
|
|
28
|
-
platform: '',
|
|
29
|
-
deviceModel: '',
|
|
35
|
+
...this.deviceInfo,
|
|
30
36
|
};
|
|
31
37
|
|
|
32
38
|
sessionTimeout = createTimeout();
|
|
@@ -40,21 +46,24 @@ export class TwentyFourIQClient implements AnalyticsClient {
|
|
|
40
46
|
}
|
|
41
47
|
|
|
42
48
|
async init() {
|
|
43
|
-
this.
|
|
44
|
-
this.
|
|
45
|
-
this.
|
|
46
|
-
this.
|
|
47
|
-
this.constantPayload.appVersion = this.appVersion;
|
|
49
|
+
this.deviceInfo.manufacturer = await device.getManufacturerName();
|
|
50
|
+
this.deviceInfo.platform = await device.getPlatformName();
|
|
51
|
+
this.deviceInfo.platformVersion = await device.getPlatformVersion();
|
|
52
|
+
this.deviceInfo.deviceId = await device.getUuid();
|
|
48
53
|
await this.startSession();
|
|
49
54
|
}
|
|
50
55
|
|
|
51
56
|
async startSession() {
|
|
52
57
|
const sessionNumber = parseInt(
|
|
53
|
-
await Storage.getItem(
|
|
58
|
+
await Storage.getItem(TWENYFOURIQ_SESSION_COUNTER) ?? '0', 10,
|
|
54
59
|
) + 1;
|
|
55
60
|
this.constantPayload.sessionNumber = sessionNumber;
|
|
56
61
|
this.constantPayload.sessionId = generateSessionId();
|
|
57
|
-
|
|
62
|
+
this.constantPayload.manufacturer = this.deviceInfo.manufacturer;
|
|
63
|
+
this.constantPayload.platform = this.deviceInfo.platform;
|
|
64
|
+
this.constantPayload.platformVersion = this.deviceInfo.platformVersion;
|
|
65
|
+
this.constantPayload.appVersion = this.appVersion;
|
|
66
|
+
await Storage.setItem(TWENYFOURIQ_SESSION_COUNTER, sessionNumber.toString());
|
|
58
67
|
this.isSessionActive = true;
|
|
59
68
|
this.setSessionTimeout();
|
|
60
69
|
}
|
|
@@ -54,12 +54,8 @@ export const TWENTY_FOUR_IQ_TRIGGERS = [
|
|
|
54
54
|
AnalyticsTriggers.SCROLL_90,
|
|
55
55
|
|
|
56
56
|
// Ads
|
|
57
|
-
AnalyticsTriggers.
|
|
58
|
-
AnalyticsTriggers.AD_COMPLETE,
|
|
59
|
-
AnalyticsTriggers.AD_ERROR,
|
|
57
|
+
AnalyticsTriggers.AD_LOADED,
|
|
60
58
|
AnalyticsTriggers.AD_SKIPPED,
|
|
61
|
-
AnalyticsTriggers.AD_START,
|
|
62
|
-
AnalyticsTriggers.AD_STOP,
|
|
63
59
|
];
|
|
64
60
|
|
|
65
61
|
export enum EVENTS {
|
|
@@ -73,12 +69,8 @@ export enum EVENTS {
|
|
|
73
69
|
PLAYER_CLOSE = 'player_close',
|
|
74
70
|
PLAYER_OPEN = 'player_open',
|
|
75
71
|
SCROLL = 'scroll',
|
|
76
|
-
|
|
77
|
-
AD_COMPLETE = 'ad_complete',
|
|
78
|
-
AD_ERROR = 'ad_error',
|
|
72
|
+
AD_LOADED = 'ad_loaded',
|
|
79
73
|
AD_SKIPPED = 'ad_skipped',
|
|
80
|
-
AD_START = 'ad_start',
|
|
81
|
-
AD_STOP = 'ad_stop',
|
|
82
74
|
}
|
|
83
75
|
|
|
84
76
|
export const TRIGGER_NAME_TO_24IQ_EVENTS: { [K in AnalyticsTriggers]?: EVENTS[]; } = {
|
|
@@ -100,12 +92,8 @@ export const TRIGGER_NAME_TO_24IQ_EVENTS: { [K in AnalyticsTriggers]?: EVENTS[];
|
|
|
100
92
|
[AnalyticsTriggers.SCROLL_75]: [EVENTS.SCROLL],
|
|
101
93
|
[AnalyticsTriggers.SCROLL_90]: [EVENTS.SCROLL],
|
|
102
94
|
[AnalyticsTriggers.APP_CLOSE]: [EVENTS.VIDEO_STOP, EVENTS.PLAYER_CLOSE],
|
|
103
|
-
[AnalyticsTriggers.
|
|
104
|
-
[AnalyticsTriggers.AD_COMPLETE]: [EVENTS.AD_COMPLETE],
|
|
105
|
-
[AnalyticsTriggers.AD_ERROR]: [EVENTS.AD_ERROR],
|
|
95
|
+
[AnalyticsTriggers.AD_LOADED]: [EVENTS.AD_LOADED],
|
|
106
96
|
[AnalyticsTriggers.AD_SKIPPED]: [EVENTS.AD_SKIPPED],
|
|
107
|
-
[AnalyticsTriggers.AD_START]: [EVENTS.AD_START],
|
|
108
|
-
[AnalyticsTriggers.AD_STOP]: [EVENTS.AD_STOP],
|
|
109
97
|
};
|
|
110
98
|
|
|
111
99
|
export const HUNDRED_PERCENT = 100;
|