@24i/bigscreen-sdk 1.0.54-alpha.2835 → 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.
Files changed (105) hide show
  1. package/.vscode/settings.json +6 -0
  2. package/README.md +3 -2
  3. package/package.json +10 -10
  4. package/packages/analytics/src/clients/GoogleAnalytics/GoogleAnalytics.ts +14 -10
  5. package/packages/analytics/src/clients/GoogleAnalytics/constants.ts +2 -10
  6. package/packages/analytics/src/clients/GoogleAnalytics/interface.ts +1 -6
  7. package/packages/analytics/src/clients/GoogleAnalytics/mapPayload.ts +0 -1
  8. package/packages/analytics/src/clients/TealiumAnalytics/TealiumAnalytics.ts +24 -36
  9. package/packages/analytics/src/clients/TealiumAnalytics/constants.ts +1 -5
  10. package/packages/analytics/src/clients/TealiumAnalytics/findIdForLanguage.ts +9 -0
  11. package/packages/analytics/src/clients/TealiumAnalytics/index.ts +1 -1
  12. package/packages/analytics/src/clients/TealiumAnalytics/interface.ts +1 -3
  13. package/packages/analytics/src/clients/TealiumAnalytics/mappers/__mocks__/mediaPayload.ts +14 -16
  14. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSceneView.ts +1 -1
  15. package/packages/analytics/src/clients/TealiumAnalytics/types.ts +14 -19
  16. package/packages/analytics/src/clients/TwentyFourIQ/TwentyFourIQClient.ts +22 -13
  17. package/packages/analytics/src/clients/TwentyFourIQ/constants.ts +3 -15
  18. package/packages/analytics/src/clients/TwentyFourIQ/interface.ts +4 -7
  19. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdLoaded.ts +13 -0
  20. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdSkipped.ts +16 -0
  21. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBase.ts +3 -6
  22. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBuffering.ts +2 -2
  23. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerClose.ts +3 -4
  24. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerOpen.ts +3 -2
  25. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapSceneView.ts +2 -2
  26. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapScroll.ts +2 -2
  27. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoComplete.ts +3 -4
  28. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoPause.ts +3 -4
  29. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoProgress.ts +3 -4
  30. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStart.ts +2 -2
  31. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStop.ts +2 -2
  32. package/packages/analytics/src/clients/TwentyFourIQ/types.ts +28 -45
  33. package/packages/create-package/dist/createPackage.js +66 -0
  34. package/packages/create-package/dist/createPackage.js.map +1 -0
  35. package/packages/create-package/dist/index.js +5 -0
  36. package/packages/create-package/dist/index.js.map +1 -0
  37. package/packages/create-package/dist/questionnaire/questions.js +35 -0
  38. package/packages/create-package/dist/questionnaire/questions.js.map +1 -0
  39. package/packages/create-package/dist/settings/Settings.js +10 -0
  40. package/packages/create-package/dist/settings/Settings.js.map +1 -0
  41. package/packages/create-package/dist/types.js +3 -0
  42. package/packages/create-package/dist/types.js.map +1 -0
  43. package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoProvider.ts +2 -23
  44. package/packages/developer-tools/src/TechnicalInfo/__mocks__/Device.ts +0 -8
  45. package/packages/developer-tools/src/TechnicalInfo/translations.ts +0 -4
  46. package/packages/driver-androidtv/src/DeviceAndroidTV.ts +0 -38
  47. package/packages/driver-androidtv/src/__mocks__/javaScriptBridge.ts +0 -9
  48. package/packages/driver-androidtv/src/index.ts +0 -1
  49. package/packages/driver-androidtv/src/types.ts +0 -42
  50. package/packages/driver-base/src/DeviceBase.ts +0 -19
  51. package/packages/driver-base/src/__mocks__/DeviceBase.ts +0 -24
  52. package/packages/driver-base/src/index.ts +0 -3
  53. package/packages/driver-browser/src/DeviceBrowser.ts +0 -26
  54. package/packages/driver-entone/src/DeviceEntone.ts +1 -31
  55. package/packages/driver-firetv/src/DeviceFireTV.ts +1 -74
  56. package/packages/driver-firetv/src/__mocks__/javaScriptBridge.ts +0 -9
  57. package/packages/driver-hbbtv/src/DeviceHbbTV.ts +0 -26
  58. package/packages/driver-kreatv/src/DeviceKreaTV.ts +0 -26
  59. package/packages/driver-saphi/src/DeviceSaphi.ts +0 -26
  60. package/packages/driver-smartcast/src/DeviceSmartCast.ts +1 -78
  61. package/packages/driver-smartcast/src/__mocks__/api.ts +2 -32
  62. package/packages/driver-smartcast/src/types.ts +2 -48
  63. package/packages/driver-tizen/src/DeviceTizen.ts +7 -126
  64. package/packages/driver-tizen/src/ITizen.ts +202 -15116
  65. package/packages/driver-tizen/src/IWebapis.ts +87 -8643
  66. package/packages/driver-tizen/src/TizenKeys.ts +2 -2
  67. package/packages/driver-tizen/src/__mocks__/tizen.ts +8 -7
  68. package/packages/driver-tizen/src/constants.ts +195 -1
  69. package/packages/driver-tizen/src/types.ts +14 -0
  70. package/packages/driver-vidaa/src/DeviceVidaa.ts +0 -26
  71. package/packages/driver-webos/src/DeviceWebos.ts +0 -47
  72. package/packages/driver-webos/src/__mocks__/webos.ts +0 -33
  73. package/packages/driver-webos/src/constants.ts +0 -1
  74. package/packages/driver-webos/src/types.ts +0 -30
  75. package/packages/driver-xbox/src/DeviceXbox.ts +1 -30
  76. package/packages/grid/src/UnifiedGridController/UnifiedGridController.ts +6 -6
  77. package/packages/input/README.md +3 -0
  78. package/packages/input/src/Input.tsx +62 -26
  79. package/packages/input/src/utils.ts +71 -0
  80. package/packages/keyboard/src/WhitelabelKeyboard/layouts/index.ts +0 -1
  81. package/packages/keyboard/src/utils/caret.ts +8 -5
  82. package/packages/keyboard/src/utils/input.ts +6 -5
  83. package/packages/list/src/BasicList/BasicList.tsx +7 -7
  84. package/packages/list/src/CenteredList/CenteredList.tsx +2 -2
  85. package/packages/list/src/EdgeOffsetList/EdgeOffsetList.tsx +7 -7
  86. package/packages/list/src/FirstOnlyList/FirstOnlyList.tsx +2 -2
  87. package/packages/list/src/FirstOnlyVariedList/FirstOnlyVariedList.tsx +2 -2
  88. package/packages/list/src/FixedToEndList/FixedToEndList.tsx +2 -2
  89. package/packages/list/src/interface.ts +2 -2
  90. package/packages/logger/src/loggers/ConsoleLogger/ConsoleLogger.ts +1 -7
  91. package/packages/logger/src/loggers/SentryLogger/SentryLogger.ts +1 -3
  92. package/packages/router/README.md +0 -1
  93. package/packages/router/src/Router.tsx +1 -4
  94. package/packages/router/src/utils.ts +1 -1
  95. package/utils/release/release.ts +5 -7
  96. package/ci/is_ci_job_skippable.sh +0 -153
  97. package/packages/analytics/src/clients/TealiumAnalytics/findForLanguage.ts +0 -9
  98. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppOpen.ts +0 -13
  99. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdEvent.ts +0 -20
  100. package/packages/driver-base/src/types/AdInfo.ts +0 -5
  101. package/packages/driver-base/src/types/InAppPurchase.ts +0 -25
  102. package/packages/driver-firetv/src/types.ts +0 -1
  103. package/packages/input/src/handleOverflow.ts +0 -29
  104. package/packages/keyboard/src/WhitelabelKeyboard/layouts/spanish.ts +0 -26
  105. package/packages/keyboard/src/utils/setInputSelectionRange.ts +0 -10
