@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,126 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { GAEventsNames } from './interface';
3
+
4
+ const stringParameter = 'ep';
5
+ const numericParameter = 'epn';
6
+
7
+ export const GOOGLE_ANALYTICS_TRIGGERS = [
8
+ AnalyticsTriggers.SCENE_VIEW,
9
+ AnalyticsTriggers.APP_CLOSE,
10
+ // player triggers
11
+ AnalyticsTriggers.PLAYBACK_10,
12
+ AnalyticsTriggers.PLAYBACK_25,
13
+ AnalyticsTriggers.PLAYBACK_50,
14
+ AnalyticsTriggers.PLAYBACK_75,
15
+ AnalyticsTriggers.PLAYBACK_90,
16
+ AnalyticsTriggers.PLAYBACK_PAUSE,
17
+ AnalyticsTriggers.PLAYBACK_START,
18
+ AnalyticsTriggers.PLAYBACK_STOP,
19
+ AnalyticsTriggers.PLAYER_CLOSE,
20
+ AnalyticsTriggers.PLAYER_OPEN,
21
+ AnalyticsTriggers.HEARTBEAT_5,
22
+ // scroll triggers
23
+ AnalyticsTriggers.SCROLL_25,
24
+ AnalyticsTriggers.SCROLL_50,
25
+ AnalyticsTriggers.SCROLL_75,
26
+ AnalyticsTriggers.SCROLL_90,
27
+ // additional triggers
28
+ AnalyticsTriggers.APP_ERROR,
29
+ AnalyticsTriggers.FAVORITE_ADD,
30
+ AnalyticsTriggers.FAVORITE_REMOVE,
31
+ AnalyticsTriggers.SEARCH,
32
+ AnalyticsTriggers.RATE_CONTENT,
33
+ // ads triggers
34
+ AnalyticsTriggers.AD_BUFFERING,
35
+ AnalyticsTriggers.AD_COMPLETE,
36
+ AnalyticsTriggers.AD_ERROR,
37
+ AnalyticsTriggers.AD_SKIPPED,
38
+ AnalyticsTriggers.AD_START,
39
+ AnalyticsTriggers.AD_STOP,
40
+ // user triggers
41
+ AnalyticsTriggers.LOGIN,
42
+ AnalyticsTriggers.LOGOUT,
43
+ AnalyticsTriggers.SIGN_UP,
44
+ // purchases
45
+ AnalyticsTriggers.PURCHASE_CANCEL,
46
+ AnalyticsTriggers.PURCHASE_COMPLETE,
47
+ AnalyticsTriggers.PURCHASE_START,
48
+
49
+ ] as const;
50
+
51
+ export const TRIGGER_NAME_TO_GA_EVENTS: Record<
52
+ typeof GOOGLE_ANALYTICS_TRIGGERS[number], GAEventsNames[]
53
+ > = {
54
+ // App
55
+ [AnalyticsTriggers.APP_CLOSE]: ['close_player_session', 'video_progress'],
56
+
57
+ // Playback
58
+ [AnalyticsTriggers.HEARTBEAT_5]: ['video_progress'],
59
+ [AnalyticsTriggers.PLAYBACK_10]: ['video_progress'],
60
+ [AnalyticsTriggers.PLAYBACK_25]: ['video_progress'],
61
+ [AnalyticsTriggers.PLAYBACK_50]: ['video_progress'],
62
+ [AnalyticsTriggers.PLAYBACK_75]: ['video_progress'],
63
+ [AnalyticsTriggers.PLAYBACK_90]: ['video_complete'],
64
+ [AnalyticsTriggers.PLAYBACK_PAUSE]: ['video_progress'],
65
+ [AnalyticsTriggers.PLAYBACK_START]: ['video_start'],
66
+ [AnalyticsTriggers.PLAYBACK_STOP]: ['video_progress'],
67
+
68
+ // Player
69
+ [AnalyticsTriggers.PLAYER_CLOSE]: ['close_player_session', 'video_progress'],
70
+ [AnalyticsTriggers.PLAYER_OPEN]: ['open_player_session'],
71
+
72
+ // Scenes
73
+ [AnalyticsTriggers.SCENE_VIEW]: ['page_view'],
74
+
75
+ // Scrolling in scene
76
+ [AnalyticsTriggers.SCROLL_25]: ['scroll'],
77
+ [AnalyticsTriggers.SCROLL_50]: ['scroll'],
78
+ [AnalyticsTriggers.SCROLL_75]: ['scroll'],
79
+ [AnalyticsTriggers.SCROLL_90]: ['scroll'],
80
+
81
+ // purchases
82
+ [AnalyticsTriggers.PURCHASE_CANCEL]: [],
83
+ [AnalyticsTriggers.PURCHASE_COMPLETE]: [],
84
+ [AnalyticsTriggers.PURCHASE_START]: [],
85
+
86
+ // additional triggers
87
+ [AnalyticsTriggers.APP_ERROR]: ['app_exception'],
88
+ [AnalyticsTriggers.FAVORITE_ADD]: ['favorite_add'],
89
+ [AnalyticsTriggers.FAVORITE_REMOVE]: ['favorite_remove'],
90
+ [AnalyticsTriggers.SEARCH]: ['search'],
91
+ [AnalyticsTriggers.RATE_CONTENT]: ['rate_content'],
92
+
93
+ // ads triggers
94
+ [AnalyticsTriggers.AD_BUFFERING]: ['ad_buffering'],
95
+ [AnalyticsTriggers.AD_COMPLETE]: ['ad_complete'],
96
+ [AnalyticsTriggers.AD_ERROR]: ['ad_error'],
97
+ [AnalyticsTriggers.AD_SKIPPED]: ['ad_skipped'],
98
+ [AnalyticsTriggers.AD_START]: ['ad_start'],
99
+ [AnalyticsTriggers.AD_STOP]: ['ad_stop'],
100
+
101
+ // user triggers
102
+ [AnalyticsTriggers.LOGIN]: ['login'],
103
+ [AnalyticsTriggers.LOGOUT]: ['logout'],
104
+ [AnalyticsTriggers.SIGN_UP]: ['sign_up'],
105
+ };
106
+
107
+ export const gtagPayloadParams: Record<string, string> = {
108
+ contentType: `${stringParameter}.content_type`,
109
+ itemId: `${stringParameter}.video_asset_id`,
110
+ episodeNumber: `${numericParameter}.video_episode_number`,
111
+ seasonNumber: `${numericParameter}.video_season_number`,
112
+ currentTime: `${numericParameter}.video_current_time`,
113
+ duration: `${numericParameter}.video_duration`,
114
+ percent: `${numericParameter}.video_percent`,
115
+ provider: `${stringParameter}.video_provider`,
116
+ title: `${stringParameter}.video_title`,
117
+ seriesTitle: `${stringParameter}.video_series_title`,
118
+ url: `${stringParameter}.video_url`,
119
+ assetId: `${stringParameter}.video_asset_id`,
120
+ externalId: `${stringParameter}.video_external_id`,
121
+ channelNumber: `${numericParameter}.channel_number`,
122
+ channelTitle: `${stringParameter}.channel_title`,
123
+ method: `${stringParameter}.method`,
124
+ searchTerm: `${stringParameter}.search_term`,
125
+ message: `${stringParameter}.message`,
126
+ };
@@ -0,0 +1,17 @@
1
+ import { ConstantUrlParams, EventUrlParams } from './interface';
2
+
3
+ const TRANSPORT_URL = 'https://www.google-analytics.com/g/collect?';
4
+ // You can use the following URL for debugging if the events are not getting collected.
5
+ // const TRANSPORT_URL = 'https://www.google-analytics.com/debug/g/collec?';
6
+
7
+ export const getUrl = (id: string, params: ConstantUrlParams & EventUrlParams) => {
8
+ const urlParts = [
9
+ TRANSPORT_URL,
10
+ `v=2&tid=${id}`,
11
+ ];
12
+ (Object.keys(params) as (keyof (ConstantUrlParams & EventUrlParams))[])
13
+ .forEach((paramName: keyof (ConstantUrlParams & EventUrlParams)) => {
14
+ urlParts.push(`&${paramName}=${encodeURIComponent(params[paramName])}`);
15
+ });
16
+ return urlParts.join('');
17
+ };
@@ -0,0 +1,2 @@
1
+ export { GoogleAnalytics } from './GoogleAnalytics';
2
+ export { GOOGLE_ANALYTICS_TRIGGERS } from './constants';
@@ -0,0 +1,82 @@
1
+ export type GAEventsNames = (
2
+ | 'app_close' // When the playback is active at the time the app or website is closing.
3
+ | 'page_view' // Each time the page loads or the browser history state is changed
4
+ | 'scroll' // The first time a user reaches the bottom of each page
5
+ | 'video_progress' // When the video progresses past 10%, 25%, 50%, and 75% duration time
6
+ | 'video_start' // When the video starts playing
7
+ | 'video_complete' // When the video ends
8
+ | 'open_player_session' // When the user opens a player scene and the player is initiated
9
+ | 'close_player_session' // When the user exits the player scene with initiated player
10
+ | 'select_content' // When a user has selected content
11
+ | 'login' // When a user logs in
12
+ | 'logout' // When a user logs in
13
+ | 'sign_up' // When a user has signed up Allows you to see which methods of signup are popular
14
+ | 'search' // When a user searches your content
15
+ | 'purchase' // When a user completes a purchase
16
+ | 'share' // When a user has shared content
17
+ | 'favorite_add' // When a user add asset to favorites
18
+ | 'favorite_remove' // When a user remove asset froms favorites
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
23
+ | 'ad_skipped' // When user skipped current advertisement
24
+ | 'ad_start' // When advertisement has been started
25
+ | 'ad_stop' // When advertisement has been stopped
26
+ | 'app_exception' // When application throws an error
27
+ | 'rate_content' // When user rates an asset
28
+ );
29
+
30
+ export type QueuedEvent = {
31
+ name: string,
32
+ params: Record<string, any>,
33
+ urlParams: EventUrlParams,
34
+ };
35
+
36
+ export type SessionInfo = {
37
+ appVersion: string,
38
+ manufacturer: string,
39
+ platform: string,
40
+ language: string,
41
+ resolution: string,
42
+ referrer: string,
43
+ engagementTime: number | undefined,
44
+ sessionStarted: boolean,
45
+ isAuthenticated: '0' | '1',
46
+ firstEvent: boolean,
47
+ firstVisit: boolean,
48
+ };
49
+
50
+ export type ConstantUrlParams = {
51
+ /** Client ID (UUIv4 string) */
52
+ cid: string,
53
+ /** Session ID (random number) */
54
+ sid: number,
55
+ /** Session engagement 0 for first event of session, 1 otherwise */
56
+ seg: number,
57
+ /** Session count */
58
+ sct: number,
59
+ /** Random page hash */
60
+ _p: string,
61
+ /** Device manufacturer e.g. 'Samsung' */
62
+ 'up.device_manufacturer': string,
63
+ /** Platform e.g. 'Tizen' */
64
+ 'up.device_platform': string,
65
+ /** Platform version e.g. '5.0' */
66
+ 'up.device_platform_version': string,
67
+ /** Version of application 'v1.0.0' */
68
+ 'up.app_version': string,
69
+ };
70
+
71
+ export type EventUrlParams = {
72
+ /** Language iso639-1 */
73
+ ul: string,
74
+ /** Device resolution as WIDTHxHEIGHT */
75
+ sr: string,
76
+ /** Page hash route */
77
+ dl: string,
78
+ /** Page title */
79
+ dt: string,
80
+ /** Page referrer hash route */
81
+ dr: string,
82
+ };
@@ -0,0 +1,51 @@
1
+ import type { AnalyticsEventsNames, AnyPayload } from '../../interface';
2
+ import type { EventUrlParams, GAEventsNames } from './interface';
3
+ import { gtagPayloadParams } from './constants';
4
+
5
+ const map: Record<string, string> = {
6
+ language: 'ul',
7
+ resolution: 'sr',
8
+ referrer: 'dr',
9
+ sceneId: 'dl',
10
+ sceneName: 'dt',
11
+ isAuthenticated: 'up.is_authenticated',
12
+ };
13
+
14
+ export const mapEventParamsToUrlParams = (eventParams: Record<string, any>)
15
+ : EventUrlParams => {
16
+ const urlParams = {};
17
+ Object.entries(eventParams).forEach(([key]) => {
18
+ if (map[key]) {
19
+ Object.assign(urlParams, {
20
+ [map[key]]: eventParams[key] || '',
21
+ });
22
+ }
23
+ });
24
+ return urlParams as EventUrlParams;
25
+ };
26
+
27
+ export const mapPayload = (
28
+ eventName: GAEventsNames,
29
+ triggerName: AnalyticsEventsNames,
30
+ payload: AnyPayload,
31
+ ) => {
32
+ const pageParams = triggerName === 'scene_view' ? {
33
+ ...(payload.firstEvent && { _ee: 1 }),
34
+ ...(payload.firstVisit && { _fv: 1 }),
35
+ ...(payload.sessionStarted && { _ss: 1 }),
36
+ } : {};
37
+ const gtagPayload: Record<string, any> = {
38
+ 'ep.event_trigger': triggerName,
39
+ _et: payload.engagementTime ?? 0,
40
+ ...pageParams,
41
+ };
42
+ if (eventName === 'scroll') {
43
+ gtagPayload['epn.percent_scrolled'] = parseInt(triggerName.split('_')[1], 10);
44
+ }
45
+ Object.keys(payload).forEach((key: keyof typeof payload) => {
46
+ if (gtagPayloadParams[key] !== undefined) {
47
+ gtagPayload[gtagPayloadParams[key]] = payload[key];
48
+ }
49
+ });
50
+ return gtagPayload;
51
+ };
@@ -0,0 +1,14 @@
1
+ import { QueuedEvent } from './interface';
2
+
3
+ export const prepareBody = (events: QueuedEvent[]) => {
4
+ const eventLines = events.map((event: QueuedEvent) => {
5
+ const eventParams = [
6
+ `en=${event.name}`,
7
+ ];
8
+ Object.keys(event.params).forEach((paramName) => {
9
+ eventParams.push(`${paramName}=${encodeURIComponent(event.params[paramName])}`);
10
+ });
11
+ return eventParams.join('&');
12
+ });
13
+ return eventLines.join('\r\n');
14
+ };
@@ -0,0 +1,181 @@
1
+ import { Storage } from '@24i/bigscreen-sdk/storage';
2
+ import { MINUTE_IN_MS } from '@24i/bigscreen-sdk/utils/timeConstants';
3
+ import { createTimeout } from '@24i/bigscreen-sdk/utils/timers';
4
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
5
+ import { findForLanguage } from './findForLanguage';
6
+ import {
7
+ BIGSCREEN_APP_TYPE,
8
+ BIGSCREEN_OTT_TYPE,
9
+ BIGSCREEN_PLATFORM_SHORT,
10
+ BIGSCREEN_PLATFORM_TYPE,
11
+ TRIGGER_NAME_TO_TEALIUM_EVENTS,
12
+ } from './constants';
13
+ import { EVENTS_MAPPING } from './interface';
14
+ import type { AnalyticsClient, AnyPayload } from '../../interface';
15
+ import type {
16
+ TeaStaticCoreResult,
17
+ Payload,
18
+ TealiumAnalyticsConfiguration,
19
+ TeaResult,
20
+ TealiumDataMapper,
21
+ CustomMappers,
22
+ TeaDynamicCoreResult,
23
+ } from './types';
24
+
25
+ // eslint-disable-next-line no-magic-numbers
26
+ const SESSION_TIMEOUT = 30 * MINUTE_IN_MS;
27
+ const TEALIUM_SESSION_COUNTER = 'tealium_session_counter';
28
+ const TEALIUM_BASE_URL = 'https://collect.tealiumiq.com/event';
29
+
30
+ const DEFAULT_PAYLOAD: TeaStaticCoreResult = {
31
+ tealium_account: '',
32
+ tealium_profile: '',
33
+ entity: '',
34
+ platform_short: BIGSCREEN_PLATFORM_SHORT,
35
+ platform_type: BIGSCREEN_PLATFORM_TYPE,
36
+ app_type: BIGSCREEN_APP_TYPE,
37
+ ott_type: BIGSCREEN_OTT_TYPE,
38
+ app_id: '',
39
+ } as const;
40
+
41
+ export class TealiumAnalytics implements AnalyticsClient {
42
+ name = 'TealiumAnalytics';
43
+
44
+ constantPayload: TeaStaticCoreResult = DEFAULT_PAYLOAD;
45
+
46
+ sessionTimeout = createTimeout();
47
+
48
+ isSessionActive = false;
49
+
50
+ sessionStartSent = false;
51
+
52
+ baseUrl: string = '';
53
+
54
+ customMappers: CustomMappers | undefined = undefined;
55
+
56
+ constructor(private config: TealiumAnalyticsConfiguration, private appVersion: string = '') {
57
+ this.init();
58
+ }
59
+
60
+ async init() {
61
+ this.baseUrl = this.config.baseURL || TEALIUM_BASE_URL;
62
+ this.prepareDatasetPayload();
63
+ }
64
+
65
+ prepareDatasetPayload() {
66
+ if (!this.config) {
67
+ console.warn(`[${this.name}] prepareDatasetPayload missing configuration`);
68
+ return;
69
+ }
70
+ const {
71
+ account,
72
+ profile,
73
+ environment,
74
+ datasource,
75
+ customMappers,
76
+ dataMapper = {} as TealiumDataMapper,
77
+ } = this.config;
78
+ const { entity, platformShort, platformType, appType } = dataMapper;
79
+ this.customMappers = customMappers;
80
+ this.constantPayload = {
81
+ tealium_account: account,
82
+ tealium_profile: profile,
83
+ tealium_environment: environment,
84
+ entity,
85
+ ...(datasource && { tealium_datasource: datasource }),
86
+ platform_short: platformShort ?? BIGSCREEN_PLATFORM_SHORT,
87
+ platform_type: platformType ?? BIGSCREEN_PLATFORM_TYPE,
88
+ app_type: appType ?? BIGSCREEN_APP_TYPE,
89
+ 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) || '',
109
+ };
110
+ }
111
+
112
+ async startSession() {
113
+ const sessionNumber = parseInt(
114
+ await Storage.getItem(TEALIUM_SESSION_COUNTER) ?? '0', 10,
115
+ ) + 1;
116
+ await Storage.setItem(TEALIUM_SESSION_COUNTER, sessionNumber.toString());
117
+ this.isSessionActive = true;
118
+ this.setSessionTimeout();
119
+ }
120
+
121
+ setSessionTimeout() {
122
+ this.sessionTimeout.set(() => {
123
+ this.isSessionActive = false;
124
+ this.sessionStartSent = false;
125
+ }, SESSION_TIMEOUT);
126
+ }
127
+
128
+ async sendEvent(eventBody: TeaResult) {
129
+ try {
130
+ await fetch(this.baseUrl, {
131
+ method: 'POST',
132
+ body: JSON.stringify(eventBody),
133
+ headers: {
134
+ Accept: 'application/json',
135
+ 'Content-Type': 'application/json;charset=UTF-8',
136
+ },
137
+ });
138
+ } catch (error) {
139
+ console.warn(`[${this.name}] Error sendEvent: `, error);
140
+ }
141
+ }
142
+
143
+ async onEvent(triggerName: AnalyticsTriggers, payload: AnyPayload): Promise<void> {
144
+ const events = TRIGGER_NAME_TO_TEALIUM_EVENTS[triggerName];
145
+ if (this.isSessionActive) {
146
+ this.setSessionTimeout();
147
+ } else {
148
+ await this.startSession();
149
+ }
150
+ if (!events) return;
151
+ await Promise.all(
152
+ events.map(async (event) => {
153
+ const mappingFunction = this.customMappers && this.customMappers[event]
154
+ ? this.customMappers[event]
155
+ : EVENTS_MAPPING[event];
156
+ try {
157
+ if (!mappingFunction) {
158
+ throw Error(`Missing mapping function for "${event}"`);
159
+ }
160
+ const eventBody = {
161
+ ...this.constantPayload,
162
+ ...this.getDynamicPayload(payload),
163
+ ...mappingFunction(triggerName, payload as Payload, this.config),
164
+ };
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);
175
+ } catch (e) {
176
+ console.warn(`[${this.name}] Error onEvent: `, e);
177
+ }
178
+ }),
179
+ );
180
+ }
181
+ }
@@ -0,0 +1,106 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+
3
+ export const BIGSCREEN_OTT_TYPE = 'SmartTV';
4
+
5
+ export const BIGSCREEN_APP_TYPE = 'html5';
6
+
7
+ export const BIGSCREEN_PLATFORM_SHORT = 'o';
8
+
9
+ export const BIGSCREEN_PLATFORM_TYPE = 'ott';
10
+
11
+ export const TEALIUM_TRIGGERS = [
12
+ // App
13
+ AnalyticsTriggers.APP_OPEN,
14
+ AnalyticsTriggers.APP_CLOSE,
15
+ AnalyticsTriggers.APP_ERROR,
16
+
17
+ // Scenes
18
+ AnalyticsTriggers.SCENE_VIEW,
19
+
20
+ // Search
21
+ AnalyticsTriggers.SEARCH,
22
+
23
+ // Playback
24
+ AnalyticsTriggers.PLAYBACK_10,
25
+ AnalyticsTriggers.PLAYBACK_50,
26
+ AnalyticsTriggers.PLAYBACK_90,
27
+ AnalyticsTriggers.PLAYBACK_PAUSE,
28
+ AnalyticsTriggers.PLAYBACK_UNPAUSE,
29
+ AnalyticsTriggers.PLAYBACK_START,
30
+ AnalyticsTriggers.PLAYBACK_STOP,
31
+
32
+ // Player
33
+ AnalyticsTriggers.PLAYER_CLOSE,
34
+ AnalyticsTriggers.PLAYER_OPEN,
35
+
36
+ // Favorites
37
+ AnalyticsTriggers.FAVORITE_ADD,
38
+ AnalyticsTriggers.FAVORITE_REMOVE,
39
+
40
+ AnalyticsTriggers.SELECT_CONTENT,
41
+ AnalyticsTriggers.SEARCH_SUCCESS,
42
+ AnalyticsTriggers.SEARCH_FAILED,
43
+ ];
44
+
45
+ export const AppEvents = {
46
+ [AnalyticsTriggers.APP_OPEN]: '',
47
+ [AnalyticsTriggers.SCENE_VIEW]: '',
48
+ [AnalyticsTriggers.PLAYBACK_10]: 'media_milestone_10_video',
49
+ [AnalyticsTriggers.PLAYBACK_50]: 'media_milestone_50_video',
50
+ [AnalyticsTriggers.PLAYBACK_90]: 'media_milestone_90_video',
51
+ [AnalyticsTriggers.PLAYBACK_STOP]: 'video_stop',
52
+ [AnalyticsTriggers.PLAYBACK_PAUSE]: 'video_pause',
53
+ [AnalyticsTriggers.PLAYBACK_UNPAUSE]: 'video_resume',
54
+ [AnalyticsTriggers.PLAYBACK_START]: 'video_play',
55
+ [AnalyticsTriggers.PLAYER_OPEN]: 'player_open',
56
+ [AnalyticsTriggers.PLAYER_CLOSE]: 'player_x',
57
+ [AnalyticsTriggers.FAVORITE_ADD]: 'subscribe_to_fav',
58
+ [AnalyticsTriggers.FAVORITE_REMOVE]: 'subscribe_to_fav',
59
+ [AnalyticsTriggers.APP_ERROR]: 'app_events',
60
+ [AnalyticsTriggers.SELECT_CONTENT]: 'app_events',
61
+ [AnalyticsTriggers.SEARCH_SUCCESS]: 'search_success',
62
+ [AnalyticsTriggers.SEARCH_FAILED]: 'search_fail',
63
+ } as const;
64
+
65
+ export enum EVENTS {
66
+ APP_OPEN = 'app_open',
67
+ SCENE_VIEW = 'scene_view',
68
+ VIDEO_PROGRESS = 'video_progress',
69
+ VIDEO_START = 'video_start',
70
+ VIDEO_STOP = 'video_stop',
71
+ VIDEO_PAUSE = 'video_pause',
72
+ VIDEO_UNPAUSE = 'video_unpause',
73
+ PLAYER_CLOSE = 'player_close',
74
+ PLAYER_OPEN = 'player_open',
75
+ SEARCH_SUCCESS = 'search_success',
76
+ SEARCH_FAILED = 'search_failed',
77
+ FAVORITE_ADD = 'favorite_add',
78
+ FAVORITE_REMOVE = 'favorite_remove',
79
+ APP_ERROR = 'app_error',
80
+ }
81
+
82
+ export enum TrackEventType {
83
+ VIEW = 'view',
84
+ ACTIVITY = 'activity',
85
+ }
86
+
87
+ export const TRIGGER_NAME_TO_TEALIUM_EVENTS: { [K in AnalyticsTriggers]?: EVENTS[]; } = {
88
+ [AnalyticsTriggers.APP_OPEN]: [EVENTS.APP_OPEN],
89
+ [AnalyticsTriggers.SCENE_VIEW]: [EVENTS.SCENE_VIEW],
90
+ [AnalyticsTriggers.PLAYBACK_10]: [EVENTS.VIDEO_PROGRESS],
91
+ [AnalyticsTriggers.PLAYBACK_50]: [EVENTS.VIDEO_PROGRESS],
92
+ [AnalyticsTriggers.PLAYBACK_90]: [EVENTS.VIDEO_PROGRESS],
93
+ [AnalyticsTriggers.PLAYBACK_PAUSE]: [EVENTS.VIDEO_PAUSE],
94
+ [AnalyticsTriggers.PLAYBACK_UNPAUSE]: [EVENTS.VIDEO_UNPAUSE],
95
+ [AnalyticsTriggers.PLAYBACK_START]: [EVENTS.VIDEO_START],
96
+ [AnalyticsTriggers.PLAYBACK_STOP]: [EVENTS.VIDEO_STOP],
97
+ [AnalyticsTriggers.PLAYER_CLOSE]: [EVENTS.PLAYER_CLOSE],
98
+ [AnalyticsTriggers.PLAYER_OPEN]: [EVENTS.PLAYER_OPEN],
99
+ [AnalyticsTriggers.APP_CLOSE]: [EVENTS.VIDEO_STOP, EVENTS.PLAYER_CLOSE],
100
+ [AnalyticsTriggers.APP_ERROR]: [EVENTS.APP_ERROR],
101
+ [AnalyticsTriggers.FAVORITE_ADD]: [EVENTS.FAVORITE_ADD],
102
+ [AnalyticsTriggers.FAVORITE_REMOVE]: [EVENTS.FAVORITE_REMOVE],
103
+ [AnalyticsTriggers.SEARCH]: [EVENTS.SEARCH_SUCCESS, EVENTS.SEARCH_FAILED],
104
+ };
105
+
106
+ export const HUNDRED_PERCENT = 100;
@@ -0,0 +1,9 @@
1
+ import { LanguageMapper } from '@24i/bigscreen-sdk/analytics/TealiumAnalytics';
2
+
3
+ export const findForLanguage = (
4
+ languageMapper: LanguageMapper = {},
5
+ language: string = '',
6
+ ) => {
7
+ const languageKey = Object.keys(languageMapper).find((key) => key === language);
8
+ return languageKey ? languageMapper[languageKey] : null;
9
+ };
@@ -0,0 +1,4 @@
1
+ export { TealiumAnalytics } from './TealiumAnalytics';
2
+ export { findForLanguage } from './findForLanguage';
3
+ export * from './constants';
4
+ export * from './types';
@@ -0,0 +1,35 @@
1
+ import {
2
+ EVENTS,
3
+ } from './constants';
4
+ import { mapSceneView } from './mappers/mapSceneView';
5
+ import { mapVideoProgress } from './mappers/mapVideoProgress';
6
+ import { mapVideoStop } from './mappers/mapVideoStop';
7
+ import { mapPlayerOpen } from './mappers/mapPlayerOpen';
8
+ import { mapPlayerClose } from './mappers/mapPlayerClose';
9
+ import { mapVideoStart } from './mappers/mapVideoStart';
10
+ import { mapVideoPause } from './mappers/mapVideoPause';
11
+ import { mapFavoriteAdd } from './mappers/mapFavoriteAdd';
12
+ import { mapFavoriteRemove } from './mappers/mapFavoriteRemove';
13
+ import { mapVideoResume } from './mappers/mapVideoResume';
14
+ import { mapSearchSuccess } from './mappers/mapSearchSuccess';
15
+ import { mapSearchFailed } from './mappers/mapSearchFailed';
16
+ import { mapAppError } from './mappers/mapAppError';
17
+ import { mapAppOpen } from './mappers/mapAppOpen';
18
+ import { EventMappingFunction } from './types';
19
+
20
+ export const EVENTS_MAPPING: Record<EVENTS, EventMappingFunction> = {
21
+ [EVENTS.APP_OPEN]: mapAppOpen,
22
+ [EVENTS.SCENE_VIEW]: mapSceneView,
23
+ [EVENTS.PLAYER_OPEN]: mapPlayerOpen,
24
+ [EVENTS.PLAYER_CLOSE]: mapPlayerClose,
25
+ [EVENTS.VIDEO_START]: mapVideoStart,
26
+ [EVENTS.VIDEO_STOP]: mapVideoStop,
27
+ [EVENTS.VIDEO_PROGRESS]: mapVideoProgress,
28
+ [EVENTS.VIDEO_PAUSE]: mapVideoPause,
29
+ [EVENTS.VIDEO_UNPAUSE]: mapVideoResume,
30
+ [EVENTS.FAVORITE_ADD]: mapFavoriteAdd,
31
+ [EVENTS.FAVORITE_REMOVE]: mapFavoriteRemove,
32
+ [EVENTS.SEARCH_SUCCESS]: mapSearchSuccess,
33
+ [EVENTS.SEARCH_FAILED]: mapSearchFailed,
34
+ [EVENTS.APP_ERROR]: mapAppError,
35
+ };