@24i/bigscreen-sdk 1.0.4 → 1.0.5-4.alpha-2832

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 (292) hide show
  1. package/README.md +2 -3
  2. package/ci/is_ci_job_skippable.sh +153 -0
  3. package/package.json +55 -34
  4. package/packages/adobe-heartbeat/src/AdobeHeartbeat.ts +9 -9
  5. package/packages/analytics/README.md +8 -0
  6. package/packages/analytics/src/A.ts +1 -0
  7. package/packages/analytics/src/Analytics.ts +1 -0
  8. package/packages/analytics/src/analyticsOnScroll.ts +1 -0
  9. package/packages/analytics/src/clients/ConsoleAnalytics/ConsoleAnalytics.ts +1 -0
  10. package/packages/analytics/src/clients/ConsoleAnalytics/index.ts +1 -0
  11. package/packages/analytics/src/clients/GoogleAnalytics/GoogleAnalytics.ts +196 -0
  12. package/packages/analytics/src/clients/GoogleAnalytics/constants.ts +126 -0
  13. package/packages/analytics/src/clients/GoogleAnalytics/getUrl.ts +17 -0
  14. package/packages/analytics/src/clients/GoogleAnalytics/index.ts +2 -0
  15. package/packages/analytics/src/clients/GoogleAnalytics/interface.ts +82 -0
  16. package/packages/analytics/src/clients/GoogleAnalytics/mapPayload.ts +51 -0
  17. package/packages/analytics/src/clients/GoogleAnalytics/prepareBody.ts +14 -0
  18. package/packages/analytics/src/clients/TealiumAnalytics/TealiumAnalytics.ts +181 -0
  19. package/packages/analytics/src/clients/TealiumAnalytics/constants.ts +106 -0
  20. package/packages/analytics/src/clients/TealiumAnalytics/findForLanguage.ts +9 -0
  21. package/packages/analytics/src/clients/TealiumAnalytics/index.ts +4 -0
  22. package/packages/analytics/src/clients/TealiumAnalytics/interface.ts +35 -0
  23. package/packages/analytics/src/clients/TealiumAnalytics/mappers/__mocks__/mediaPayload.ts +72 -0
  24. package/packages/analytics/src/clients/TealiumAnalytics/mappers/helper.ts +36 -0
  25. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppError.ts +13 -0
  26. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppOpen.ts +13 -0
  27. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteAdd.ts +11 -0
  28. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteRemove.ts +11 -0
  29. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerClose.ts +15 -0
  30. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerOpen.ts +15 -0
  31. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSceneView.ts +18 -0
  32. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearch.ts +18 -0
  33. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchFailed.ts +8 -0
  34. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchSuccess.ts +8 -0
  35. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoPause.ts +15 -0
  36. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoProgress.ts +18 -0
  37. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoResume.ts +15 -0
  38. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStart.ts +15 -0
  39. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStop.ts +15 -0
  40. package/packages/analytics/src/clients/TealiumAnalytics/types.ts +161 -0
  41. package/packages/analytics/src/clients/TwentyFourIQ/TwentyFourIQClient.ts +107 -0
  42. package/packages/analytics/src/clients/TwentyFourIQ/constants.ts +111 -0
  43. package/packages/analytics/src/clients/TwentyFourIQ/helper.ts +34 -0
  44. package/packages/analytics/src/clients/TwentyFourIQ/index.ts +2 -0
  45. package/packages/analytics/src/clients/TwentyFourIQ/interface.ts +34 -0
  46. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdEvent.ts +20 -0
  47. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBase.ts +24 -0
  48. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBuffering.ts +15 -0
  49. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerClose.ts +25 -0
  50. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerOpen.ts +17 -0
  51. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapSceneView.ts +15 -0
  52. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapScroll.ts +17 -0
  53. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoComplete.ts +22 -0
  54. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoPause.ts +25 -0
  55. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoProgress.ts +25 -0
  56. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStart.ts +34 -0
  57. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStop.ts +32 -0
  58. package/packages/analytics/src/clients/TwentyFourIQ/types.ts +132 -0
  59. package/packages/analytics/src/constants.ts +1 -0
  60. package/packages/analytics/src/index.ts +3 -0
  61. package/packages/analytics/src/interface.ts +1 -0
  62. package/packages/analytics/src/utils/generateSessionId.ts +8 -0
  63. package/packages/async-image/src/AsyncImage.tsx +15 -10
  64. package/packages/developer-tools/PlayerDebugWindow/README.md +1 -1
  65. package/packages/developer-tools/src/DeveloperConsole/DeveloperConsole.tsx +1 -0
  66. package/packages/developer-tools/src/DeveloperToolsService/DeveloperToolsList.tsx +11 -0
  67. package/packages/developer-tools/src/PlayerDebugWindow/PlayerDebugWindow.tsx +5 -5
  68. package/packages/developer-tools/src/PlayerDebugWindow/constants.ts +15 -0
  69. package/packages/developer-tools/src/TechnicalInfo/TechnicalInfo.tsx +2 -0
  70. package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoDetail.tsx +2 -1
  71. package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoProvider.ts +57 -5
  72. package/packages/developer-tools/src/TechnicalInfo/__mocks__/Device.ts +12 -0
  73. package/packages/developer-tools/src/TechnicalInfo/translations.ts +8 -0
  74. package/packages/device/src/driver/index.android.tv.ts +1 -0
  75. package/packages/device/src/driver/index.firetv.ts +1 -0
  76. package/packages/device/src/driver/index.smartcast.tv.ts +1 -0
  77. package/packages/device/src/getKeyDigit.ts +2 -2
  78. package/packages/device/src/resolver/resolver.ts +19 -0
  79. package/packages/digital-clock/src/DigitalClock.tsx +15 -4
  80. package/packages/driver-androidtv/src/DeviceAndroidTV.ts +262 -0
  81. package/packages/driver-androidtv/src/__mocks__/javaScriptBridge.ts +45 -0
  82. package/packages/driver-androidtv/src/formatUserAgent.ts +11 -0
  83. package/packages/driver-androidtv/src/index.ts +2 -0
  84. package/packages/driver-androidtv/src/keymap.ts +27 -0
  85. package/packages/driver-androidtv/src/types.ts +155 -0
  86. package/packages/driver-base/src/DeviceBase.ts +73 -2
  87. package/packages/driver-base/src/KeyMap/Key.ts +8 -1
  88. package/packages/driver-base/src/KeyMap/KeyMap.ts +4 -0
  89. package/packages/driver-base/src/KeyMap/interface.ts +1 -0
  90. package/packages/driver-base/src/KeyMap/overrideValues.ts +2 -1
  91. package/packages/driver-base/src/__mocks__/DeviceBase.ts +24 -0
  92. package/packages/driver-base/src/__mocks__/keyMap.ts +1 -0
  93. package/packages/driver-base/src/index.ts +3 -0
  94. package/packages/driver-base/src/types/AdInfo.ts +5 -0
  95. package/packages/driver-base/src/types/DeviceEvent.ts +2 -0
  96. package/packages/driver-base/src/types/InAppPurchase.ts +20 -0
  97. package/packages/driver-base/src/types/KeycodeKeyMap.ts +1 -0
  98. package/packages/driver-browser/src/DeviceBrowser.ts +26 -0
  99. package/packages/driver-browser/src/keymap.ts +8 -0
  100. package/packages/driver-entone/src/DeviceEntone.ts +31 -1
  101. package/packages/driver-entone/src/keymap.ts +1 -0
  102. package/packages/driver-firetv/src/DeviceFireTV.ts +86 -0
  103. package/packages/driver-firetv/src/__mocks__/javaScriptBridge.ts +45 -0
  104. package/packages/driver-firetv/src/index.ts +1 -0
  105. package/packages/driver-firetv/src/types.ts +1 -0
  106. package/packages/driver-hbbtv/src/DeviceHbbTV.ts +26 -0
  107. package/packages/driver-kreatv/src/DeviceKreaTV.ts +26 -0
  108. package/packages/driver-saphi/src/DeviceSaphi.ts +26 -0
  109. package/packages/driver-smartcast/src/DeviceSmartCast.ts +380 -0
  110. package/packages/driver-smartcast/src/__mocks__/api.ts +69 -0
  111. package/packages/driver-smartcast/src/index.ts +1 -0
  112. package/packages/driver-smartcast/src/keymap.ts +9 -0
  113. package/packages/driver-smartcast/src/types.ts +102 -0
  114. package/packages/driver-tizen/src/DeviceTizen.ts +121 -7
  115. package/packages/driver-tizen/src/ITizen.ts +15116 -202
  116. package/packages/driver-tizen/src/IWebapis.ts +8643 -87
  117. package/packages/driver-tizen/src/TizenKeys.ts +4 -2
  118. package/packages/driver-tizen/src/__mocks__/tizen.ts +7 -8
  119. package/packages/driver-tizen/src/constants.ts +1 -195
  120. package/packages/driver-vidaa/src/DeviceVidaa.ts +29 -2
  121. package/packages/driver-vidaa/src/__mocks__/vidaa.ts +1 -1
  122. package/packages/driver-vidaa/src/keymap.ts +2 -0
  123. package/packages/driver-webos/src/DeviceWebos.ts +55 -0
  124. package/packages/driver-webos/src/__mocks__/webos.ts +33 -0
  125. package/packages/driver-webos/src/constants.ts +1 -0
  126. package/packages/driver-webos/src/keymap.ts +2 -1
  127. package/packages/driver-webos/src/types.ts +30 -0
  128. package/packages/driver-xbox/src/DeviceXbox.ts +30 -1
  129. package/packages/driver-xbox/src/keymap.ts +1 -1
  130. package/packages/epg/README.md +3 -1
  131. package/packages/epg/src/v2/Cell.tsx +16 -2
  132. package/packages/epg/src/v2/DataManager.ts +112 -41
  133. package/packages/epg/src/v2/DatePicker.tsx +9 -3
  134. package/packages/epg/src/v2/DateToast/DateToast.tsx +12 -9
  135. package/packages/epg/src/v2/Day.tsx +6 -3
  136. package/packages/epg/src/v2/Epg.tsx +5 -5
  137. package/packages/epg/src/v2/MockGenerator/generator.ts +3 -2
  138. package/packages/epg/src/v2/ProgramInfo/utils.ts +4 -3
  139. package/packages/epg/src/v2/Row.tsx +3 -1
  140. package/packages/epg/src/v2/TimelineSection.tsx +4 -1
  141. package/packages/epg/src/v2/basic/CellsManager.tsx +7 -2
  142. package/packages/epg/src/v2/basic/RowsManager.tsx +3 -1
  143. package/packages/epg/src/v2/interface.ts +13 -0
  144. package/packages/events-manager/src/EventsManager.ts +1 -56
  145. package/packages/focus/README.md +33 -0
  146. package/packages/focus/src/IFocusable.ts +1 -0
  147. package/packages/focus/src/Layout/Base.tsx +41 -6
  148. package/packages/focus/src/Layout/Matrix.tsx +51 -19
  149. package/packages/focus/src/focusFirstExisting.ts +7 -1
  150. package/packages/focus/src/hasFocus.ts +36 -0
  151. package/packages/focus/src/index.ts +2 -1
  152. package/packages/gallup/src/Gallup.ts +3 -3
  153. package/packages/grid/src/Base/Base.tsx +15 -10
  154. package/packages/grid/src/FirstOnlyGrid/FirstOnlyGrid.tsx +4 -2
  155. package/packages/grid/src/UnifiedGridController/UnifiedGridController.ts +6 -6
  156. package/packages/icon/src/Icon.tsx +27 -5
  157. package/packages/input/README.md +1 -1
  158. package/packages/input/src/Input.tsx +10 -10
  159. package/packages/interactable/README.md +2 -1
  160. package/packages/interactable/src/Interactable.tsx +9 -3
  161. package/packages/interactable/src/interface.ts +1 -0
  162. package/packages/jsx/src/index.ts +1 -1
  163. package/packages/jsx/src/test-utils/index.ts +1 -0
  164. package/packages/jsx/src/test-utils/keyup.ts +27 -0
  165. package/packages/keyboard/README.md +2 -0
  166. package/packages/keyboard/src/Backdrop/Backdrop.scss +2 -0
  167. package/packages/keyboard/src/KeyboardBase.tsx +16 -4
  168. package/packages/keyboard/src/WhitelabelKeyboard/Keyboard.scss +10 -0
  169. package/packages/keyboard/src/WhitelabelKeyboard/Keyboard.tsx +128 -142
  170. package/packages/keyboard/src/WhitelabelKeyboard/WhitelabelStyles/whitelabel.scss +4 -0
  171. package/packages/keyboard/src/WhitelabelKeyboard/_sizes.1080.scss +1 -0
  172. package/packages/keyboard/src/WhitelabelKeyboard/_sizes.scss +1 -0
  173. package/packages/keyboard/src/WhitelabelKeyboard/icons/key_language.svg +20 -0
  174. package/packages/keyboard/src/WhitelabelKeyboard/index.ts +1 -1
  175. package/packages/keyboard/src/WhitelabelKeyboard/layouts/arabic.ts +27 -0
  176. package/packages/keyboard/src/WhitelabelKeyboard/layouts/burmese.ts +27 -0
  177. package/packages/keyboard/src/WhitelabelKeyboard/layouts/dari.ts +28 -0
  178. package/packages/keyboard/src/WhitelabelKeyboard/layouts/hebrew.ts +28 -0
  179. package/packages/keyboard/src/WhitelabelKeyboard/layouts/index.ts +15 -0
  180. package/packages/keyboard/src/WhitelabelKeyboard/layouts/korean.ts +26 -0
  181. package/packages/keyboard/src/WhitelabelKeyboard/layouts/latin.ts +26 -0
  182. package/packages/keyboard/src/WhitelabelKeyboard/layouts/pashto.ts +27 -0
  183. package/packages/keyboard/src/WhitelabelKeyboard/layouts/persian.ts +27 -0
  184. package/packages/keyboard/src/WhitelabelKeyboard/layouts/russian.ts +27 -0
  185. package/packages/keyboard/src/WhitelabelKeyboard/layouts/spanish.ts +26 -0
  186. package/packages/keyboard/src/WhitelabelKeyboard/layouts/special.ts +28 -0
  187. package/packages/keyboard/src/WhitelabelKeyboard/layouts/tibetan.ts +26 -0
  188. package/packages/keyboard/src/WhitelabelKeyboard/layouts/turkish.ts +26 -0
  189. package/packages/keyboard/src/WhitelabelKeyboard/layouts/ukrainian.ts +27 -0
  190. package/packages/keyboard/src/WhitelabelKeyboard/layouts/urdu.ts +26 -0
  191. package/packages/keyboard/src/WhitelabelKeyboard/types.ts +22 -2
  192. package/packages/keyboard/src/types/index.ts +1 -1
  193. package/packages/keyboard/src/utils/caret.ts +5 -8
  194. package/packages/keyboard/src/utils/input.ts +5 -6
  195. package/packages/keyboard/src/utils/setInputSelectionRange.ts +10 -0
  196. package/packages/l10n/README.md +18 -0
  197. package/packages/l10n/src/date/common.ts +18 -6
  198. package/packages/l10n/src/date/cs.ts +2 -8
  199. package/packages/l10n/src/date/de.ts +97 -0
  200. package/packages/l10n/src/date/en-001.ts +3 -3
  201. package/packages/l10n/src/date/en-common.ts +5 -4
  202. package/packages/l10n/src/date/en-us.ts +3 -3
  203. package/packages/l10n/src/date/es.ts +71 -0
  204. package/packages/l10n/src/date/fr.ts +94 -0
  205. package/packages/l10n/src/date/he.ts +101 -0
  206. package/packages/l10n/src/date/iso.ts +12 -13
  207. package/packages/l10n/src/date/types.ts +9 -0
  208. package/packages/l10n/src/l10n.ts +61 -3
  209. package/packages/list/src/Base/Base.tsx +19 -9
  210. package/packages/list/src/Base/interface.ts +2 -2
  211. package/packages/list/src/BasicList/BasicList.tsx +7 -7
  212. package/packages/list/src/CenteredList/CenteredList.tsx +2 -2
  213. package/packages/list/src/CenteredList/controller.ts +0 -1
  214. package/packages/list/src/EdgeOffsetList/EdgeOffsetList.tsx +10 -10
  215. package/packages/list/src/FirstOnlyList/FirstOnlyList.tsx +2 -2
  216. package/packages/list/src/FirstOnlyVariedList/FirstOnlyVariedList.tsx +2 -2
  217. package/packages/list/src/FixedToEndList/FixedToEndList.tsx +2 -2
  218. package/packages/list/src/UnifiedListController/UnifiedListController.ts +6 -2
  219. package/packages/list/src/interface.ts +2 -2
  220. package/packages/logger/src/loggers/ConsoleLogger/ConsoleLogger.ts +7 -1
  221. package/packages/logger/src/loggers/SentryLogger/Sentry.ts +1 -0
  222. package/packages/logger/src/loggers/SentryLogger/SentryLogger.ts +5 -3
  223. package/packages/menu/src/MenuAndContentContainer/MenuAndContentContainer.tsx +31 -3
  224. package/packages/menu/src/MenuAndContentContainer/interface.ts +8 -0
  225. package/packages/modal-service/README.md +4 -1
  226. package/packages/modal-service/src/ModalService.tsx +29 -5
  227. package/packages/perf-utils/README.md +1 -120
  228. package/packages/perf-utils/src/array/filter.ts +1 -54
  229. package/packages/perf-utils/src/array/find.ts +1 -43
  230. package/packages/perf-utils/src/array/findIndex.ts +1 -43
  231. package/packages/perf-utils/src/array/forEach.ts +1 -48
  232. package/packages/perf-utils/src/array/includes.ts +1 -41
  233. package/packages/perf-utils/src/array/includesNaN.ts +1 -32
  234. package/packages/perf-utils/src/array/index.ts +1 -7
  235. package/packages/perf-utils/src/array/map.ts +1 -52
  236. package/packages/player-ui/README.md +1 -1
  237. package/packages/player-ui/src/CurrentTime.tsx +2 -2
  238. package/packages/player-ui/src/Duration.tsx +2 -2
  239. package/packages/player-ui/src/PauseButton.tsx +8 -0
  240. package/packages/player-ui/src/PlayerInteractable.tsx +1 -0
  241. package/packages/player-ui/src/PlayerTime.tsx +3 -1
  242. package/packages/player-ui/src/PlayerUI.tsx +68 -35
  243. package/packages/player-ui/src/RemainingTime.tsx +2 -2
  244. package/packages/player-ui/src/Seekbar.tsx +110 -18
  245. package/packages/player-ui/src/Seeking.ts +57 -16
  246. package/packages/player-ui/src/Subtitles.tsx +2 -2
  247. package/packages/player-ui/src/index.ts +1 -0
  248. package/packages/player-ui/src/mocks.ts +32 -8
  249. package/packages/player-ui/src/timeUtils.ts +3 -3
  250. package/packages/player-ui/src/types.ts +9 -3
  251. package/packages/router/README.md +1 -0
  252. package/packages/router/src/Route.tsx +61 -27
  253. package/packages/router/src/Router.tsx +63 -14
  254. package/packages/router/src/history.ts +8 -1
  255. package/packages/router/src/index.ts +1 -1
  256. package/packages/router/src/utils.ts +9 -4
  257. package/packages/sass-utils/src/linear-gradient.scss +9 -4
  258. package/packages/sass-utils/src/scale.1080.scss +3 -1
  259. package/packages/sass-utils/src/scale.720.scss +1 -1
  260. package/packages/time/README.md +4 -1
  261. package/packages/time/src/Time.ts +35 -13
  262. package/packages/time/src/adapters/24iMediaTimeApi.ts +47 -0
  263. package/packages/time/src/constants.ts +1 -0
  264. package/packages/time/src/services/24iMediaTimeApi/24iMediaTimeApi.ts +43 -0
  265. package/packages/time/src/services/24iMediaTimeApi/index.ts +6 -0
  266. package/packages/toast/src/ToastService.scss +1 -0
  267. package/packages/toast/src/ToastService.tsx +16 -5
  268. package/packages/types-bigscreen-jsx/README.md +5 -4
  269. package/packages/types-bigscreen-jsx/index.d.ts +72 -67
  270. package/packages/utils/README.md +27 -0
  271. package/packages/utils/src/elementUtils.ts +25 -0
  272. package/packages/utils/src/forceReflow.ts +14 -0
  273. package/packages/utils/src/index.ts +8 -0
  274. package/packages/utils/src/keyPress/index.ts +6 -0
  275. package/packages/utils/src/keyPress/keyPressSimulator.ts +74 -0
  276. package/packages/utils/src/keyPress/simulateKeyPress.ts +25 -0
  277. package/packages/utils/src/scaledImage.ts +6 -3
  278. package/packages/utils/src/textUtils.ts +46 -14
  279. package/packages/utils/src/wait.ts +3 -1
  280. package/packages/utils/src/xhr/xhrSend.ts +3 -1
  281. package/packages/utils/src/xhr/xhrSendRetry.ts +3 -1
  282. package/packages/zapping/src/ChannelZapping.ts +9 -0
  283. package/packages/zapping/src/Zapping.tsx +10 -0
  284. package/utils/release/release.ts +156 -0
  285. package/packages/driver-tizen/src/types.ts +0 -14
  286. package/packages/focus/src/Layout/__test__/Base.spec.ts +0 -180
  287. package/packages/focus/src/Layout/__test__/Horizontal.spec.ts +0 -94
  288. package/packages/focus/src/Layout/__test__/Matrix.spec.ts +0 -261
  289. package/packages/focus/src/Layout/__test__/Vertical.spec.ts +0 -46
  290. package/packages/focus/src/Layout/__test__/isRtl.spec.ts +0 -23
  291. package/packages/focus/src/Layout/__test__/shared.ts +0 -19
  292. package/packages/keyboard/src/WhitelabelKeyboard/focusMatrix.ts +0 -19
