@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.
- package/README.md +3 -2
- package/package.json +34 -53
- package/packages/adobe-heartbeat/src/AdobeHeartbeat.ts +9 -9
- package/packages/async-image/src/AsyncImage.tsx +10 -15
- package/packages/developer-tools/PlayerDebugWindow/README.md +1 -1
- package/packages/developer-tools/src/DeveloperToolsService/DeveloperToolsList.tsx +0 -11
- package/packages/developer-tools/src/PlayerDebugWindow/PlayerDebugWindow.tsx +5 -5
- package/packages/developer-tools/src/PlayerDebugWindow/constants.ts +0 -15
- package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoDetail.tsx +1 -2
- package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoProvider.ts +5 -57
- package/packages/developer-tools/src/TechnicalInfo/__mocks__/Device.ts +0 -12
- package/packages/developer-tools/src/TechnicalInfo/translations.ts +0 -8
- package/packages/device/src/getKeyDigit.ts +2 -2
- package/packages/device/src/resolver/resolver.ts +5 -18
- package/packages/digital-clock/src/DigitalClock.tsx +4 -15
- package/packages/driver-androidtv/src/DeviceAndroidTV.ts +9 -92
- package/packages/driver-androidtv/src/__mocks__/javaScriptBridge.ts +5 -38
- package/packages/driver-androidtv/src/index.ts +0 -1
- package/packages/driver-androidtv/src/keymap.ts +0 -18
- package/packages/driver-androidtv/src/types.ts +16 -144
- package/packages/driver-base/src/DeviceBase.ts +2 -80
- package/packages/driver-base/src/KeyMap/Key.ts +1 -8
- package/packages/driver-base/src/KeyMap/KeyMap.ts +0 -4
- package/packages/driver-base/src/KeyMap/interface.ts +0 -1
- package/packages/driver-base/src/KeyMap/overrideValues.ts +1 -2
- package/packages/driver-base/src/__mocks__/DeviceBase.ts +0 -24
- package/packages/driver-base/src/__mocks__/keyMap.ts +0 -1
- package/packages/driver-base/src/index.ts +0 -3
- package/packages/driver-base/src/types/DeviceEvent.ts +0 -2
- package/packages/driver-base/src/types/KeycodeKeyMap.ts +0 -1
- package/packages/driver-browser/src/DeviceBrowser.ts +0 -26
- package/packages/driver-browser/src/keymap.ts +0 -8
- package/packages/driver-entone/src/DeviceEntone.ts +1 -31
- package/packages/driver-entone/src/keymap.ts +0 -1
- package/packages/driver-hbbtv/src/DeviceHbbTV.ts +0 -26
- package/packages/driver-kreatv/src/DeviceKreaTV.ts +0 -26
- package/packages/driver-saphi/src/DeviceSaphi.ts +0 -26
- package/packages/driver-tizen/src/DeviceTizen.ts +7 -126
- package/packages/driver-tizen/src/ITizen.ts +202 -15116
- package/packages/driver-tizen/src/IWebapis.ts +87 -8643
- package/packages/driver-tizen/src/TizenKeys.ts +2 -4
- package/packages/driver-tizen/src/__mocks__/tizen.ts +8 -7
- package/packages/driver-tizen/src/constants.ts +195 -1
- package/packages/driver-tizen/src/types.ts +14 -0
- package/packages/driver-vidaa/src/DeviceVidaa.ts +2 -29
- package/packages/driver-vidaa/src/__mocks__/vidaa.ts +1 -1
- package/packages/driver-vidaa/src/keymap.ts +0 -2
- package/packages/driver-webos/src/DeviceWebos.ts +0 -55
- package/packages/driver-webos/src/__mocks__/webos.ts +0 -33
- package/packages/driver-webos/src/constants.ts +0 -1
- package/packages/driver-webos/src/keymap.ts +1 -2
- package/packages/driver-webos/src/types.ts +0 -30
- package/packages/driver-xbox/src/DeviceXbox.ts +1 -30
- package/packages/driver-xbox/src/keymap.ts +1 -1
- package/packages/epg/README.md +1 -3
- package/packages/epg/src/v2/Cell.tsx +2 -16
- package/packages/epg/src/v2/DataManager.ts +41 -112
- package/packages/epg/src/v2/DatePicker.tsx +3 -9
- package/packages/epg/src/v2/DateToast/DateToast.tsx +9 -12
- package/packages/epg/src/v2/Day.tsx +3 -6
- package/packages/epg/src/v2/Epg.tsx +5 -5
- package/packages/epg/src/v2/MockGenerator/generator.ts +2 -3
- package/packages/epg/src/v2/ProgramInfo/utils.ts +3 -4
- package/packages/epg/src/v2/Row.tsx +1 -3
- package/packages/epg/src/v2/TimelineSection.tsx +1 -4
- package/packages/epg/src/v2/basic/CellsManager.tsx +2 -7
- package/packages/epg/src/v2/basic/RowsManager.tsx +1 -3
- package/packages/epg/src/v2/interface.ts +0 -13
- package/packages/events-manager/src/EventsManager.ts +56 -1
- package/packages/focus/README.md +0 -33
- package/packages/focus/src/IFocusable.ts +0 -1
- package/packages/focus/src/Layout/Base.tsx +6 -41
- package/packages/focus/src/Layout/Matrix.tsx +19 -51
- package/packages/focus/src/Layout/__test__/Base.spec.ts +180 -0
- package/packages/focus/src/Layout/__test__/Horizontal.spec.ts +94 -0
- package/packages/focus/src/Layout/__test__/Matrix.spec.ts +261 -0
- package/packages/focus/src/Layout/__test__/Vertical.spec.ts +46 -0
- package/packages/focus/src/Layout/__test__/isRtl.spec.ts +23 -0
- package/packages/focus/src/Layout/__test__/shared.ts +19 -0
- package/packages/focus/src/focusFirstExisting.ts +1 -7
- package/packages/focus/src/index.ts +1 -2
- package/packages/gallup/src/Gallup.ts +3 -3
- package/packages/grid/src/Base/Base.tsx +10 -15
- package/packages/grid/src/FirstOnlyGrid/FirstOnlyGrid.tsx +2 -4
- package/packages/grid/src/UnifiedGridController/UnifiedGridController.ts +6 -6
- package/packages/icon/src/Icon.tsx +5 -27
- package/packages/input/README.md +1 -1
- package/packages/input/src/Input.tsx +10 -16
- package/packages/interactable/README.md +1 -2
- package/packages/interactable/src/Interactable.tsx +3 -9
- package/packages/interactable/src/interface.ts +0 -1
- package/packages/jsx/src/index.ts +1 -1
- package/packages/jsx/src/test-utils/index.ts +0 -1
- package/packages/keyboard/src/Backdrop/Backdrop.scss +0 -2
- package/packages/keyboard/src/KeyboardBase.tsx +4 -16
- package/packages/keyboard/src/WhitelabelKeyboard/Keyboard.scss +0 -4
- package/packages/keyboard/src/WhitelabelKeyboard/Keyboard.tsx +20 -28
- package/packages/keyboard/src/WhitelabelKeyboard/_sizes.1080.scss +0 -1
- package/packages/keyboard/src/WhitelabelKeyboard/_sizes.scss +0 -1
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/index.ts +0 -12
- package/packages/keyboard/src/WhitelabelKeyboard/types.ts +0 -1
- package/packages/keyboard/src/utils/caret.ts +8 -5
- package/packages/keyboard/src/utils/input.ts +6 -5
- package/packages/l10n/README.md +0 -18
- package/packages/l10n/src/date/common.ts +6 -18
- package/packages/l10n/src/date/cs.ts +8 -2
- package/packages/l10n/src/date/en-001.ts +3 -3
- package/packages/l10n/src/date/en-common.ts +4 -5
- package/packages/l10n/src/date/en-us.ts +3 -3
- package/packages/l10n/src/date/iso.ts +13 -12
- package/packages/l10n/src/date/types.ts +0 -9
- package/packages/l10n/src/l10n.ts +3 -61
- package/packages/list/src/Base/Base.tsx +9 -19
- package/packages/list/src/Base/interface.ts +2 -2
- package/packages/list/src/BasicList/BasicList.tsx +7 -7
- package/packages/list/src/CenteredList/CenteredList.tsx +2 -2
- package/packages/list/src/CenteredList/controller.ts +1 -0
- package/packages/list/src/EdgeOffsetList/EdgeOffsetList.tsx +10 -10
- package/packages/list/src/FirstOnlyList/FirstOnlyList.tsx +2 -2
- package/packages/list/src/FirstOnlyVariedList/FirstOnlyVariedList.tsx +2 -2
- package/packages/list/src/FixedToEndList/FixedToEndList.tsx +2 -2
- package/packages/list/src/UnifiedListController/UnifiedListController.ts +2 -6
- package/packages/list/src/interface.ts +2 -2
- package/packages/logger/src/loggers/ConsoleLogger/ConsoleLogger.ts +1 -7
- package/packages/logger/src/loggers/SentryLogger/Sentry.ts +0 -1
- package/packages/logger/src/loggers/SentryLogger/SentryLogger.ts +3 -5
- package/packages/menu/src/MenuAndContentContainer/MenuAndContentContainer.tsx +3 -31
- package/packages/menu/src/MenuAndContentContainer/interface.ts +0 -8
- package/packages/modal-service/README.md +1 -4
- package/packages/modal-service/src/ModalService.tsx +5 -29
- package/packages/perf-utils/README.md +120 -1
- package/packages/perf-utils/src/array/filter.ts +54 -1
- package/packages/perf-utils/src/array/find.ts +43 -1
- package/packages/perf-utils/src/array/findIndex.ts +43 -1
- package/packages/perf-utils/src/array/forEach.ts +48 -1
- package/packages/perf-utils/src/array/includes.ts +41 -1
- package/packages/perf-utils/src/array/includesNaN.ts +32 -1
- package/packages/perf-utils/src/array/index.ts +7 -1
- package/packages/perf-utils/src/array/map.ts +52 -1
- package/packages/player-ui/README.md +1 -1
- package/packages/player-ui/src/CurrentTime.tsx +2 -2
- package/packages/player-ui/src/Duration.tsx +2 -2
- package/packages/player-ui/src/PauseButton.tsx +0 -8
- package/packages/player-ui/src/PlayerInteractable.tsx +0 -1
- package/packages/player-ui/src/PlayerTime.tsx +1 -3
- package/packages/player-ui/src/PlayerUI.tsx +35 -68
- package/packages/player-ui/src/RemainingTime.tsx +2 -2
- package/packages/player-ui/src/Seekbar.tsx +18 -110
- package/packages/player-ui/src/Seeking.ts +16 -57
- package/packages/player-ui/src/Subtitles.tsx +2 -2
- package/packages/player-ui/src/index.ts +0 -1
- package/packages/player-ui/src/mocks.ts +8 -32
- package/packages/player-ui/src/timeUtils.ts +3 -3
- package/packages/player-ui/src/types.ts +3 -9
- package/packages/router/README.md +0 -1
- package/packages/router/src/Route.tsx +27 -61
- package/packages/router/src/Router.tsx +14 -63
- package/packages/router/src/history.ts +1 -8
- package/packages/router/src/index.ts +1 -1
- package/packages/router/src/utils.ts +4 -9
- package/packages/sass-utils/src/linear-gradient.scss +4 -9
- package/packages/sass-utils/src/scale.1080.scss +1 -3
- package/packages/sass-utils/src/scale.720.scss +1 -1
- package/packages/time/README.md +1 -4
- package/packages/time/src/Time.ts +13 -35
- package/packages/time/src/constants.ts +0 -1
- package/packages/toast/src/ToastService.tsx +5 -16
- package/packages/types-bigscreen-jsx/README.md +4 -5
- package/packages/types-bigscreen-jsx/index.d.ts +67 -72
- package/packages/utils/README.md +0 -27
- package/packages/utils/src/elementUtils.ts +0 -25
- package/packages/utils/src/index.ts +0 -8
- package/packages/utils/src/scaledImage.ts +3 -6
- package/packages/utils/src/textUtils.ts +14 -46
- package/packages/utils/src/wait.ts +1 -3
- package/packages/utils/src/xhr/xhrSend.ts +1 -3
- package/packages/utils/src/xhr/xhrSendRetry.ts +1 -3
- package/packages/zapping/src/ChannelZapping.ts +0 -9
- package/packages/zapping/src/Zapping.tsx +0 -10
- package/ci/is_ci_job_skippable.sh +0 -153
- package/packages/analytics/README.md +0 -8
- package/packages/analytics/src/A.ts +0 -1
- package/packages/analytics/src/Analytics.ts +0 -1
- package/packages/analytics/src/analyticsOnScroll.ts +0 -1
- package/packages/analytics/src/clients/ConsoleAnalytics/ConsoleAnalytics.ts +0 -1
- package/packages/analytics/src/clients/ConsoleAnalytics/index.ts +0 -1
- package/packages/analytics/src/clients/GoogleAnalytics/GoogleAnalytics.ts +0 -196
- package/packages/analytics/src/clients/GoogleAnalytics/constants.ts +0 -126
- package/packages/analytics/src/clients/GoogleAnalytics/getUrl.ts +0 -17
- package/packages/analytics/src/clients/GoogleAnalytics/index.ts +0 -2
- package/packages/analytics/src/clients/GoogleAnalytics/interface.ts +0 -82
- package/packages/analytics/src/clients/GoogleAnalytics/mapPayload.ts +0 -51
- package/packages/analytics/src/clients/GoogleAnalytics/prepareBody.ts +0 -14
- package/packages/analytics/src/clients/TealiumAnalytics/TealiumAnalytics.ts +0 -181
- package/packages/analytics/src/clients/TealiumAnalytics/constants.ts +0 -106
- package/packages/analytics/src/clients/TealiumAnalytics/findForLanguage.ts +0 -9
- package/packages/analytics/src/clients/TealiumAnalytics/index.ts +0 -4
- package/packages/analytics/src/clients/TealiumAnalytics/interface.ts +0 -35
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/__mocks__/mediaPayload.ts +0 -72
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/helper.ts +0 -36
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppError.ts +0 -13
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppOpen.ts +0 -13
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteAdd.ts +0 -11
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteRemove.ts +0 -11
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerClose.ts +0 -15
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerOpen.ts +0 -15
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSceneView.ts +0 -18
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearch.ts +0 -18
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchFailed.ts +0 -8
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchSuccess.ts +0 -8
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoPause.ts +0 -15
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoProgress.ts +0 -18
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoResume.ts +0 -15
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStart.ts +0 -15
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStop.ts +0 -15
- package/packages/analytics/src/clients/TealiumAnalytics/types.ts +0 -161
- package/packages/analytics/src/clients/TwentyFourIQ/TwentyFourIQClient.ts +0 -107
- package/packages/analytics/src/clients/TwentyFourIQ/constants.ts +0 -111
- package/packages/analytics/src/clients/TwentyFourIQ/helper.ts +0 -34
- package/packages/analytics/src/clients/TwentyFourIQ/index.ts +0 -2
- package/packages/analytics/src/clients/TwentyFourIQ/interface.ts +0 -34
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdEvent.ts +0 -20
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBase.ts +0 -24
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBuffering.ts +0 -15
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerClose.ts +0 -25
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerOpen.ts +0 -17
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapSceneView.ts +0 -15
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapScroll.ts +0 -17
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoComplete.ts +0 -22
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoPause.ts +0 -25
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoProgress.ts +0 -25
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStart.ts +0 -34
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStop.ts +0 -32
- package/packages/analytics/src/clients/TwentyFourIQ/types.ts +0 -132
- package/packages/analytics/src/constants.ts +0 -1
- package/packages/analytics/src/index.ts +0 -3
- package/packages/analytics/src/interface.ts +0 -1
- package/packages/analytics/src/utils/generateSessionId.ts +0 -8
- package/packages/device/src/driver/index.firetv.ts +0 -1
- package/packages/device/src/driver/index.smartcast.tv.ts +0 -1
- package/packages/driver-base/src/types/AdInfo.ts +0 -5
- package/packages/driver-base/src/types/InAppPurchase.ts +0 -25
- package/packages/driver-firetv/src/DeviceFireTV.ts +0 -91
- package/packages/driver-firetv/src/__mocks__/javaScriptBridge.ts +0 -45
- package/packages/driver-firetv/src/index.ts +0 -1
- package/packages/driver-firetv/src/types.ts +0 -1
- package/packages/driver-smartcast/src/DeviceSmartCast.ts +0 -394
- package/packages/driver-smartcast/src/__mocks__/api.ts +0 -79
- package/packages/driver-smartcast/src/index.ts +0 -1
- package/packages/driver-smartcast/src/keymap.ts +0 -9
- package/packages/driver-smartcast/src/types.ts +0 -111
- package/packages/focus/src/hasFocus.ts +0 -36
- package/packages/jsx/src/test-utils/keyup.ts +0 -27
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/arabic.ts +0 -27
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/burmese.ts +0 -27
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/dari.ts +0 -28
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/korean.ts +0 -26
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/pashto.ts +0 -27
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/persian.ts +0 -27
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/russian.ts +0 -27
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/spanish.ts +0 -26
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/tibetan.ts +0 -26
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/turkish.ts +0 -26
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/ukrainian.ts +0 -27
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/urdu.ts +0 -26
- package/packages/keyboard/src/utils/setInputSelectionRange.ts +0 -10
- package/packages/l10n/src/date/de.ts +0 -97
- package/packages/l10n/src/date/es.ts +0 -71
- package/packages/l10n/src/date/fr.ts +0 -94
- package/packages/l10n/src/date/he.ts +0 -101
- package/packages/time/src/adapters/24iMediaTimeApi.ts +0 -47
- package/packages/time/src/services/24iMediaTimeApi/24iMediaTimeApi.ts +0 -43
- package/packages/time/src/services/24iMediaTimeApi/index.ts +0 -6
- package/packages/utils/src/forceReflow.ts +0 -14
- package/packages/utils/src/keyPress/index.ts +0 -6
- package/packages/utils/src/keyPress/keyPressSimulator.ts +0 -74
- package/packages/utils/src/keyPress/simulateKeyPress.ts +0 -25
- 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
|
-
|
|
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
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
170
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
361
|
-
|
|
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
|
-
|
|
50
|
-
|
|
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 = (
|
|
10
|
-
{ hour: 'numeric', minute: '2-digit'
|
|
9
|
+
const formatTime = (timestamp: number) => l10n.date(timestamp).toLocaleTimeString(
|
|
10
|
+
{ hour: 'numeric', minute: '2-digit' },
|
|
11
11
|
);
|
|
12
12
|
|
|
13
|
-
const formatDate = (
|
|
14
|
-
if (time.isToday(
|
|
13
|
+
const formatDate = (timestamp: number) => {
|
|
14
|
+
if (time.isToday(timestamp)) {
|
|
15
15
|
return i18n.t('date.today');
|
|
16
16
|
}
|
|
17
|
-
if (time.isYesterday(
|
|
17
|
+
if (time.isYesterday(timestamp)) {
|
|
18
18
|
return i18n.t('date.yesterday');
|
|
19
19
|
}
|
|
20
|
-
if (time.isTomorrow(
|
|
20
|
+
if (time.isTomorrow(timestamp)) {
|
|
21
21
|
return i18n.t('date.tomorrow');
|
|
22
22
|
}
|
|
23
|
-
return l10n.date(
|
|
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 = (
|
|
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
|
|
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
|
-
|
|
21
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
22
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
+
}
|
package/packages/focus/README.md
CHANGED
|
@@ -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
|
-
```
|