@24i/bigscreen-sdk 1.0.54-alpha.2836 → 2.1.1-alpha.2133

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 (278) hide show
  1. package/README.md +3 -2
  2. package/package.json +34 -53
  3. package/packages/adobe-heartbeat/src/AdobeHeartbeat.ts +9 -9
  4. package/packages/async-image/src/AsyncImage.tsx +10 -15
  5. package/packages/developer-tools/PlayerDebugWindow/README.md +1 -1
  6. package/packages/developer-tools/src/DeveloperToolsService/DeveloperToolsList.tsx +0 -11
  7. package/packages/developer-tools/src/PlayerDebugWindow/PlayerDebugWindow.tsx +5 -5
  8. package/packages/developer-tools/src/PlayerDebugWindow/constants.ts +0 -15
  9. package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoDetail.tsx +1 -2
  10. package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoProvider.ts +5 -57
  11. package/packages/developer-tools/src/TechnicalInfo/__mocks__/Device.ts +0 -12
  12. package/packages/developer-tools/src/TechnicalInfo/translations.ts +0 -8
  13. package/packages/device/src/getKeyDigit.ts +2 -2
  14. package/packages/device/src/resolver/resolver.ts +5 -18
  15. package/packages/digital-clock/src/DigitalClock.tsx +4 -15
  16. package/packages/driver-androidtv/src/DeviceAndroidTV.ts +9 -92
  17. package/packages/driver-androidtv/src/__mocks__/javaScriptBridge.ts +5 -38
  18. package/packages/driver-androidtv/src/index.ts +0 -1
  19. package/packages/driver-androidtv/src/keymap.ts +0 -18
  20. package/packages/driver-androidtv/src/types.ts +16 -144
  21. package/packages/driver-base/src/DeviceBase.ts +2 -80
  22. package/packages/driver-base/src/KeyMap/Key.ts +1 -8
  23. package/packages/driver-base/src/KeyMap/KeyMap.ts +0 -4
  24. package/packages/driver-base/src/KeyMap/interface.ts +0 -1
  25. package/packages/driver-base/src/KeyMap/overrideValues.ts +1 -2
  26. package/packages/driver-base/src/__mocks__/DeviceBase.ts +0 -24
  27. package/packages/driver-base/src/__mocks__/keyMap.ts +0 -1
  28. package/packages/driver-base/src/index.ts +0 -3
  29. package/packages/driver-base/src/types/DeviceEvent.ts +0 -2
  30. package/packages/driver-base/src/types/KeycodeKeyMap.ts +0 -1
  31. package/packages/driver-browser/src/DeviceBrowser.ts +0 -26
  32. package/packages/driver-browser/src/keymap.ts +0 -8
  33. package/packages/driver-entone/src/DeviceEntone.ts +1 -31
  34. package/packages/driver-entone/src/keymap.ts +0 -1
  35. package/packages/driver-hbbtv/src/DeviceHbbTV.ts +0 -26
  36. package/packages/driver-kreatv/src/DeviceKreaTV.ts +0 -26
  37. package/packages/driver-saphi/src/DeviceSaphi.ts +0 -26
  38. package/packages/driver-tizen/src/DeviceTizen.ts +7 -126
  39. package/packages/driver-tizen/src/ITizen.ts +202 -15116
  40. package/packages/driver-tizen/src/IWebapis.ts +87 -8643
  41. package/packages/driver-tizen/src/TizenKeys.ts +2 -4
  42. package/packages/driver-tizen/src/__mocks__/tizen.ts +8 -7
  43. package/packages/driver-tizen/src/constants.ts +195 -1
  44. package/packages/driver-tizen/src/types.ts +14 -0
  45. package/packages/driver-vidaa/src/DeviceVidaa.ts +2 -29
  46. package/packages/driver-vidaa/src/__mocks__/vidaa.ts +1 -1
  47. package/packages/driver-vidaa/src/keymap.ts +0 -2
  48. package/packages/driver-webos/src/DeviceWebos.ts +0 -55
  49. package/packages/driver-webos/src/__mocks__/webos.ts +0 -33
  50. package/packages/driver-webos/src/constants.ts +0 -1
  51. package/packages/driver-webos/src/keymap.ts +1 -2
  52. package/packages/driver-webos/src/types.ts +0 -30
  53. package/packages/driver-xbox/src/DeviceXbox.ts +1 -30
  54. package/packages/driver-xbox/src/keymap.ts +1 -1
  55. package/packages/epg/README.md +1 -3
  56. package/packages/epg/src/v2/Cell.tsx +2 -16
  57. package/packages/epg/src/v2/DataManager.ts +41 -112
  58. package/packages/epg/src/v2/DatePicker.tsx +3 -9
  59. package/packages/epg/src/v2/DateToast/DateToast.tsx +9 -12
  60. package/packages/epg/src/v2/Day.tsx +3 -6
  61. package/packages/epg/src/v2/Epg.tsx +5 -5
  62. package/packages/epg/src/v2/MockGenerator/generator.ts +2 -3
  63. package/packages/epg/src/v2/ProgramInfo/utils.ts +3 -4
  64. package/packages/epg/src/v2/Row.tsx +1 -3
  65. package/packages/epg/src/v2/TimelineSection.tsx +1 -4
  66. package/packages/epg/src/v2/basic/CellsManager.tsx +2 -7
  67. package/packages/epg/src/v2/basic/RowsManager.tsx +1 -3
  68. package/packages/epg/src/v2/interface.ts +0 -13
  69. package/packages/events-manager/src/EventsManager.ts +56 -1
  70. package/packages/focus/README.md +0 -33
  71. package/packages/focus/src/IFocusable.ts +0 -1
  72. package/packages/focus/src/Layout/Base.tsx +6 -41
  73. package/packages/focus/src/Layout/Matrix.tsx +19 -51
  74. package/packages/focus/src/Layout/__test__/Base.spec.ts +180 -0
  75. package/packages/focus/src/Layout/__test__/Horizontal.spec.ts +94 -0
  76. package/packages/focus/src/Layout/__test__/Matrix.spec.ts +261 -0
  77. package/packages/focus/src/Layout/__test__/Vertical.spec.ts +46 -0
  78. package/packages/focus/src/Layout/__test__/isRtl.spec.ts +23 -0
  79. package/packages/focus/src/Layout/__test__/shared.ts +19 -0
  80. package/packages/focus/src/focusFirstExisting.ts +1 -7
  81. package/packages/focus/src/index.ts +1 -2
  82. package/packages/gallup/src/Gallup.ts +3 -3
  83. package/packages/grid/src/Base/Base.tsx +10 -15
  84. package/packages/grid/src/FirstOnlyGrid/FirstOnlyGrid.tsx +2 -4
  85. package/packages/grid/src/UnifiedGridController/UnifiedGridController.ts +6 -6
  86. package/packages/icon/src/Icon.tsx +5 -27
  87. package/packages/input/README.md +1 -1
  88. package/packages/input/src/Input.tsx +10 -16
  89. package/packages/interactable/README.md +1 -2
  90. package/packages/interactable/src/Interactable.tsx +3 -9
  91. package/packages/interactable/src/interface.ts +0 -1
  92. package/packages/jsx/src/index.ts +1 -1
  93. package/packages/jsx/src/test-utils/index.ts +0 -1
  94. package/packages/keyboard/src/Backdrop/Backdrop.scss +0 -2
  95. package/packages/keyboard/src/KeyboardBase.tsx +4 -16
  96. package/packages/keyboard/src/WhitelabelKeyboard/Keyboard.scss +0 -4
  97. package/packages/keyboard/src/WhitelabelKeyboard/Keyboard.tsx +20 -28
  98. package/packages/keyboard/src/WhitelabelKeyboard/_sizes.1080.scss +0 -1
  99. package/packages/keyboard/src/WhitelabelKeyboard/_sizes.scss +0 -1
  100. package/packages/keyboard/src/WhitelabelKeyboard/layouts/index.ts +0 -12
  101. package/packages/keyboard/src/WhitelabelKeyboard/types.ts +0 -1
  102. package/packages/keyboard/src/utils/caret.ts +8 -5
  103. package/packages/keyboard/src/utils/input.ts +6 -5
  104. package/packages/l10n/README.md +0 -18
  105. package/packages/l10n/src/date/common.ts +6 -18
  106. package/packages/l10n/src/date/cs.ts +8 -2
  107. package/packages/l10n/src/date/en-001.ts +3 -3
  108. package/packages/l10n/src/date/en-common.ts +4 -5
  109. package/packages/l10n/src/date/en-us.ts +3 -3
  110. package/packages/l10n/src/date/iso.ts +13 -12
  111. package/packages/l10n/src/date/types.ts +0 -9
  112. package/packages/l10n/src/l10n.ts +3 -61
  113. package/packages/list/src/Base/Base.tsx +9 -19
  114. package/packages/list/src/Base/interface.ts +2 -2
  115. package/packages/list/src/BasicList/BasicList.tsx +7 -7
  116. package/packages/list/src/CenteredList/CenteredList.tsx +2 -2
  117. package/packages/list/src/CenteredList/controller.ts +1 -0
  118. package/packages/list/src/EdgeOffsetList/EdgeOffsetList.tsx +10 -10
  119. package/packages/list/src/FirstOnlyList/FirstOnlyList.tsx +2 -2
  120. package/packages/list/src/FirstOnlyVariedList/FirstOnlyVariedList.tsx +2 -2
  121. package/packages/list/src/FixedToEndList/FixedToEndList.tsx +2 -2
  122. package/packages/list/src/UnifiedListController/UnifiedListController.ts +2 -6
  123. package/packages/list/src/interface.ts +2 -2
  124. package/packages/logger/src/loggers/ConsoleLogger/ConsoleLogger.ts +1 -7
  125. package/packages/logger/src/loggers/SentryLogger/Sentry.ts +0 -1
  126. package/packages/logger/src/loggers/SentryLogger/SentryLogger.ts +3 -5
  127. package/packages/menu/src/MenuAndContentContainer/MenuAndContentContainer.tsx +3 -31
  128. package/packages/menu/src/MenuAndContentContainer/interface.ts +0 -8
  129. package/packages/modal-service/README.md +1 -4
  130. package/packages/modal-service/src/ModalService.tsx +5 -29
  131. package/packages/perf-utils/README.md +120 -1
  132. package/packages/perf-utils/src/array/filter.ts +54 -1
  133. package/packages/perf-utils/src/array/find.ts +43 -1
  134. package/packages/perf-utils/src/array/findIndex.ts +43 -1
  135. package/packages/perf-utils/src/array/forEach.ts +48 -1
  136. package/packages/perf-utils/src/array/includes.ts +41 -1
  137. package/packages/perf-utils/src/array/includesNaN.ts +32 -1
  138. package/packages/perf-utils/src/array/index.ts +7 -1
  139. package/packages/perf-utils/src/array/map.ts +52 -1
  140. package/packages/player-ui/README.md +1 -1
  141. package/packages/player-ui/src/CurrentTime.tsx +2 -2
  142. package/packages/player-ui/src/Duration.tsx +2 -2
  143. package/packages/player-ui/src/PauseButton.tsx +0 -8
  144. package/packages/player-ui/src/PlayerInteractable.tsx +0 -1
  145. package/packages/player-ui/src/PlayerTime.tsx +1 -3
  146. package/packages/player-ui/src/PlayerUI.tsx +35 -68
  147. package/packages/player-ui/src/RemainingTime.tsx +2 -2
  148. package/packages/player-ui/src/Seekbar.tsx +18 -110
  149. package/packages/player-ui/src/Seeking.ts +16 -57
  150. package/packages/player-ui/src/Subtitles.tsx +2 -2
  151. package/packages/player-ui/src/index.ts +0 -1
  152. package/packages/player-ui/src/mocks.ts +8 -32
  153. package/packages/player-ui/src/timeUtils.ts +3 -3
  154. package/packages/player-ui/src/types.ts +3 -9
  155. package/packages/router/README.md +0 -1
  156. package/packages/router/src/Route.tsx +27 -61
  157. package/packages/router/src/Router.tsx +14 -63
  158. package/packages/router/src/history.ts +1 -8
  159. package/packages/router/src/index.ts +1 -1
  160. package/packages/router/src/utils.ts +4 -9
  161. package/packages/sass-utils/src/linear-gradient.scss +4 -9
  162. package/packages/sass-utils/src/scale.1080.scss +1 -3
  163. package/packages/sass-utils/src/scale.720.scss +1 -1
  164. package/packages/time/README.md +1 -4
  165. package/packages/time/src/Time.ts +13 -35
  166. package/packages/time/src/constants.ts +0 -1
  167. package/packages/toast/src/ToastService.tsx +5 -16
  168. package/packages/types-bigscreen-jsx/README.md +4 -5
  169. package/packages/types-bigscreen-jsx/index.d.ts +67 -72
  170. package/packages/utils/README.md +0 -27
  171. package/packages/utils/src/elementUtils.ts +0 -25
  172. package/packages/utils/src/index.ts +0 -8
  173. package/packages/utils/src/scaledImage.ts +3 -6
  174. package/packages/utils/src/textUtils.ts +14 -46
  175. package/packages/utils/src/wait.ts +1 -3
  176. package/packages/utils/src/xhr/xhrSend.ts +1 -3
  177. package/packages/utils/src/xhr/xhrSendRetry.ts +1 -3
  178. package/packages/zapping/src/ChannelZapping.ts +0 -9
  179. package/packages/zapping/src/Zapping.tsx +0 -10
  180. package/ci/is_ci_job_skippable.sh +0 -153
  181. package/packages/analytics/README.md +0 -8
  182. package/packages/analytics/src/A.ts +0 -1
  183. package/packages/analytics/src/Analytics.ts +0 -1
  184. package/packages/analytics/src/analyticsOnScroll.ts +0 -1
  185. package/packages/analytics/src/clients/ConsoleAnalytics/ConsoleAnalytics.ts +0 -1
  186. package/packages/analytics/src/clients/ConsoleAnalytics/index.ts +0 -1
  187. package/packages/analytics/src/clients/GoogleAnalytics/GoogleAnalytics.ts +0 -196
  188. package/packages/analytics/src/clients/GoogleAnalytics/constants.ts +0 -126
  189. package/packages/analytics/src/clients/GoogleAnalytics/getUrl.ts +0 -17
  190. package/packages/analytics/src/clients/GoogleAnalytics/index.ts +0 -2
  191. package/packages/analytics/src/clients/GoogleAnalytics/interface.ts +0 -82
  192. package/packages/analytics/src/clients/GoogleAnalytics/mapPayload.ts +0 -51
  193. package/packages/analytics/src/clients/GoogleAnalytics/prepareBody.ts +0 -14
  194. package/packages/analytics/src/clients/TealiumAnalytics/TealiumAnalytics.ts +0 -181
  195. package/packages/analytics/src/clients/TealiumAnalytics/constants.ts +0 -106
  196. package/packages/analytics/src/clients/TealiumAnalytics/findForLanguage.ts +0 -9
  197. package/packages/analytics/src/clients/TealiumAnalytics/index.ts +0 -4
  198. package/packages/analytics/src/clients/TealiumAnalytics/interface.ts +0 -35
  199. package/packages/analytics/src/clients/TealiumAnalytics/mappers/__mocks__/mediaPayload.ts +0 -72
  200. package/packages/analytics/src/clients/TealiumAnalytics/mappers/helper.ts +0 -36
  201. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppError.ts +0 -13
  202. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppOpen.ts +0 -13
  203. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteAdd.ts +0 -11
  204. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteRemove.ts +0 -11
  205. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerClose.ts +0 -15
  206. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerOpen.ts +0 -15
  207. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSceneView.ts +0 -18
  208. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearch.ts +0 -18
  209. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchFailed.ts +0 -8
  210. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchSuccess.ts +0 -8
  211. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoPause.ts +0 -15
  212. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoProgress.ts +0 -18
  213. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoResume.ts +0 -15
  214. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStart.ts +0 -15
  215. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStop.ts +0 -15
  216. package/packages/analytics/src/clients/TealiumAnalytics/types.ts +0 -161
  217. package/packages/analytics/src/clients/TwentyFourIQ/TwentyFourIQClient.ts +0 -107
  218. package/packages/analytics/src/clients/TwentyFourIQ/constants.ts +0 -111
  219. package/packages/analytics/src/clients/TwentyFourIQ/helper.ts +0 -34
  220. package/packages/analytics/src/clients/TwentyFourIQ/index.ts +0 -2
  221. package/packages/analytics/src/clients/TwentyFourIQ/interface.ts +0 -34
  222. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdEvent.ts +0 -20
  223. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBase.ts +0 -24
  224. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBuffering.ts +0 -15
  225. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerClose.ts +0 -25
  226. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerOpen.ts +0 -17
  227. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapSceneView.ts +0 -15
  228. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapScroll.ts +0 -17
  229. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoComplete.ts +0 -22
  230. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoPause.ts +0 -25
  231. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoProgress.ts +0 -25
  232. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStart.ts +0 -34
  233. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStop.ts +0 -32
  234. package/packages/analytics/src/clients/TwentyFourIQ/types.ts +0 -132
  235. package/packages/analytics/src/constants.ts +0 -1
  236. package/packages/analytics/src/index.ts +0 -3
  237. package/packages/analytics/src/interface.ts +0 -1
  238. package/packages/analytics/src/utils/generateSessionId.ts +0 -8
  239. package/packages/device/src/driver/index.firetv.ts +0 -1
  240. package/packages/device/src/driver/index.smartcast.tv.ts +0 -1
  241. package/packages/driver-base/src/types/AdInfo.ts +0 -5
  242. package/packages/driver-base/src/types/InAppPurchase.ts +0 -25
  243. package/packages/driver-firetv/src/DeviceFireTV.ts +0 -91
  244. package/packages/driver-firetv/src/__mocks__/javaScriptBridge.ts +0 -45
  245. package/packages/driver-firetv/src/index.ts +0 -1
  246. package/packages/driver-firetv/src/types.ts +0 -1
  247. package/packages/driver-smartcast/src/DeviceSmartCast.ts +0 -394
  248. package/packages/driver-smartcast/src/__mocks__/api.ts +0 -79
  249. package/packages/driver-smartcast/src/index.ts +0 -1
  250. package/packages/driver-smartcast/src/keymap.ts +0 -9
  251. package/packages/driver-smartcast/src/types.ts +0 -111
  252. package/packages/focus/src/hasFocus.ts +0 -36
  253. package/packages/jsx/src/test-utils/keyup.ts +0 -27
  254. package/packages/keyboard/src/WhitelabelKeyboard/layouts/arabic.ts +0 -27
  255. package/packages/keyboard/src/WhitelabelKeyboard/layouts/burmese.ts +0 -27
  256. package/packages/keyboard/src/WhitelabelKeyboard/layouts/dari.ts +0 -28
  257. package/packages/keyboard/src/WhitelabelKeyboard/layouts/korean.ts +0 -26
  258. package/packages/keyboard/src/WhitelabelKeyboard/layouts/pashto.ts +0 -27
  259. package/packages/keyboard/src/WhitelabelKeyboard/layouts/persian.ts +0 -27
  260. package/packages/keyboard/src/WhitelabelKeyboard/layouts/russian.ts +0 -27
  261. package/packages/keyboard/src/WhitelabelKeyboard/layouts/spanish.ts +0 -26
  262. package/packages/keyboard/src/WhitelabelKeyboard/layouts/tibetan.ts +0 -26
  263. package/packages/keyboard/src/WhitelabelKeyboard/layouts/turkish.ts +0 -26
  264. package/packages/keyboard/src/WhitelabelKeyboard/layouts/ukrainian.ts +0 -27
  265. package/packages/keyboard/src/WhitelabelKeyboard/layouts/urdu.ts +0 -26
  266. package/packages/keyboard/src/utils/setInputSelectionRange.ts +0 -10
  267. package/packages/l10n/src/date/de.ts +0 -97
  268. package/packages/l10n/src/date/es.ts +0 -71
  269. package/packages/l10n/src/date/fr.ts +0 -94
  270. package/packages/l10n/src/date/he.ts +0 -101
  271. package/packages/time/src/adapters/24iMediaTimeApi.ts +0 -47
  272. package/packages/time/src/services/24iMediaTimeApi/24iMediaTimeApi.ts +0 -43
  273. package/packages/time/src/services/24iMediaTimeApi/index.ts +0 -6
  274. package/packages/utils/src/forceReflow.ts +0 -14
  275. package/packages/utils/src/keyPress/index.ts +0 -6
  276. package/packages/utils/src/keyPress/keyPressSimulator.ts +0 -74
  277. package/packages/utils/src/keyPress/simulateKeyPress.ts +0 -25
  278. package/utils/release/release.ts +0 -156