@@ -0,0 +1,72 @@
1
+ import { Payload } from '../../types';
2
+
3
+ export const MEDIA_PAYLOAD: Payload = {
4
+ duration: 120,
5
+ currentTime: 60,
6
+ title: 'Test Video',
7
+ url: 'https://example.com/video',
8
+ contentType: 'video/mp4',
9
+ percent: 2,
10
+ provider: 'provider',
11
+ assetId: '12345',
12
+ app_id: 'app_id',
13
+ app_type: 'html5',
14
+ sceneName: 'pageName',
15
+ sceneId: 'categories',
16
+ sceneType: 'vod',
17
+ sessionId: 1,
18
+ sessionNumber: 1,
19
+ userId: '10',
20
+ userProfileId: 'a1',
21
+ applicationId: 'app',
22
+ appVersion: 'v1.0',
23
+ deviceId: 'ott',
24
+ deviceType: 'smarttv',
25
+ searchTerm: '',
26
+ itemId: '',
27
+ pubDate: '2012/02/12',
28
+ message: 'error message',
29
+ section: 'BROWSE',
30
+ subcontentType: 'section',
31
+ seriesTitle: 'section',
32
+ language: 'en',
33
+ resolution: '1920x1080',
34
+ };
35
+
36
+ export const TEALIUM_PAGEINFO_PAYLOAD = {
37
+ categories: 'categories',
38
+ content_type: 'video',
39
+ page_name: 'pageName',
40
+ page_title: 'pageName',
41
+ section: 'section',
42
+ subcontent_type: 'section',
43
+ };
44
+
45
+ export const TEALIUM_STATIC_CORE_PAYLOAD = {
46
+ tealium_account: 'test',
47
+ tealium_profile: 'main',
48
+ tealium_environment: 'dev',
49
+ tealium_datasource: 'abc',
50
+ app_id: 'auto html5 : v1.0-test',
51
+ app_type: 'html5',
52
+ entity: 'auto',
53
+ language: 'english',
54
+ language_service: 'auto english',
55
+ ott_type: 'SmartTV',
56
+ platform_short: 'o',
57
+ platform_type: 'ott',
58
+ property_id: '1',
59
+ short_language_service: 'eng',
60
+ };
61
+
62
+ export const TEALIUM_MEDIA_PAYLOAD = {
63
+ article_uid: '12345',
64
+ byline: 'N/A',
65
+ canonical_url: 'https://example.com/video',
66
+ media_type: 'video/mp4',
67
+ pub_date: '2012/02/12',
68
+ video_length: 120,
69
+ video_name: 'Test Video',
70
+ video_position: 60,
71
+ video_series_title: 'section',
72
+ };
@@ -0,0 +1,36 @@
1
+ import { Payload, TeaMediaResult } from '../types';
2
+
3
+ export const mapMediaPayload = (
4
+ payload: Payload,
5
+ ): TeaMediaResult => {
6
+ const {
7
+ duration,
8
+ currentTime,
9
+ title,
10
+ url,
11
+ contentType,
12
+ assetId,
13
+ pubDate,
14
+ seriesTitle,
15
+ sceneName,
16
+ sceneId,
17
+ } = payload;
18
+ return {
19
+ video_name: title || '',
20
+ video_length: duration,
21
+ video_position: currentTime,
22
+ media_type: contentType,
23
+ canonical_url: url || '',
24
+ byline: 'N/A',
25
+ pub_date: pubDate || '',
26
+ article_uid: assetId,
27
+ video_series_title: seriesTitle || '',
28
+ tags: '',
29
+ page_title: sceneName || '',
30
+ page_name: sceneName || '',
31
+ content_type: 'video',
32
+ section: seriesTitle || '',
33
+ categories: sceneId,
34
+ subcontent_type: seriesTitle || '',
35
+ };
36
+ };
@@ -0,0 +1,13 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { TeaErrorResult, Payload } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+
5
+ export const mapAppError = (
6
+ triggerName: AnalyticsTriggers,
7
+ payload: Payload,
8
+ ): TeaErrorResult => ({
9
+ app_events: AppEvents.app_error,
10
+ event_trigger: triggerName,
11
+ track_event_type: TrackEventType.ACTIVITY,
12
+ message: payload.message || '',
13
+ });
@@ -0,0 +1,13 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { TeaSceneViewResult } from '../types';
3
+ import { TrackEventType } from '../constants';
4
+
5
+ export const mapAppOpen = (): Omit<TeaSceneViewResult, 'categories'> => ({
6
+ event_trigger: AnalyticsTriggers.SCENE_VIEW,
7
+ track_event_type: TrackEventType.VIEW,
8
+ page_title: 'app open',
9
+ page_name: 'app open',
10
+ content_type: 'onboarding',
11
+ section: 'onboarding',
12
+ subcontent_type: 'welcomeScreen',
13
+ });
@@ -0,0 +1,11 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { TeaCoreResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+
5
+ export const mapFavoriteAdd = (
6
+ triggerName: AnalyticsTriggers,
7
+ ): TeaCoreResult => ({
8
+ app_events: AppEvents.favorite_add,
9
+ event_trigger: triggerName,
10
+ track_event_type: TrackEventType.ACTIVITY,
11
+ });
@@ -0,0 +1,11 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { TeaCoreResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+
5
+ export const mapFavoriteRemove = (
6
+ triggerName: AnalyticsTriggers,
7
+ ): TeaCoreResult => ({
8
+ app_events: AppEvents.favorite_remove,
9
+ event_trigger: triggerName,
10
+ track_event_type: TrackEventType.ACTIVITY,
11
+ });
@@ -0,0 +1,15 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, TeaVideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapPlayerClose = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): TeaVideoResult => ({
10
+ app_events: AppEvents.player_close,
11
+ event_trigger: triggerName,
12
+ track_event_type: TrackEventType.ACTIVITY,
13
+ video_event: AppEvents.player_close,
14
+ ...(mapMediaPayload(payload)),
15
+ });
@@ -0,0 +1,15 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, TeaVideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapPlayerOpen = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): TeaVideoResult => ({
10
+ app_events: AppEvents.player_open,
11
+ event_trigger: triggerName,
12
+ track_event_type: TrackEventType.ACTIVITY,
13
+ video_event: AppEvents.player_open,
14
+ ...(mapMediaPayload(payload)),
15
+ });
@@ -0,0 +1,18 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, TeaSceneViewResult } from '../types';
3
+ import { TrackEventType } from '../constants';
4
+
5
+ export const mapSceneView = (
6
+ _: AnalyticsTriggers,
7
+ payload: Payload,
8
+ ): TeaSceneViewResult => ({
9
+ app_events: '',
10
+ event_trigger: AnalyticsTriggers.SCENE_VIEW,
11
+ track_event_type: TrackEventType.VIEW,
12
+ page_title: payload.sceneName || '',
13
+ page_name: payload.sceneName || '',
14
+ content_type: payload.sceneType || '',
15
+ section: payload.section || '',
16
+ categories: payload.sceneId,
17
+ subcontent_type: payload.subcontentType || '',
18
+ });
@@ -0,0 +1,18 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, TeaSearchResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+
5
+ export const mapSearch = (
6
+ triggerName: AnalyticsTriggers,
7
+ payload: Payload,
8
+ ): TeaSearchResult => {
9
+ const searchEventName = payload.searchSuccess
10
+ ? AnalyticsTriggers.SEARCH_SUCCESS
11
+ : AnalyticsTriggers.SEARCH_FAILED;
12
+ return {
13
+ app_events: AppEvents[searchEventName],
14
+ event_trigger: searchEventName,
15
+ track_event_type: TrackEventType.ACTIVITY,
16
+ search_keyword: payload.searchTerm,
17
+ };
18
+ };
@@ -0,0 +1,8 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, TeaSearchResult } from '../types';
3
+ import { mapSearch } from './mapSearch';
4
+
5
+ export const mapSearchFailed = (
6
+ triggerName: AnalyticsTriggers,
7
+ payload: Payload,
8
+ ): TeaSearchResult => (mapSearch(triggerName, payload));
@@ -0,0 +1,8 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, TeaSearchResult } from '../types';
3
+ import { mapSearch } from './mapSearch';
4
+
5
+ export const mapSearchSuccess = (
6
+ triggerName: AnalyticsTriggers,
7
+ payload: Payload,
8
+ ): TeaSearchResult => (mapSearch(triggerName, payload));
@@ -0,0 +1,15 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, TeaVideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapVideoPause = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): TeaVideoResult => ({
10
+ app_events: AppEvents.playback_pause,
11
+ event_trigger: triggerName,
12
+ track_event_type: TrackEventType.ACTIVITY,
13
+ video_event: AppEvents.playback_pause,
14
+ ...(mapMediaPayload(payload)),
15
+ });
@@ -0,0 +1,18 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, TeaVideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapVideoProgress = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): TeaVideoResult => {
10
+ const appEvent = (AppEvents as any)[triggerName] ?? '';
11
+ return {
12
+ app_events: appEvent,
13
+ event_trigger: triggerName,
14
+ track_event_type: TrackEventType.ACTIVITY,
15
+ video_event: appEvent,
16
+ ...(mapMediaPayload(payload)),
17
+ };
18
+ };
@@ -0,0 +1,15 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, TeaVideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapVideoResume = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): TeaVideoResult => ({
10
+ app_events: AppEvents.playback_unpause,
11
+ event_trigger: triggerName,
12
+ track_event_type: TrackEventType.ACTIVITY,
13
+ video_event: AppEvents.playback_unpause,
14
+ ...(mapMediaPayload(payload)),
15
+ });
@@ -0,0 +1,15 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, TeaVideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapVideoStart = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): TeaVideoResult => ({
10
+ app_events: AppEvents.playback_start,
11
+ event_trigger: triggerName,
12
+ track_event_type: TrackEventType.ACTIVITY,
13
+ video_event: AppEvents.playback_start,
14
+ ...(mapMediaPayload(payload)),
15
+ });
@@ -0,0 +1,15 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, TeaVideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapVideoStop = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): TeaVideoResult => ({
10
+ app_events: AppEvents.playback_stop,
11
+ event_trigger: triggerName,
12
+ track_event_type: TrackEventType.ACTIVITY,
13
+ video_event: AppEvents.playback_stop,
14
+ ...(mapMediaPayload(payload)),
15
+ });
@@ -0,0 +1,161 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { AppEvents, EVENTS, TrackEventType as TrackEventTypeEnum } from './constants';
3
+ import type {
4
+ UserInfo, GeneralAppData, AppInfo, VideoProgress, SceneInfo, PlayerSession, ErrorInfo,
5
+ } from '../../interface';
6
+
7
+ export type TeaEventType = 'view' | 'link';
8
+ type TeaAppType = 'html5' | 'react' | 'native';
9
+ type TeaOttType = 'Samsung' | 'LG' | 'AndroidTV' | 'FireTV' | 'tvOS' | 'Chromecast'
10
+ | 'Roku' | 'Set-top Box' | 'Xiaomi' | 'SmartTV';
11
+ type TeaTrackEventType = `${TrackEventTypeEnum}`;
12
+ type TeaAppEventValues = typeof AppEvents[keyof typeof AppEvents];
13
+ type TeaAnalyticsTriggerValues = `${AnalyticsTriggers}`;
14
+
15
+ export interface LanguageMapper {
16
+ [key: string]: string;
17
+ }
18
+
19
+ export type CustomMappers = Partial<Record<EVENTS, EventMappingFunction>>;
20
+
21
+ export type TealiumDataMapper = {
22
+ appType?: TeaAppType,
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'
29
+ };
30
+
31
+ export type TealiumCustomConfiguration = {
32
+ customMappers?: CustomMappers,
33
+ };
34
+
35
+ export type TealiumAnalyticsConfiguration = {
36
+ account: string, // e.g: 'bbg'
37
+ profile: string, // e.g: 'main'
38
+ environment: string, // e.g: 'dev'
39
+ dataMapper?: TealiumDataMapper,
40
+ datasource?: string, // e.g: '6g2fzf'
41
+ baseURL?: string, // e.g: 'https://collect.tealiumiq.com/event',
42
+ } & TealiumCustomConfiguration;
43
+
44
+ export type CorePayload = {
45
+ app_id: string;
46
+ app_type: TeaAppType;
47
+ };
48
+
49
+ export type SessionInfo = {
50
+ sessionId: number;
51
+ sessionNumber: number;
52
+ };
53
+
54
+ export type DeviceInfo = {
55
+ appVersion: string,
56
+ manufacturer: string,
57
+ platform: string,
58
+ platformVersion: string,
59
+ deviceId: string,
60
+ };
61
+
62
+ export type SearchInfo = {
63
+ searchTerm?: string,
64
+ searchSuccess?: boolean,
65
+ };
66
+
67
+ export type SubPageInfo = {
68
+ section: string,
69
+ subcontentType?: string,
70
+ pubDate?: string,
71
+ };
72
+
73
+ export type Payload = CorePayload &
74
+ GeneralAppData &
75
+ AppInfo &
76
+ SceneInfo &
77
+ SubPageInfo &
78
+ PlayerSession &
79
+ VideoProgress &
80
+ SessionInfo &
81
+ UserInfo &
82
+ SearchInfo &
83
+ ErrorInfo;
84
+
85
+ export type EventMappingFunction = (
86
+ triggerName: AnalyticsTriggers,
87
+ payload: Payload,
88
+ config?: TealiumAnalyticsConfiguration,
89
+ ) => TeaResult;
90
+
91
+ export type TeaDynamicCoreResult = {
92
+ language: string;
93
+ language_service: string;
94
+ property_id: string;
95
+ short_language_service: string;
96
+ };
97
+
98
+ export type TeaStaticCoreResult = {
99
+ tealium_account: string,
100
+ tealium_profile: string,
101
+ tealium_environment?: string,
102
+ tealium_datasource?: string,
103
+ instance?: string,
104
+ app_id: string;
105
+ app_type: TeaAppType;
106
+ entity: string;
107
+ ott_type: TeaOttType;
108
+ platform_short: string;
109
+ platform_type: string;
110
+ };
111
+
112
+ export type TeaCoreResult = {
113
+ app_events?: TeaAppEventValues | '', // '' for Scene View event
114
+ event_trigger: TeaAnalyticsTriggerValues,
115
+ track_event_type: TeaTrackEventType,
116
+ };
117
+
118
+ export type TeaPageResult = {
119
+ page_name: string,
120
+ page_title?: string,
121
+ content_type: string,
122
+ section?: string,
123
+ categories: string,
124
+ subcontent_type?: string;
125
+ };
126
+
127
+ export type TeaMediaResult = TeaPageResult & {
128
+ video_name: string,
129
+ video_length: number,
130
+ video_position: number,
131
+ media_type: string,
132
+ canonical_url: string,
133
+ video_series_title: string,
134
+ byline: string,
135
+ pub_date: string,
136
+ article_uid: string,
137
+ tags: string,
138
+ };
139
+
140
+ export type TeaSceneViewResult = TeaCoreResult & TeaPageResult;
141
+
142
+ export type TeaVideoResult = TeaCoreResult & TeaMediaResult & {
143
+ video_event?: string,
144
+ };
145
+
146
+ export type TeaErrorResult = TeaCoreResult & {
147
+ message: string,
148
+ };
149
+
150
+ export type TeaPlayerOpenResult = TeaCoreResult & {
151
+ thing_id: string;
152
+ source_page: string;
153
+ source_rail?: string | null;
154
+ };
155
+
156
+ export type TeaSearchResult = TeaCoreResult & {
157
+ search_keyword?: string;
158
+ };
159
+
160
+ export type TeaResult = TeaSceneViewResult | TeaVideoResult | TeaErrorResult
161
+ | TeaPlayerOpenResult | TeaSearchResult;
@@ -0,0 +1,107 @@
1
+ import { Storage } from '@24i/bigscreen-sdk/storage';
2
+ import { device } from '@24i/bigscreen-sdk/device';
3
+ import { MINUTE_IN_MS } from '@24i/bigscreen-sdk/utils/timeConstants';
4
+ import { createTimeout } from '@24i/bigscreen-sdk/utils/timers';
5
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
6
+ import {
7
+ TRIGGER_NAME_TO_24IQ_EVENTS,
8
+ } from './constants';
9
+ import { EVENTS_MAPPING } from './interface';
10
+ import type { AnalyticsClient, AnyPayload } from '../../interface';
11
+ import { generateSessionId } from '../../utils/generateSessionId';
12
+ import { CorePayload, DeviceInfo, EventBody, Payload, SessionInfo } from './types';
13
+
14
+ // eslint-disable-next-line no-magic-numbers
15
+ const SESSION_TIMEOUT = 30 * MINUTE_IN_MS;
16
+
17
+ const TWENTY_FOUR_IQ_SESSION_COUNTER = '24iQ_session_counter';
18
+
19
+ export class TwentyFourIQClient implements AnalyticsClient {
20
+ name = '24iQ';
21
+
22
+ constantPayload: CorePayload & SessionInfo & DeviceInfo = {
23
+ sessionNumber: 0,
24
+ sessionId: 0,
25
+ appVersion: '',
26
+ deviceId: '',
27
+ manufacturer: '',
28
+ platform: '',
29
+ deviceModel: '',
30
+ };
31
+
32
+ sessionTimeout = createTimeout();
33
+
34
+ isSessionActive = false;
35
+
36
+ sessionStartSent = false;
37
+
38
+ constructor(private baseURL: string, private appVersion: string = '') {
39
+ this.init();
40
+ }
41
+
42
+ 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;
48
+ await this.startSession();
49
+ }
50
+
51
+ async startSession() {
52
+ const sessionNumber = parseInt(
53
+ await Storage.getItem(TWENTY_FOUR_IQ_SESSION_COUNTER) ?? '0', 10,
54
+ ) + 1;
55
+ this.constantPayload.sessionNumber = sessionNumber;
56
+ this.constantPayload.sessionId = generateSessionId();
57
+ await Storage.setItem(TWENTY_FOUR_IQ_SESSION_COUNTER, sessionNumber.toString());
58
+ this.isSessionActive = true;
59
+ this.setSessionTimeout();
60
+ }
61
+
62
+ setSessionTimeout() {
63
+ this.sessionTimeout.set(() => {
64
+ this.isSessionActive = false;
65
+ this.sessionStartSent = false;
66
+ }, SESSION_TIMEOUT);
67
+ }
68
+
69
+ async sendEvent(eventBody: EventBody) {
70
+ try {
71
+ await fetch(this.baseURL, {
72
+ method: 'POST',
73
+ body: JSON.stringify(eventBody),
74
+ headers: {
75
+ Accept: 'application/json',
76
+ 'Content-Type': 'application/json;charset=UTF-8',
77
+ },
78
+ });
79
+ } catch (error) {
80
+ console.warn(`[${this.name}] Error sendEvent: `, error);
81
+ }
82
+ }
83
+
84
+ async onEvent(triggerName: AnalyticsTriggers, payload: AnyPayload): Promise<void> {
85
+ const events = TRIGGER_NAME_TO_24IQ_EVENTS[triggerName];
86
+ if (this.isSessionActive) {
87
+ this.setSessionTimeout();
88
+ } else {
89
+ await this.startSession();
90
+ }
91
+ if (!events) return;
92
+ await Promise.all(
93
+ events.map(async (event) => {
94
+ const mappingFunction = EVENTS_MAPPING[event];
95
+ try {
96
+ const eventBody = mappingFunction?.(triggerName, {
97
+ ...this.constantPayload,
98
+ ...payload,
99
+ } as unknown as Payload);
100
+ if (eventBody) await this.sendEvent(eventBody);
101
+ } catch (e) {
102
+ console.warn(`[${this.name}] Error onEvent: `, e);
103
+ }
104
+ }),
105
+ );
106
+ }
107
+ }