@@ -0,0 +1,6 @@
1
+ {
2
+ "cSpell.words": [
3
+ "MEDIAPAYLOAD",
4
+ "Tealium"
5
+ ]
6
+ }
package/README.md CHANGED
@@ -6,8 +6,9 @@ sidebar_label: README
6
6
  ---
7
7
 
8
8
  # SmartApps BIGscreen SDK
9
- [![Build Status](https://github.com/24i/smartapps-bigscreen-sdk/actions/workflows/pull-request.yml/badge.svg)](https://github.com/24i/smartapps-bigscreen-sdk/actions/workflows/pull-request.yml)
10
- [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=24i_smartapps-bigscreen-sdk&metric=coverage&token=3d35c42d12a876ed9fde3dd5adba282b14656069)](https://sonarcloud.io/summary/new_code?id=24i_smartapps-bigscreen-sdk)
9
+
10
+ [![Build Status](https://travis-ci.com/24i/smartapps-bigscreen-sdk.svg?token=TvpGGSB2Z1L12QwPagEp&branch=development)](https://travis-ci.com/24i/smartapps-bigscreen-sdk)
11
+ [![Coverage Status](https://coveralls.io/repos/github/24i/smartapps-bigscreen-sdk/badge.svg?branch=development&t=8n9LTd&kill_cache=1)](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.54-alpha.2835",
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.24",
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.1.0",
45
- "@24i/smartapps-datalayer": "3.0.24",
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.6",
58
- "@babel/preset-env": "^7.24.6",
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.13.0",
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.23",
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.77.4",
82
+ "sass": "^1.76.0",
83
83
  "sass-true": "^8.0.0",
84
- "ts-jest": "^29.1.4",
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, AnyPayload } from '../../interface';
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
- payload!, index === 0 ? engagementTime : undefined,
126
+ index === 0 ? engagementTime : undefined,
127
127
  );
128
- const gtagPayload = mapPayload(event, triggerName, { ...payload, ...sessionInfo });
129
- const urlParams = mapEventParamsToUrlParams({ ...sessionInfo, ...payload });
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.AD_BUFFERING,
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.AD_BUFFERING]: ['ad_buffering'],
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
- | 'ad_buffering' // When advertisement is buffering
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
  };
@@ -8,7 +8,6 @@ const map: Record<string, string> = {
8
8
  referrer: 'dr',
9
9
  sceneId: 'dl',
10
10
  sceneName: 'dt',
11
- isAuthenticated: 'up.is_authenticated',
12
11
  };
13
12
 
14
13
  export const mapEventParamsToUrlParams = (eventParams: Record<string, any>)
@@ -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 { findForLanguage } from './findForLanguage';
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 { entity, platformShort, platformType, appType } = dataMapper;
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} ${appType ?? BIGSCREEN_APP_TYPE} : ${this.appVersion}`,
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
- ...this.getDynamicPayload(payload),
163
- ...mappingFunction(triggerName, payload as Payload, this.config),
160
+ ...mappingFunction(triggerName, payload as Payload),
164
161
  };
165
- const filteredEventBody: TeaResult = Object.entries(eventBody).reduce(
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]: '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
+ };
@@ -1,4 +1,4 @@
1
1
  export { TealiumAnalytics } from './TealiumAnalytics';
2
- export { findForLanguage } from './findForLanguage';
2
+ export { findIdForLanguage } from './findIdForLanguage';
3
3
  export * from './constants';
4
4
  export * from './types';
@@ -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: 'pageName',
15
- sceneId: 'categories',
16
- sceneType: 'vod',
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: 'section',
31
- seriesTitle: 'section',
32
- language: 'en',
33
- resolution: '1920x1080',
30
+ subcontentType: '',
34
31
  };
35
32
 
36
33
  export const TEALIUM_PAGEINFO_PAYLOAD = {
37
- categories: 'categories',
34
+ categories: '',
38
35
  content_type: 'video',
39
- page_name: 'pageName',
40
- page_title: 'pageName',
41
- section: 'section',
42
- subcontent_type: 'section',
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 html5 : v1.0-test',
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: '2012/02/12',
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: 'section',
69
+ video_series_title: '',
72
70
  };
@@ -3,7 +3,7 @@ import { Payload, TeaSceneViewResult } from '../types';
3
3
  import { TrackEventType } from '../constants';
4
4
 
5
5
  export const mapSceneView = (
6
- _: AnalyticsTriggers,
6
+ triggerName: AnalyticsTriggers,
7
7
  payload: Payload,
8
8
  ): TeaSceneViewResult => ({
9
9
  app_events: '',
@@ -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, GeneralAppData, AppInfo, VideoProgress, SceneInfo, PlayerSession, ErrorInfo,
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 LanguageMapper {
16
- [key: string]: 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
- appType?: TeaAppType,
22
+ app_type: TeaAppType, // e.g. 'html5' for bigscreen
23
23
  entity: string, // e.g: 'rfe'
24
- platformShort?: string,
25
- platformType?: string,
26
- languageMap: LanguageMapper, // e.g: 'english'
27
- propertyIdsMap: LanguageMapper, // e.g: 414
28
- shortLanguageServiceMap: LanguageMapper, // e.g: 'eng'
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 TWENTY_FOUR_IQ_SESSION_COUNTER = '24iQ_session_counter';
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
- appVersion: '',
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.constantPayload.deviceId = await device.getUuid();
44
- this.constantPayload.manufacturer = await device.getManufacturerName();
45
- this.constantPayload.platform = await device.getPlatformName();
46
- this.constantPayload.deviceModel = await device.getModelName();
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(TWENTY_FOUR_IQ_SESSION_COUNTER) ?? '0', 10,
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
- await Storage.setItem(TWENTY_FOUR_IQ_SESSION_COUNTER, sessionNumber.toString());
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.AD_BUFFERING,
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
- AD_BUFFERING = 'ad_buffering',
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.AD_BUFFERING]: [EVENTS.AD_BUFFERING],
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;