@@ -1,7 +1,6 @@
1
1
  import { filter, find, findIndex, map } from '@24i/bigscreen-sdk/perf-utils/array';
2
2
  import { Asset } from '@24i/smartapps-datalayer/models';
3
3
  import { i18n } from '@24i/bigscreen-sdk/i18n';
4
- import { MINUTE_IN_MS } from '@24i/bigscreen-sdk/utils/timeConstants';
5
4
  import { isStartVisible, isEndVisible, isOverFullWidth } from './utils';
6
5
  import {
7
6
  DataRange,
@@ -15,7 +14,6 @@ const START = 0;
15
14
  const END = 1;
16
15
 
17
16
  const TIMELINE_WIDTHS_TO_FETCH = 3;
18
- const MINIMUM_BREAK_LENGTH = MINUTE_IN_MS;
19
17
 
20
18
  export class DataManager implements IDataManager {
21
19
  private readonly data: Asset[] = [];
@@ -86,115 +84,50 @@ export class DataManager implements IDataManager {
86
84
  return [data[0].program!.startTime, data[data.length - 1].program!.endTime] as DataRange;
87
85
  }
88
86
 
89
- private isInterceptingDataRanges = (firstDataRange: DataRange, secondDataRange: DataRange) => (
90
- (firstDataRange[START] < secondDataRange[END]
91
- && firstDataRange[START] > secondDataRange[START])
92
- || (secondDataRange[START] < firstDataRange[END]
93
- && secondDataRange[START] > firstDataRange[START])
94
- );
95
-
96
- private findRangeBeforeAndAfter = (currentRange: DataRange) => {
97
- const rangeAfterIndex = findIndex(
98
- this.dataRanges,
99
- (dataRange) => dataRange[END] >= currentRange[END],
100
- );
101
- if (rangeAfterIndex === -1) {
102
- return {
103
- rangeAfter: undefined,
104
- rangeBefore: this.dataRanges[this.dataRanges.length - 1],
105
- };
106
- }
107
- const rangeAfter = this.dataRanges[rangeAfterIndex];
108
- const rangeBefore = this.dataRanges[rangeAfterIndex - 1];
109
- return { rangeAfter, rangeBefore };
110
- };
111
-
112
- private generateDataRangesForward = (start: number, end: number, cellSize: number) => {
113
- const dataRanges: DataRange[] = [[start, start + cellSize]];
114
- let currentStart = start + cellSize;
115
- let currentEnd = currentStart + cellSize;
116
- while (currentStart < end) {
117
- if (currentEnd >= end) {
118
- dataRanges.push([currentStart, end]);
119
- break;
120
- }
121
- dataRanges.push([currentStart, currentEnd]);
122
- currentStart += cellSize;
123
- currentEnd += cellSize;
124
- }
125
- return dataRanges;
126
- };
127
-
128
- private generateDataRangesBackward = (start: number, end: number, cellSize: number) => {
129
- const dataRanges: DataRange[] = [[start - cellSize, start]];
130
- let currentEnd = start - cellSize;
131
- let currentStart = currentEnd - cellSize;
132
- while (currentEnd > start) {
133
- if (currentStart <= start) {
134
- dataRanges.push([start, currentEnd]);
135
- break;
136
- }
137
- dataRanges.push([currentStart, currentEnd]);
138
- currentStart -= cellSize;
139
- currentEnd -= cellSize;
140
- }
141
- return dataRanges;
142
- };
143
-
144
- /* eslint-disable complexity */
87
+ // TODO: Wait for fixes from @thepretiso before looking at this.
145
88
  // eslint-disable-next-line sonarjs/cognitive-complexity
146
89
  private getRangesMissingFromDataInRange([start, end]: DataRange) {
147
- const currentRange = [start, end] as DataRange;
148
- const cellSize = TIMELINE_WIDTHS_TO_FETCH * this.timelineWidthMs;
149
- if (this.dataRanges.length === 0) return [currentRange] as DataRange[];
150
- const { rangeBefore, rangeAfter } = this.findRangeBeforeAndAfter(currentRange);
151
- if (rangeAfter == null) {
152
- const lastDataRange = this.dataRanges[this.dataRanges.length - 1];
153
- if (this.isInterceptingDataRanges(lastDataRange, currentRange)) {
154
- if (end > lastDataRange[END]) {
155
- return this.generateDataRangesForward(lastDataRange[END], end, cellSize);
156
- }
157
- if (start < lastDataRange[START]) {
158
- return this.generateDataRangesBackward(start, lastDataRange[START], cellSize);
159
- }
160
- }
161
- return [currentRange] as DataRange[];
90
+ const rangesLength = this.dataRanges.length;
91
+ if (this.dataRanges.length === 0) return [[start, end]] as DataRange[];
92
+ const firstRangeFrom = this.dataRanges[0][START];
93
+ if (end <= firstRangeFrom) return [[start, end]] as DataRange[];
94
+ if (start < firstRangeFrom && end <= this.dataRanges[0][END]) {
95
+ return [
96
+ [firstRangeFrom - TIMELINE_WIDTHS_TO_FETCH * this.timelineWidthMs, firstRangeFrom],
97
+ ] as DataRange[];
162
98
  }
163
- if (rangeBefore == null) {
164
- const firstDataRange = this.dataRanges[0];
165
- if (this.isInterceptingDataRanges(firstDataRange, currentRange)) {
166
- if (end > firstDataRange[END]) {
167
- return this.generateDataRangesForward(firstDataRange[END], end, cellSize);
99
+ const lastRangeTo = this.dataRanges[rangesLength - 1][END];
100
+ if (end > lastRangeTo && start <= lastRangeTo) {
101
+ return [
102
+ [lastRangeTo, lastRangeTo + TIMELINE_WIDTHS_TO_FETCH * this.timelineWidthMs],
103
+ ] as DataRange[];
104
+ }
105
+ const ranges: DataRange[] = [];
106
+ let newRange: DataRange = [start, end];
107
+ for (let i = 0; i < rangesLength; i++) {
108
+ const [rangeFrom, rangeTo] = this.dataRanges[i];
109
+ // eslint-disable-next-line no-continue
110
+ if (start >= rangeTo) continue;
111
+ if (start < rangeFrom) {
112
+ if (end <= rangeFrom) {
113
+ if (newRange[START] !== newRange[END]) ranges.push(newRange);
114
+ return ranges;
168
115
  }
169
- if (start < firstDataRange[START]) {
170
- return this.generateDataRangesBackward(firstDataRange[START], start, cellSize);
116
+ newRange[END] = rangeFrom;
117
+ if (newRange[START] !== newRange[END]) ranges.push(newRange);
118
+ if (end <= rangeTo) {
119
+ return ranges;
171
120
  }
121
+ newRange = [rangeTo, end];
122
+ } else if (start < rangeTo) {
123
+ if (end <= rangeTo) {
124
+ return ranges;
125
+ }
126
+ newRange = [rangeTo, end];
172
127
  }
173
- return [currentRange] as DataRange[];
174
- }
175
- const rangeAfterFrom = rangeAfter[START];
176
- const rangeBeforeTo = rangeBefore[END];
177
- // Ranges are collapsed
178
- if (rangeBeforeTo === rangeAfterFrom) return [];
179
- // Both are not null and don't intercept
180
- if (
181
- !this.isInterceptingDataRanges(rangeAfter, currentRange)
182
- && !this.isInterceptingDataRanges(rangeBefore, currentRange)
183
- ) {
184
- return [currentRange];
185
- }
186
- // Left intercepts
187
- if (this.isInterceptingDataRanges(rangeBefore, currentRange)) {
188
- return [rangeBefore, ...this.generateDataRangesForward(rangeBeforeTo, end, cellSize)];
189
- }
190
- // Right intercepts
191
- if (this.isInterceptingDataRanges(rangeAfter, currentRange)) {
192
- return [
193
- ...this.generateDataRangesBackward(rangeAfterFrom, start, cellSize),
194
- rangeAfter,
195
- ];
196
128
  }
197
- return [currentRange] as DataRange[];
129
+ if (newRange[START] !== newRange[END]) ranges.push(newRange);
130
+ return ranges;
198
131
  }
199
132
 
200
133
  private getMissingRanges(range: DataRange) {
@@ -278,7 +211,7 @@ export class DataManager implements IDataManager {
278
211
  try {
279
212
  fetchedData = await this.fetchPrograms(this.channel, start, end);
280
213
  } catch (e) {
281
- fetchedData = [];
214
+ return null;
282
215
  }
283
216
  this.fillInSpaces([start, end], fetchedData);
284
217
  if (fetchedData.length === 0) return null;
@@ -357,15 +290,11 @@ export class DataManager implements IDataManager {
357
290
  for (let i = data.length - 1; i > 0; i--) {
358
291
  const current = data[i];
359
292
  const previous = data[i - 1];
360
- const breakLength = current.program!.startTime - previous.program!.endTime;
361
- if (breakLength > 0 && breakLength >= MINIMUM_BREAK_LENGTH) {
362
- data.splice(
363
- i,
364
- 0,
293
+ if (previous.program!.endTime < current.program!.startTime) {
294
+ data.splice(i, 0,
365
295
  this.generateNoDataProgram(
366
296
  previous.program!.endTime, current.program!.startTime,
367
- ),
368
- );
297
+ ));
369
298
  }
370
299
  }
371
300
  }
@@ -1,5 +1,4 @@
1
1
  import { Component, createRef, DeclareProps } from '@24i/bigscreen-sdk/jsx';
2
- import { time } from '@24i/bigscreen-sdk/time';
3
2
  import { Picker } from '@24i/bigscreen-sdk/picker';
4
3
  import { DatePicker as NativeDatePicker } from '@24i/bigscreen-sdk/picker/DatePicker';
5
4
  import { DAY_IN_MS, HOUR_IN_MS, MINUTE_IN_MS, SECOND_IN_MS } from '@24i/bigscreen-sdk/utils';
@@ -45,14 +44,9 @@ const prepareDateData = ({
45
44
  return { selectedValue, from, to, overrides };
46
45
  };
47
46
 
48
- const defaultFormat = (date: Date) => {
49
- const locale = i18n.getLanguage();
50
- return l10n
51
- .date(date.getTime() + time.getTimezoneOffsetMs(), locale)
52
- .toLocaleDateString({
53
- weekday: 'short', day: 'numeric', month: 'short', formatType: 'dateFormatShort',
54
- });
55
- };
47
+ const defaultFormat = (date: Date) => l10n.date(date).toLocaleDateString(
48
+ { weekday: 'short', day: 'numeric', month: 'short' },
49
+ );
56
50
 
57
51
  export class DatePicker extends Component<Props> implements IDatePicker {
58
52
  datePicker = createRef<Picker<number>>();
@@ -6,31 +6,28 @@ import { time } from '@24i/bigscreen-sdk/time';
6
6
  import { HOUR_IN_MS } from '@24i/bigscreen-sdk/utils/timeConstants';
7
7
  import { InternalEpg, Plugin } from '../interface';
8
8
 
9
- const formatTime = (localTimestamp: number) => l10n.date(localTimestamp).toLocaleTimeString(
10
- { hour: 'numeric', minute: '2-digit', formatType: 'timeFormat' },
9
+ const formatTime = (timestamp: number) => l10n.date(timestamp).toLocaleTimeString(
10
+ { hour: 'numeric', minute: '2-digit' },
11
11
  );
12
12
 
13
- const formatDate = (localTimestamp: number) => {
14
- if (time.isToday(localTimestamp)) {
13
+ const formatDate = (timestamp: number) => {
14
+ if (time.isToday(timestamp)) {
15
15
  return i18n.t('date.today');
16
16
  }
17
- if (time.isYesterday(localTimestamp)) {
17
+ if (time.isYesterday(timestamp)) {
18
18
  return i18n.t('date.yesterday');
19
19
  }
20
- if (time.isTomorrow(localTimestamp)) {
20
+ if (time.isTomorrow(timestamp)) {
21
21
  return i18n.t('date.tomorrow');
22
22
  }
23
- return l10n.date(localTimestamp).toLocaleString({
23
+ return l10n.date(timestamp).toLocaleString({
24
24
  weekday: 'short',
25
25
  day: 'numeric',
26
26
  month: 'short',
27
- formatType: 'dateFormatShort',
28
27
  });
29
28
  };
30
29
 
31
- const formatDatetime = (localTimestamp: number) => (
32
- `${formatDate(localTimestamp)} • ${formatTime(localTimestamp)}`
33
- );
30
+ const formatDatetime = (timestamp: number) => `${formatDate(timestamp)} • ${formatTime(timestamp)}`;
34
31
 
35
32
  type Props = {
36
33
  epg: InternalEpg<any, any, any, any>,
@@ -47,7 +44,7 @@ export class DateToast extends Component<Props> implements Plugin {
47
44
 
48
45
  onScrolledToTimestamp(timestamp: number) {
49
46
  const { epg } = this.props;
50
- const day = formatDatetime(timestamp + time.getTimezoneOffsetMs());
47
+ const day = formatDatetime(timestamp);
51
48
  if (this.lastDay === null) { // we do not want to display it after render and first move
52
49
  this.lastDay = day;
53
50
  return;
@@ -1,5 +1,4 @@
1
1
  import { Component, createRef, setText } from '@24i/bigscreen-sdk/jsx';
2
- import { time } from '@24i/bigscreen-sdk/time';
3
2
  import { l10n } from '@24i/bigscreen-sdk/l10n';
4
3
  import { DayProps as Props, Day as IDay } from './interface';
5
4
 
@@ -16,11 +15,9 @@ export class Day extends Component<Props> implements IDay {
16
15
  }
17
16
 
18
17
  private formatCurrentTimestamp() {
19
- return l10n
20
- .date(this.timestamp + time.getTimezoneOffsetMs())
21
- .toLocaleDateString({
22
- weekday: 'long', day: 'numeric', month: 'short', formatType: 'dateFormatShort',
23
- });
18
+ return l10n.date(this.timestamp).toLocaleDateString(
19
+ { weekday: 'long', day: 'numeric', month: 'short' },
20
+ );
24
21
  }
25
22
 
26
23
  render() {
@@ -83,7 +83,6 @@ export class Epg<
83
83
  timeProvider: Date.now,
84
84
  scrollStepMs: HALF_HOUR_IN_MS,
85
85
  timelineSectionWidthMs: HALF_HOUR_IN_MS,
86
- smallestAllowedCellPx: 0,
87
86
  limitFromMs: -Infinity,
88
87
  limitToMs: Infinity,
89
88
  initialChannelIndex: 0,
@@ -298,8 +297,6 @@ export class Epg<
298
297
  return ref;
299
298
  }
300
299
 
301
- isFocusInRows = () => this.focused === 'epg';
302
-
303
300
  focus(options?: FocusOptions) {
304
301
  if (this.focused === 'datepicker') {
305
302
  this.datePickerComponent.current!.focus(options);
@@ -379,11 +376,15 @@ export class Epg<
379
376
  return this.inputEvents.isVerticallyFastScrolling();
380
377
  }
381
378
 
379
+ isFocusInRows = () => {
380
+ return this.focused === 'epg';
381
+ };
382
+
382
383
  render() {
383
384
  const {
384
385
  datePickerProps, timelineWidthPx, channelHeaderWidthPx, scrollStepMs, rowHeightPx,
385
386
  timelineSectionWidthMs, timelineWidthMs, initialChannelIndex, plugins,
386
- navigatableRows, additionalRows, programTextModeResolver, smallestAllowedCellPx,
387
+ navigatableRows, additionalRows, programTextModeResolver,
387
388
  renderDay, renderTime, renderProgram, renderChannelHeader, renderNowLineHeader,
388
389
  } = this.props;
389
390
  return (
@@ -443,7 +444,6 @@ export class Epg<
443
444
  renderChannelHeader={renderChannelHeader}
444
445
  renderProgram={renderProgram}
445
446
  isFocusInRows={this.isFocusInRows}
446
- smallestAllowedCellPx={smallestAllowedCellPx}
447
447
  />
448
448
  <EpgMouseNavigation
449
449
  // @ts-ignore - needed to convert fallback (false) to interface
@@ -1,6 +1,6 @@
1
1
  import { HOUR_IN_MS } from '@24i/bigscreen-sdk/utils/timeConstants';
2
2
  import {
3
- Asset, AssetType, ID, UIElement, UIElementType,
3
+ Asset, ID, UIElement, UIElementType,
4
4
  } from '@24i/smartapps-datalayer/models';
5
5
  import {
6
6
  randomFromRange, getRandomItemFromArray, shuffleArray, getProgramImageUrl,
@@ -56,10 +56,9 @@ const generateChannels = (count: number): Asset[] => {
56
56
  uiElements: [
57
57
  {
58
58
  type: UIElementType.IMAGE,
59
- url: getChannelImageUrl() ?? '',
59
+ url: getChannelImageUrl(),
60
60
  } as UIElement,
61
61
  ],
62
- type: AssetType.CHANNEL,
63
62
  });
64
63
  }
65
64
 
@@ -1,5 +1,4 @@
1
1
  import { l10n } from '@24i/bigscreen-sdk/l10n';
2
- import { time } from '@24i/bigscreen-sdk/time';
3
2
  import { Asset } from '@24i/smartapps-datalayer/models';
4
3
 
5
4
  export const cutString = (string: string, length: number) => {
@@ -17,9 +16,9 @@ export const getSubtitle = (asset: Asset) => (
17
16
  : ''
18
17
  );
19
18
 
20
- const toLocaleTimeString = (timestamp: number) => l10n
21
- .date(timestamp + time.getTimezoneOffsetMs())
22
- .toLocaleTimeString({ hour: 'numeric', minute: '2-digit', formatType: 'timeFormat' });
19
+ const toLocaleTimeString = (timestamp: number) => l10n.date(timestamp).toLocaleTimeString(
20
+ { hour: 'numeric', minute: '2-digit' },
21
+ );
23
22
 
24
23
  export const getBroadcastTime = (asset: Asset) => {
25
24
  const start = toLocaleTimeString(asset.program!.startTime);
@@ -109,8 +109,7 @@ export class Row<
109
109
 
110
110
  render() {
111
111
  const {
112
- timelineWidthMs, timestamp, time,
113
- pixelInMs, timelineWidthPx, smallestAllowedCellPx,
112
+ timelineWidthMs, timelineWidthPx, timestamp, time, pixelInMs,
114
113
  programTextModeResolver, onMouseEnter, renderProgram,
115
114
  } = this.props;
116
115
  return (
@@ -127,7 +126,6 @@ export class Row<
127
126
  onItemPress={this.onItemPress}
128
127
  onMouseEnter={onMouseEnter}
129
128
  renderProgram={renderProgram}
130
- smallestAllowedCellPx={smallestAllowedCellPx}
131
129
  />
132
130
  );
133
131
  }
@@ -1,5 +1,4 @@
1
1
  import { Component, createRef, setText } from '@24i/bigscreen-sdk/jsx';
2
- import { time } from '@24i/bigscreen-sdk/time';
3
2
  import { l10n } from '@24i/bigscreen-sdk/l10n';
4
3
  import { offsetPosition } from '@24i/bigscreen-sdk/utils';
5
4
  import { TimelineSectionProps as Props, TimelineSection as ITimelineSection } from './interface';
@@ -24,9 +23,7 @@ export class TimelineSection extends Component<Props> implements ITimelineSectio
24
23
  }
25
24
 
26
25
  private formatCurrentTimestamp() {
27
- return l10n
28
- .date(this.timestamp + time.getTimezoneOffsetMs())
29
- .toLocaleTimeString({ hour: 'numeric', minute: '2-digit', formatType: 'timeFormat' });
26
+ return l10n.date(this.timestamp).toLocaleTimeString({ hour: 'numeric', minute: '2-digit' });
30
27
  }
31
28
 
32
29
  render() {
@@ -180,8 +180,7 @@ export class CellsManager<
180
180
 
181
181
  private addCell(item: Asset) {
182
182
  const {
183
- time, smallestAllowedCellPx,
184
- programTextModeResolver, onMouseEnter, onItemPress, onFocusChange, renderProgram,
183
+ time, programTextModeResolver, onMouseEnter, onItemPress, onFocusChange, renderProgram,
185
184
  } = this.props;
186
185
  const cell = createRef<ICell<T>>();
187
186
  this.mountBefore((
@@ -196,7 +195,6 @@ export class CellsManager<
196
195
  onFocusChange={onFocusChange}
197
196
  onMouseEnter={onMouseEnter}
198
197
  renderProgram={renderProgram}
199
- smallestAllowedCellPx={smallestAllowedCellPx}
200
198
  />
201
199
  ), this.endLoadingCell.current!.div);
202
200
  this.cells.push(cell);
@@ -243,7 +241,7 @@ export class CellsManager<
243
241
 
244
242
  render() {
245
243
  const {
246
- timelineWidthPx, smallestAllowedCellPx, time, dataGetter, programTextModeResolver,
244
+ timelineWidthPx, time, dataGetter, programTextModeResolver,
247
245
  onMouseEnter, onItemPress, onFocusChange, renderProgram,
248
246
  } = this.props;
249
247
  const visibleData = dataGetter(this.getRange());
@@ -259,7 +257,6 @@ export class CellsManager<
259
257
  onFocusChange={onFocusChange}
260
258
  onMouseEnter={onMouseEnter}
261
259
  renderProgram={renderProgram}
262
- smallestAllowedCellPx={smallestAllowedCellPx}
263
260
  isLoading
264
261
  />
265
262
  {map(visibleData, (item) => {
@@ -277,7 +274,6 @@ export class CellsManager<
277
274
  onFocusChange={onFocusChange}
278
275
  onMouseEnter={onMouseEnter}
279
276
  renderProgram={renderProgram}
280
- smallestAllowedCellPx={smallestAllowedCellPx}
281
277
  />
282
278
  );
283
279
  })}
@@ -292,7 +288,6 @@ export class CellsManager<
292
288
  onMouseEnter={onMouseEnter}
293
289
  renderProgram={renderProgram}
294
290
  isLoading
295
- smallestAllowedCellPx={smallestAllowedCellPx}
296
291
  />
297
292
  </div>
298
293
  );
@@ -465,8 +465,7 @@ export class RowsManager<
465
465
 
466
466
  render() {
467
467
  const {
468
- timelineWidthMs, timestamp, time, scrollStepMs,
469
- pixelInMs, timelineWidthPx, smallestAllowedCellPx,
468
+ timelineWidthMs, timelineWidthPx, timestamp, time, scrollStepMs, pixelInMs,
470
469
  programTextModeResolver, onItemPress, onMouseEnter, renderProgram, renderChannelHeader,
471
470
  } = this.props;
472
471
  const visibleData = this.getVisibleChannels();
@@ -493,7 +492,6 @@ export class RowsManager<
493
492
  onFocusChange={this.onFocusChange}
494
493
  onMouseEnter={onMouseEnter}
495
494
  renderProgram={renderProgram}
496
- smallestAllowedCellPx={smallestAllowedCellPx}
497
495
  />
498
496
  ))}
499
497
  </Scroller>
@@ -241,14 +241,6 @@ type ScrollStepMsProp = {
241
241
  scrollStepMs: number,
242
242
  };
243
243
 
244
- type SmallestAllowedCellPxProp = {
245
- /**
246
- * If the width of the cell is smaller than this the cell will have a special
247
- * class `too-small`. Value in pixels.
248
- */
249
- smallestAllowedCellPx: number,
250
- };
251
-
252
244
  type IdleTimerMsProp = {
253
245
  /**
254
246
  * The number of milliseconds of inactivity (no input) after which EPG starts jumps
@@ -831,7 +823,6 @@ export type RowsManagerProps<
831
823
  & RenderChannelHeaderProp<T>
832
824
  & RenderProgramProp<U>
833
825
  & IsFocusInRowsProp
834
- & SmallestAllowedCellPxProp
835
826
  );
836
827
 
837
828
  /**
@@ -942,7 +933,6 @@ export type RowProps<
942
933
  & TimestampProp
943
934
  & TimeProp
944
935
  & ScrollStepMsProp
945
- & SmallestAllowedCellPxProp
946
936
  & ProgramTextModeResolverProp
947
937
  & OnItemPressProp<T>
948
938
  & OnMouseEnterProp
@@ -1056,7 +1046,6 @@ export type CellsManagerProps<
1056
1046
  & ProgramTextModeResolverProp
1057
1047
  & OnMouseEnterProp
1058
1048
  & RenderProgramProp<T>
1059
- & SmallestAllowedCellPxProp
1060
1049
  );
1061
1050
 
1062
1051
  /**
@@ -1144,7 +1133,6 @@ export type CellProps<
1144
1133
  & ProgramTextModeResolverProp
1145
1134
  & OnMouseEnterProp
1146
1135
  & RenderProgramProp<T>
1147
- & SmallestAllowedCellPxProp
1148
1136
  );
1149
1137
 
1150
1138
  /**
@@ -1287,7 +1275,6 @@ export type Props<
1287
1275
  & Partial<InitialTimestampProp>
1288
1276
  & Partial<InitialChannelIndexProp>
1289
1277
  & Partial<ProgramTextModeResolverProp>
1290
- & Partial<SmallestAllowedCellPxProp>
1291
1278
  & OnItemPressProp<U>
1292
1279
  & Partial<OnFocusChangeProp<U>>
1293
1280
  & Partial<OnScrolledToTimestampProp>
@@ -1 +1,56 @@
1
- export * from '@24i/appstage-shared-events-manager/dist/EventsManager';
1
+ import { forEach, map } from '@24i/bigscreen-sdk/perf-utils/array';
2
+
3
+ type PayloadOf<T> = T extends (payload: infer Payload) => any ? Payload : never;
4
+
5
+ export type EventMapType = { [key: string]: (payload: any) => void };
6
+
7
+ export interface IEvents<EventMap extends EventMapType> {
8
+ addEventListener: <K extends keyof EventMap>(
9
+ eventName: K,
10
+ listener: EventMap[K],
11
+ ) => void,
12
+ removeEventListener: <K extends keyof EventMap>(
13
+ eventName: K,
14
+ listener: EventMap[K],
15
+ ) => void,
16
+ triggerEvent: <K extends keyof EventMap>(
17
+ eventName: K,
18
+ payload: PayloadOf<EventMap[K]>,
19
+ ) => void,
20
+ }
21
+
22
+ export class EventsManager<EventMap extends EventMapType> implements IEvents<EventMap> {
23
+ eventListeners: Partial<{
24
+ [key in keyof EventMap]: EventMap[key][]
25
+ }> = {};
26
+
27
+ addEventListener = <K extends keyof EventMap>(
28
+ eventName: K,
29
+ listener: EventMap[K],
30
+ ): void => {
31
+ if (!this.eventListeners[eventName]) this.eventListeners[eventName] = [];
32
+ const listeners = this.eventListeners[eventName] as EventMap[K][];
33
+ listeners.push(listener);
34
+ };
35
+
36
+ removeEventListener = <K extends keyof EventMap>(
37
+ eventName: K,
38
+ listener: EventMap[K],
39
+ ): void => {
40
+ const listeners = this.eventListeners[eventName] as EventMap[K][] | undefined;
41
+ if (!listeners) return;
42
+ const index = listeners.indexOf(listener);
43
+ if (index !== -1) listeners.splice(index, 1);
44
+ };
45
+
46
+ triggerEvent = <K extends keyof EventMap>(
47
+ eventName: K,
48
+ payload?: PayloadOf<EventMap[K]>,
49
+ ): void => {
50
+ const eventListeners = this.eventListeners[eventName] as EventMap[K][] | undefined;
51
+ if (!eventListeners) return;
52
+ // In case listener removes itself during listening we need loop on a copy
53
+ const listeners = map(eventListeners, (l) => l);
54
+ forEach(listeners, (listener) => listener(payload));
55
+ };
56
+ }
@@ -14,13 +14,11 @@ IFocusable is an interface that should be implemented by anything that can be fo
14
14
  interface IFocusable {
15
15
  focus(options?: FocusOptions): void,
16
16
  hasDom?(element: HTMLElement): boolean,
17
- hasFocus?(): boolean,
18
17
  }
19
18
  ```
20
19
  - focus is the main function that is called when focusing component/element.
21
20
  - hasDom is optional optimization for components to help Layout components locate the currently
22
21
  focused child.
23
- - hasFocus is optional check if the component has focus inside or is itself focused.
24
22
 
25
23
  ## Layout components
26
24
  - Vertical: Use it to create focus between elements vertically (up/down)
@@ -42,7 +40,6 @@ to the focused element and its index. Ideal place to change other elements
42
40
  - onBeforeFocusChange: Optional callback just before focus change. It receives a reference
43
41
  to the focused element and its index. Ideal place for preparing for the change
44
42
  (e.g. moving the container to fit new element in the screen)
45
- - circular: makes focus circular, e.g. when pressing left at leftmost element focus will go to rightmost element
46
43
  - dir: Optional forceful setting of the component direction. Defaults to `'auto'` which follows
47
44
  the direction of the app.
48
45
  `'ltr'` always forces left-to-right layout,
@@ -131,16 +128,6 @@ const matrix = [
131
128
  ];
132
129
  ```
133
130
 
134
- ## Prevent blur on long press
135
- When the user holds a navigation key, he usually scrolls to the boundary of the layout
136
- and then releases the key. This operation is very quick and most of the time he releases
137
- the key too late, so the keydown event from the layout will propagate to another component
138
- or another layout. In some cases, we don't want this behavior and for those situations and
139
- to have better control above the layout navigation, there is a prop `preventBlurOnLongPress`.
140
- When the user scrolls to the boundary of the layout while holding a navigation key,
141
- he needs to release the key and press it again to propagate the event higher and focus
142
- another component or layout.
143
-
144
131
  ## Limitations
145
132
  For the div to properly receive keydown events it needs to have set `tabIndex`. If you do not set `tabIndex` then it won't receive keydown events and those will not propagate to the Vertical/Horizontal component.
146
133
 
@@ -315,11 +302,6 @@ Method to focus between multiple focusable components. The first existing (non-n
315
302
  const focusFirstExisting = (...toFocus: Reference<IFocusable>[]) => () => void;
316
303
  ```
317
304
 
318
- If you need to enable `preventScroll` in element focus options, wrap your reference with `preventScrollOnFocus` function like this:
319
- ```ts
320
- focusFirstExisting(this.navigation, preventScrollOnFocus(this.div))
321
- ```
322
-
323
305
  ## refocusAfterHashChange
324
306
  When the hash is changed, the browser automatically blurs the currently focused element and focuses body.
325
307
  This can be problematic when the overlay component is active (development tools, modals). Focus is lost and
@@ -331,18 +313,3 @@ outside of the component and not focused.
331
313
  ```ts
332
314
  const refocusAfterHashChange = (focusWrapperOrReference: HTMLElement | Reference<HTMLElement>) => void;
333
315
  ```
334
-
335
- ## hasFocus
336
- Test if the element (or element in the reference) has the `activeElement` inside or optionally,
337
- if the element itself is the `activeElement`.
338
-
339
- ```ts
340
- const hasFocus = (elementOrReference: HTMLElement | Reference<HTMLElement>, includeElementItself = false) => boolean;
341
- ```
342
-
343
- ## isFocused
344
- Test if the element (or element in the reference) is the `activeElement`.
345
-
346
- ```ts
347
- const isFocused = (elementOrReference: HTMLElement | Reference<HTMLElement>) => boolean;
348
- ```
@@ -1,5 +1,4 @@
1
1
  export interface IFocusable {
2
2
  focus(options?: FocusOptions): void,
3
3
  hasDom?(element: HTMLElement): boolean,
4
- hasFocus?(): boolean,
5
4
  }