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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/.vscode/settings.json +6 -0
  2. package/README.md +3 -2
  3. package/package.json +10 -10
  4. package/packages/analytics/src/clients/GoogleAnalytics/GoogleAnalytics.ts +14 -10
  5. package/packages/analytics/src/clients/GoogleAnalytics/constants.ts +2 -10
  6. package/packages/analytics/src/clients/GoogleAnalytics/interface.ts +1 -6
  7. package/packages/analytics/src/clients/GoogleAnalytics/mapPayload.ts +0 -1
  8. package/packages/analytics/src/clients/TealiumAnalytics/TealiumAnalytics.ts +24 -36
  9. package/packages/analytics/src/clients/TealiumAnalytics/constants.ts +1 -5
  10. package/packages/analytics/src/clients/TealiumAnalytics/findIdForLanguage.ts +9 -0
  11. package/packages/analytics/src/clients/TealiumAnalytics/index.ts +1 -1
  12. package/packages/analytics/src/clients/TealiumAnalytics/interface.ts +1 -3
  13. package/packages/analytics/src/clients/TealiumAnalytics/mappers/__mocks__/mediaPayload.ts +14 -16
  14. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSceneView.ts +1 -1
  15. package/packages/analytics/src/clients/TealiumAnalytics/types.ts +14 -19
  16. package/packages/analytics/src/clients/TwentyFourIQ/TwentyFourIQClient.ts +22 -13
  17. package/packages/analytics/src/clients/TwentyFourIQ/constants.ts +3 -15
  18. package/packages/analytics/src/clients/TwentyFourIQ/interface.ts +4 -7
  19. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdLoaded.ts +13 -0
  20. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdSkipped.ts +16 -0
  21. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBase.ts +3 -6
  22. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBuffering.ts +2 -2
  23. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerClose.ts +3 -4
  24. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerOpen.ts +3 -2
  25. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapSceneView.ts +2 -2
  26. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapScroll.ts +2 -2
  27. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoComplete.ts +3 -4
  28. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoPause.ts +3 -4
  29. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoProgress.ts +3 -4
  30. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStart.ts +2 -2
  31. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStop.ts +2 -2
  32. package/packages/analytics/src/clients/TwentyFourIQ/types.ts +28 -45
  33. package/packages/create-package/dist/createPackage.js +66 -0
  34. package/packages/create-package/dist/createPackage.js.map +1 -0
  35. package/packages/create-package/dist/index.js +5 -0
  36. package/packages/create-package/dist/index.js.map +1 -0
  37. package/packages/create-package/dist/questionnaire/questions.js +35 -0
  38. package/packages/create-package/dist/questionnaire/questions.js.map +1 -0
  39. package/packages/create-package/dist/settings/Settings.js +10 -0
  40. package/packages/create-package/dist/settings/Settings.js.map +1 -0
  41. package/packages/create-package/dist/types.js +3 -0
  42. package/packages/create-package/dist/types.js.map +1 -0
  43. package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoProvider.ts +2 -23
  44. package/packages/developer-tools/src/TechnicalInfo/__mocks__/Device.ts +0 -8
  45. package/packages/developer-tools/src/TechnicalInfo/translations.ts +0 -4
  46. package/packages/driver-androidtv/src/DeviceAndroidTV.ts +0 -38
  47. package/packages/driver-androidtv/src/__mocks__/javaScriptBridge.ts +0 -9
  48. package/packages/driver-androidtv/src/index.ts +0 -1
  49. package/packages/driver-androidtv/src/types.ts +0 -42
  50. package/packages/driver-base/src/DeviceBase.ts +0 -19
  51. package/packages/driver-base/src/__mocks__/DeviceBase.ts +0 -24
  52. package/packages/driver-base/src/index.ts +0 -3
  53. package/packages/driver-browser/src/DeviceBrowser.ts +0 -26
  54. package/packages/driver-entone/src/DeviceEntone.ts +1 -31
  55. package/packages/driver-firetv/src/DeviceFireTV.ts +1 -74
  56. package/packages/driver-firetv/src/__mocks__/javaScriptBridge.ts +0 -9
  57. package/packages/driver-hbbtv/src/DeviceHbbTV.ts +0 -26
  58. package/packages/driver-kreatv/src/DeviceKreaTV.ts +0 -26
  59. package/packages/driver-saphi/src/DeviceSaphi.ts +0 -26
  60. package/packages/driver-smartcast/src/DeviceSmartCast.ts +1 -78
  61. package/packages/driver-smartcast/src/__mocks__/api.ts +2 -32
  62. package/packages/driver-smartcast/src/types.ts +2 -48
  63. package/packages/driver-tizen/src/DeviceTizen.ts +7 -126
  64. package/packages/driver-tizen/src/ITizen.ts +202 -15116
  65. package/packages/driver-tizen/src/IWebapis.ts +87 -8643
  66. package/packages/driver-tizen/src/TizenKeys.ts +2 -2
  67. package/packages/driver-tizen/src/__mocks__/tizen.ts +8 -7
  68. package/packages/driver-tizen/src/constants.ts +195 -1
  69. package/packages/driver-tizen/src/types.ts +14 -0
  70. package/packages/driver-vidaa/src/DeviceVidaa.ts +0 -26
  71. package/packages/driver-webos/src/DeviceWebos.ts +0 -47
  72. package/packages/driver-webos/src/__mocks__/webos.ts +0 -33
  73. package/packages/driver-webos/src/constants.ts +0 -1
  74. package/packages/driver-webos/src/types.ts +0 -30
  75. package/packages/driver-xbox/src/DeviceXbox.ts +1 -30
  76. package/packages/grid/src/UnifiedGridController/UnifiedGridController.ts +6 -6
  77. package/packages/input/README.md +3 -0
  78. package/packages/input/src/Input.tsx +62 -32
  79. package/packages/input/src/utils.ts +71 -0
  80. package/packages/keyboard/src/WhitelabelKeyboard/layouts/index.ts +0 -1
  81. package/packages/keyboard/src/utils/caret.ts +8 -5
  82. package/packages/keyboard/src/utils/input.ts +6 -5
  83. package/packages/list/src/BasicList/BasicList.tsx +7 -7
  84. package/packages/list/src/CenteredList/CenteredList.tsx +2 -2
  85. package/packages/list/src/EdgeOffsetList/EdgeOffsetList.tsx +7 -7
  86. package/packages/list/src/FirstOnlyList/FirstOnlyList.tsx +2 -2
  87. package/packages/list/src/FirstOnlyVariedList/FirstOnlyVariedList.tsx +2 -2
  88. package/packages/list/src/FixedToEndList/FixedToEndList.tsx +2 -2
  89. package/packages/list/src/interface.ts +2 -2
  90. package/packages/logger/src/loggers/ConsoleLogger/ConsoleLogger.ts +1 -7
  91. package/packages/logger/src/loggers/SentryLogger/SentryLogger.ts +1 -3
  92. package/packages/router/README.md +0 -1
  93. package/packages/router/src/Router.tsx +1 -4
  94. package/packages/router/src/utils.ts +1 -1
  95. package/utils/release/release.ts +5 -7
  96. package/ci/is_ci_job_skippable.sh +0 -153
  97. package/packages/analytics/src/clients/TealiumAnalytics/findForLanguage.ts +0 -9
  98. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppOpen.ts +0 -13
  99. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdEvent.ts +0 -20
  100. package/packages/driver-base/src/types/AdInfo.ts +0 -5
  101. package/packages/driver-base/src/types/InAppPurchase.ts +0 -25
  102. package/packages/driver-firetv/src/types.ts +0 -1
  103. package/packages/input/src/handleOverflow.ts +0 -29
  104. package/packages/keyboard/src/WhitelabelKeyboard/layouts/spanish.ts +0 -26
  105. package/packages/keyboard/src/utils/setInputSelectionRange.ts +0 -10
@@ -1,7 +1,7 @@
1
1
  import { KeyMap, KeycodeKeyMap } from '@24i/bigscreen-sdk/driver-base';
2
- import { Tizen } from './ITizen';
2
+ import { ITizen } from './types';
3
3
 
4
- declare const tizen: Tizen;
4
+ declare const tizen: ITizen;
5
5
 
6
6
  type KeyCodeMap = { [key: string]: number };
7
7
 
@@ -8,10 +8,6 @@ export const webapis = {
8
8
  getModelCode: () => 'model code',
9
9
  getFirmware: () => 'firmware',
10
10
  },
11
- adinfo: {
12
- getTIFA: () => 'adid',
13
- isLATEnabled: () => true,
14
- },
15
11
  };
16
12
 
17
13
  export const application = {
@@ -28,7 +24,12 @@ export const tizen = {
28
24
  unregisterKey: () => {},
29
25
  registerKey: () => {},
30
26
  },
31
- systeminfo: {
32
- getPropertyValue: async () => {},
33
- },
34
27
  };
28
+
29
+ declare global {
30
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
31
+ interface Window {
32
+ webapis: typeof webapis,
33
+ tizen: typeof tizen,
34
+ }
35
+ }
@@ -1,3 +1,197 @@
1
+ /* eslint-disable no-magic-numbers */
2
+
1
3
  export const VENDOR = 'Samsung Tizen';
2
4
 
3
- export const DPI_SUCCESS = '100000';
5
+ // MARK: TVAudioControl
6
+
7
+ export type AudioOutputMode = (
8
+ | 'PCM'
9
+ | 'DOLBY'
10
+ | 'DTS'
11
+ | 'AAC'
12
+ );
13
+
14
+ export type AudioBeepType = (
15
+ | 'UP'
16
+ | 'DOWN'
17
+ | 'LEFT'
18
+ | 'RIGHT'
19
+ | 'PAGE_LEFT'
20
+ | 'PAGE_RIGHT'
21
+ | 'BACK'
22
+ | 'SELECT'
23
+ | 'CANCEL'
24
+ | 'KEYPAD'
25
+ | 'KEYPAD_ENTER'
26
+ | 'KEYPAD_DEL'
27
+ | 'MOVE'
28
+ | 'PREPARING'
29
+ );
30
+
31
+ // MARK: SystemInfo
32
+
33
+ export type SystemInfoPropertyId = (
34
+ | 'BATTERY'
35
+ | 'CPU'
36
+ | 'STORAGE'
37
+ | 'DISPLAY'
38
+ | 'DEVICE_ORIENTATION'
39
+ | 'BUILD'
40
+ | 'LOCALE'
41
+ | 'NETWORK'
42
+ | 'WIFI_NETWORK'
43
+ | 'ETHERNET_NETWORK'
44
+ | 'CELLULAR_NETWORK'
45
+ | 'NET_PROXY_NETWORK'
46
+ | 'SIM'
47
+ | 'PERIPHERAL'
48
+ | 'MEMORY'
49
+ | 'VIDEOSOURCE'
50
+ | 'CAMERA_FLASH'
51
+ | 'ADS'
52
+ | 'SERVICE_COUNTRY'
53
+ | 'SOURCE_INFO'
54
+ | 'PANEL'
55
+ );
56
+
57
+ export type SystemInfoNetworkType = (
58
+ | 'NONE'
59
+ | '2G'
60
+ | '2.5G'
61
+ | '3G'
62
+ | '4G'
63
+ | 'WIFI'
64
+ | 'ETHERNET'
65
+ | 'NET_PROXY'
66
+ | 'UNKNOWN'
67
+ );
68
+
69
+ export type SystemInfoWifiSecurityMode = (
70
+ | 'NONE'
71
+ | 'WEP'
72
+ | 'WPA_PSK'
73
+ | 'WPA2_PSK'
74
+ | 'EAP'
75
+ );
76
+
77
+ export type SystemInfoWifiEncryptionType = (
78
+ | 'NONE'
79
+ | 'WEP'
80
+ | 'TKIP'
81
+ | 'AES'
82
+ | 'TKIP_AES_MIXED'
83
+ );
84
+
85
+ export type SystemInfoNetworkIpMode = (
86
+ | 'NONE'
87
+ | 'STATIC'
88
+ | 'DYNAMIC'
89
+ | 'AUTO'
90
+ | 'FIXED'
91
+ );
92
+
93
+ export type SystemInfoDeviceOrientationStatus = (
94
+ | 'PORTRAIT_PRIMARY'
95
+ | 'PORTRAIT_SECONDARY'
96
+ | 'LANDSCAPE_PRIMARY'
97
+ | 'LANDSCAPE_SECONDARY'
98
+ );
99
+
100
+ export type SystemInfoSimState = (
101
+ | 'ABSENT'
102
+ | 'INITIALIZING'
103
+ | 'READY'
104
+ | 'PIN_REQUIRED'
105
+ | 'PUK_REQUIRED'
106
+ | 'NETWORK_LOCKED'
107
+ | 'SIM_LOCKED'
108
+ | 'UNKNOWN'
109
+ );
110
+
111
+ export type SystemInfoProfile = 'MOBILE_FULL' | 'MOBILE_WEB' | 'MOBILE' | 'WEARABLE' | 'TV';
112
+
113
+ export type SystemInfoLowMemoryStatus = 'NORMAL' | 'WARNING';
114
+
115
+ export type SystemInfoVideoSourceType = (
116
+ | 'TV'
117
+ | 'AV'
118
+ | 'SVIDEO'
119
+ | 'COMP'
120
+ | 'PC'
121
+ | 'HDMI'
122
+ | 'SCART'
123
+ | 'DVI'
124
+ | 'MEDIA'
125
+ );
126
+
127
+ // MARK: ProductInfo
128
+
129
+ export enum ProductInfoConfigKey {
130
+ CONFIG_KEY_DATA_SERVICE = 0,
131
+ CONFIG_KEY_SERVICE_COUNTRY = 1,
132
+ }
133
+
134
+ export enum ProductInfoNoGlass3dSupport {
135
+ NO_GLASS_3D_NOT_SUPPORTED = 0,
136
+ NO_GLASS_3D_SUPPORTED = 1,
137
+ }
138
+
139
+ export enum ProductInfoSiServerType {
140
+ SI_TYPE_OPERATIING_SERVER = 0,
141
+ SI_TYPE_DEVELOPMENT_SERVER = 1,
142
+ SI_TYPE_DEVELOPING_SERVER = 2,
143
+ }
144
+
145
+ // MARK: Network
146
+
147
+ export enum NetworkActiveConnectionType {
148
+ DISCONNECTED = 0,
149
+ WIFI = 1,
150
+ CELLULAR = 2,
151
+ ETHERNET = 3,
152
+ }
153
+
154
+ export enum NetworkIpMode {
155
+ NONE = 0,
156
+ STATIC = 1,
157
+ DYNAMIC = 2,
158
+ AUTO = 3,
159
+ FIXED = 4,
160
+ UNKNOWN = 5,
161
+ }
162
+
163
+ export enum NetworkState {
164
+ LAN_CABLE_ATTACHED = 1,
165
+ LAN_CABLE_DETACHED = 2,
166
+ LAN_CABLE_STATE_UNKNOWN = 3,
167
+ GATEWAY_CONNECTED = 4,
168
+ GATEWAY_DISCONNECTED = 5,
169
+ WIFI_MODULE_STATE_ATTACHED = 6,
170
+ WIFI_MODULE_STATE_DETACHED = 7,
171
+ WIFI_MODULE_STATE_UNKNOWN = 8,
172
+ }
173
+
174
+ export enum NetworkWiFiSecurityMode {
175
+ WEP = 1,
176
+ WPA_PSK = 2,
177
+ WPA2_PSK = 3,
178
+ EAP = 4,
179
+ NONE = 5,
180
+ UNKNOWN = 6,
181
+ }
182
+
183
+ export enum NetworkWiFiEncryptionType {
184
+ WEP = 1,
185
+ TKIP = 2,
186
+ AES = 3,
187
+ TKIP_AES_MIXED = 4,
188
+ NONE = 5,
189
+ UNKNOWN = 6,
190
+ }
191
+
192
+ // MARK: AppCommon
193
+
194
+ export enum AppCommonScreenSaverState {
195
+ SCREEN_SAVER_OFF = 0,
196
+ SCREEN_SAVER_ON = 1,
197
+ }
@@ -0,0 +1,14 @@
1
+ export {
2
+ ITizen,
3
+ SystemInfo,
4
+ TVAudioControl,
5
+ TVInputDevice,
6
+ TizenApplication,
7
+ WebSetting,
8
+ } from './ITizen';
9
+ export {
10
+ AppCommon,
11
+ IWebapis,
12
+ Network,
13
+ ProductInfo,
14
+ } from './IWebapis';
@@ -3,10 +3,7 @@ import {
3
3
  ConnectionType,
4
4
  ScreenSaverStatus,
5
5
  VolumeRange,
6
- IAPSuccessPayload,
7
- IAPPurchaseProductData,
8
6
  } from '@24i/bigscreen-sdk/driver-base';
9
- import { generateUuid } from '@24i/bigscreen-sdk/utils';
10
7
  import { NetworkConnectionTypeMap } from './constants';
11
8
  import { getPlatformInfo } from './formatUserAgent';
12
9
  import { HisenseVidaaApi } from './types';
@@ -83,17 +80,6 @@ export class DeviceVidaa extends DeviceBase {
83
80
  return window.Hisense_GetDeviceID() || '';
84
81
  }
85
82
 
86
- async getAdInfo() {
87
- const adId = generateUuid();
88
- const type = 'sessionid';
89
- const latEnabled = null;
90
- return { adId, type, latEnabled };
91
- }
92
-
93
- async getOsLanguage() {
94
- return (window.navigator.language || '').slice(0, 2);
95
- }
96
-
97
83
  async getVolume(): Promise<number> {
98
84
  return VolumeRange.UNSUPPORTED;
99
85
  }
@@ -152,16 +138,4 @@ export class DeviceVidaa extends DeviceBase {
152
138
  // not supported on Hisense VIDAA platform
153
139
  return '';
154
140
  }
155
-
156
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
157
- async purchaseProduct(data: IAPPurchaseProductData): Promise<IAPSuccessPayload> {
158
- // not supported
159
- throw new Error('Not supported');
160
- }
161
-
162
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
163
- async cancelSubscription(data: IAPPurchaseProductData): Promise<void> {
164
- // not supported
165
- throw new Error('Not supported');
166
- }
167
141
  }
@@ -4,8 +4,6 @@ import {
4
4
  ScreenSaverStatus,
5
5
  VolumeRange,
6
6
  ExitOptions,
7
- IAPSuccessPayload,
8
- IAPPurchaseProductData,
9
7
  } from '@24i/bigscreen-sdk/driver-base';
10
8
  import { Storage } from '@24i/bigscreen-sdk/storage';
11
9
  import { initWebOSTVjs } from './webOSTVjs/webOSTVjs';
@@ -247,39 +245,6 @@ export class DeviceWebos extends DeviceBase {
247
245
  return this.duid!;
248
246
  }
249
247
 
250
- async getAdInfo() {
251
- const adId = await this.getLgDeviceId() ?? null;
252
- const type = 'lgudid';
253
- const latEnabled = null;
254
- return { adId, type, latEnabled };
255
- }
256
-
257
- async getOsLanguage(): Promise<string> {
258
- return new Promise<string>((resolve) => {
259
- webOS.service.request(ApiUrls.SETTINGS_SERVICE, {
260
- method: 'getSystemSettings',
261
- parameters: {
262
- keys: ['localeInfo'],
263
- },
264
- onSuccess: (response) => {
265
- if (response.returnValue) {
266
- const uiLanguage = response?.settings?.localeInfo?.locales?.UI;
267
- resolve((uiLanguage || '').slice(0, 2));
268
- }
269
- resolve('');
270
- },
271
- onFailure: (error) => {
272
- // ex. returns error for webOS 1.0, 2.0 as not supported
273
- const { errorCode = '0', errorText } = error || {};
274
- console.error(
275
- `[DeviceWebos] getOsLanguage onFailure: [${errorCode}] ${errorText}`,
276
- );
277
- resolve('');
278
- },
279
- });
280
- });
281
- }
282
-
283
248
  async getVolume() {
284
249
  // TODO: not yet implemented
285
250
  return VolumeRange.UNSUPPORTED;
@@ -345,16 +310,4 @@ export class DeviceWebos extends DeviceBase {
345
310
  // Not supported on LG webOS platform (for date 12.4.2021, latest webOS TV 5.x)
346
311
  return '';
347
312
  }
348
-
349
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
350
- async purchaseProduct(data: IAPPurchaseProductData): Promise<IAPSuccessPayload> {
351
- // not supported
352
- throw new Error('Not supported');
353
- }
354
-
355
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
356
- async cancelSubscription(data: IAPPurchaseProductData): Promise<void> {
357
- // not supported
358
- throw new Error('Not supported');
359
- }
360
313
  }
@@ -63,39 +63,6 @@ const mockServices = {
63
63
  callbackName: 'onSuccess',
64
64
  },
65
65
  },
66
- 'luna://com.webos.settingsservice#getSystemSettings': {
67
- responses: {
68
- success: {
69
- returnValue: true,
70
- method: 'getSystemSettings',
71
- settings: {
72
- localeInfo: {
73
- locales: {
74
- UI: 'en-GB',
75
- TV: 'en-GB',
76
- FMT: 'en-GB',
77
- NLP: 'en-GB',
78
- STT: 'fr-FR',
79
- AUD: 'fr-FR',
80
- AUD2: 'en-GB',
81
- },
82
- clock: 'locale',
83
- keyboards: ['en'],
84
- timezone: '',
85
- },
86
- },
87
- },
88
- error: {
89
- returnValue: false,
90
- errorCode: 'ERR.001',
91
- errorText: 'There is no matched result from DB',
92
- },
93
- },
94
- selected: {
95
- responseId: 'success',
96
- callbackName: 'onSuccess',
97
- },
98
- },
99
66
  'luna://com.webos.service.connectionmanager#getStatus': {
100
67
  responses: {
101
68
  successWired: {
@@ -17,5 +17,4 @@ export const ApiUrls = {
17
17
  CONNECTION_MANAGER_WEBOS: 'luna://com.webos.service.connectionmanager',
18
18
  SYSTEM_PROPERTY: 'luna://com.webos.service.tv.systemproperty',
19
19
  SM: 'luna://com.webos.service.sm',
20
- SETTINGS_SERVICE: 'luna://com.webos.settingsservice',
21
20
  } as const;
@@ -331,41 +331,11 @@ export type DuidOptions = {
331
331
  onComplete?: (response: NegativeResponse | DuidResponse) => any,
332
332
  };
333
333
 
334
- type SettingsService = {
335
- method: 'getSystemSettings',
336
- settings: {
337
- localeInfo: {
338
- locales: {
339
- UI: string,
340
- TV: string,
341
- FMT: string,
342
- NLP: string,
343
- STT: string,
344
- AUD: string,
345
- AUD2: string,
346
- },
347
- clock: string,
348
- keyboards: string[],
349
- timezone: string,
350
- },
351
- },
352
- };
353
- export type SettingsServiceResponse = PositiveResponse & SettingsService;
354
- export type SettingsServiceOptions = {
355
- method: 'getSystemSettings',
356
- parameters: {
357
- keys: ['localeInfo'],
358
- },
359
- onSuccess?: (response: NegativeResponse | SettingsServiceResponse) => any,
360
- onFailure?: (response: NegativeResponse) => any,
361
- };
362
-
363
334
  interface RequestTypeMap {
364
335
  [ApiUrls.CONNECTION_MANAGER_PALM]: ConnectionManagerOptions,
365
336
  [ApiUrls.CONNECTION_MANAGER_WEBOS]: ConnectionManagerOptions,
366
337
  [ApiUrls.SYSTEM_PROPERTY]: SystemPropertyOptions,
367
338
  [ApiUrls.SM]: DuidOptions,
368
- [ApiUrls.SETTINGS_SERVICE]: SettingsServiceOptions,
369
339
  }
370
340
 
371
341
  // MARK: IPalmSystem
@@ -1,10 +1,4 @@
1
- import {
2
- DeviceBase,
3
- IAPPurchaseProductData,
4
- IAPSuccessPayload,
5
- ScreenSaverStatus,
6
- VolumeRange,
7
- } from '@24i/bigscreen-sdk/driver-base';
1
+ import { DeviceBase, ScreenSaverStatus, VolumeRange } from '@24i/bigscreen-sdk/driver-base';
8
2
  import { runAsync } from '@24i/bigscreen-sdk/utils/timers';
9
3
  import { generateUuid } from '@24i/bigscreen-sdk/utils/generateUuid';
10
4
  import { find } from '@24i/bigscreen-sdk/perf-utils/array';
@@ -158,17 +152,6 @@ export class DeviceXbox extends DeviceBase {
158
152
  return uuid;
159
153
  }
160
154
 
161
- async getAdInfo() {
162
- const adId = generateUuid();
163
- const type = 'sessionid';
164
- const latEnabled = null;
165
- return { adId, type, latEnabled };
166
- }
167
-
168
- async getOsLanguage() {
169
- return (window.navigator.language || '').slice(0, 2);
170
- }
171
-
172
155
  async getVolume() {
173
156
  return VolumeRange.UNSUPPORTED;
174
157
  }
@@ -245,16 +228,4 @@ export class DeviceXbox extends DeviceBase {
245
228
  getDeviceClass(): string {
246
229
  return 'xbox';
247
230
  }
248
-
249
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
250
- async purchaseProduct(data: IAPPurchaseProductData): Promise<IAPSuccessPayload> {
251
- // not supported
252
- throw new Error('Not supported');
253
- }
254
-
255
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
256
- async cancelSubscription(data: IAPPurchaseProductData): Promise<void> {
257
- // not supported
258
- throw new Error('Not supported');
259
- }
260
231
  }
@@ -298,13 +298,13 @@ export class UnifiedGridController<T> implements IUnifiedGridController<T> {
298
298
  const { grid } = this;
299
299
  const base = grid.base.current!;
300
300
  const targetScrollIndex = this.itemIndexToScrollIndex(dataIndex);
301
+ if (targetScrollIndex > this.scrollIndex) {
302
+ this.adjustGroupsOffsetsForward(targetScrollIndex);
303
+ } else if (targetScrollIndex < this.scrollIndex) {
304
+ this.adjustGroupsOffsetsBackward(targetScrollIndex);
305
+ }
301
306
  if (targetScrollIndex !== this.scrollIndex) {
302
- const backwards = targetScrollIndex < this.scrollIndex;
303
- const lastScrollIndex = this.scrollIndex;
304
- const scrollToIndex = Math.abs(targetScrollIndex - this.scrollIndex);
305
- for (let i = 1; i <= scrollToIndex; i++) {
306
- this.scroll(backwards ? lastScrollIndex - i : lastScrollIndex + i, animate);
307
- }
307
+ this.scroll(targetScrollIndex, animate);
308
308
  }
309
309
  base.index = dataIndex;
310
310
  this.focusCurrentItem();
@@ -60,3 +60,6 @@ The reason for no styling is to limit unnecessary CSS code that would be overrid
60
60
  `.native-input-wrap` is set to `display: none`. This is the native input used on the background.
61
61
 
62
62
  `.input-field` is a custom component that should look like input field with possibility of custom styling.
63
+
64
+ `.caret` position is counted from the left side of the input in LTR layout and from the right side of the
65
+ input in RTL layout.
@@ -1,4 +1,4 @@
1
- import { createRef, Component, setText, DeclareProps } from '@24i/bigscreen-sdk/jsx';
1
+ import { createRef, Component, DeclareProps } from '@24i/bigscreen-sdk/jsx';
2
2
  import { Interactable } from '@24i/bigscreen-sdk/interactable';
3
3
  import { IFocusable } from '@24i/bigscreen-sdk/focus';
4
4
  import { isRtl } from '@24i/bigscreen-sdk/i18n';
@@ -9,7 +9,7 @@ import { stopEvent } from '@24i/bigscreen-sdk/utils/stopEvent';
9
9
  import { addClass } from '@24i/bigscreen-sdk/utils/addClass';
10
10
  import { removeClass } from '@24i/bigscreen-sdk/utils/removeClass';
11
11
  import { offsetPosition } from '@24i/bigscreen-sdk/utils/offsetPosition';
12
- import { handleOverflow } from './handleOverflow';
12
+ import { checkCharOrderMishmash, handleOverflow } from './utils';
13
13
  import './Input.scss';
14
14
 
15
15
  type Props = {
@@ -42,6 +42,8 @@ export class Input extends Component<Props> implements IFocusable {
42
42
 
43
43
  caret = createRef<HTMLDivElement>();
44
44
 
45
+ caretPosition = 0;
46
+
45
47
  isInputting = false;
46
48
 
47
49
  lastValue: string;
@@ -68,6 +70,11 @@ export class Input extends Component<Props> implements IFocusable {
68
70
  this.isPlaceholderVisible = value.length === 0;
69
71
  }
70
72
 
73
+ componentDidMount() {
74
+ const { value } = this.props;
75
+ if (value) this.setText(value);
76
+ }
77
+
71
78
  getType() {
72
79
  return this.nativeInput.current?.type;
73
80
  }
@@ -85,13 +92,10 @@ export class Input extends Component<Props> implements IFocusable {
85
92
 
86
93
  onCaretPositionChange = (position: number | null) => {
87
94
  if (position === null) return;
88
- const { shouldHandleOverflow } = this.props;
89
95
  const value = this.getValue();
90
- setText(this.text, this.filterText(value));
91
- this.setCaretPosition(position);
92
- if (shouldHandleOverflow) {
93
- handleOverflow(this.wrap.current, this.caret.current, this.text.current);
94
- }
96
+ this.setText(value);
97
+ this.updateCaretPosition(position);
98
+ this.updateTextOverflow();
95
99
  if (this.lastValue !== value) {
96
100
  const { onChange } = this.props;
97
101
  this.lastValue = value;
@@ -106,39 +110,59 @@ export class Input extends Component<Props> implements IFocusable {
106
110
 
107
111
  setValue(value: string) {
108
112
  this.nativeInput.current!.value = value;
109
- setText(this.text, this.filterText(value));
110
- if (value.length === 0) {
111
- this.showPlaceholder();
112
- } else {
113
- this.hidePlaceholder();
114
- }
113
+ this.setText(value);
115
114
  }
116
115
 
117
116
  setType(type: Props['type']) {
118
117
  if (this.getType() === type) return;
119
118
  const value = this.getValue();
120
119
  this.nativeInput.current!.type = type;
121
- setText(this.text, this.filterText(value));
120
+ this.setText(value);
121
+ }
122
+
123
+ setText(text: string): void {
124
+ const filtered = this.filterText(text);
125
+ this.renderText(filtered);
122
126
  }
123
127
 
124
- setCaretPosition(position: number) {
128
+ updateCaretPosition(position: number) {
125
129
  const textNode = this.text.current!.firstChild;
126
- if (!textNode) {
130
+ if (!textNode || position <= 0) {
131
+ this.caretPosition = 0;
127
132
  offsetPosition(this.caret, { x: 0 });
128
133
  return;
129
134
  }
130
- const range = new Range();
131
- range.selectNode(textNode);
132
- const wholeText = range.getBoundingClientRect();
133
- range.setStart(textNode, 0);
134
- range.setEnd(textNode, position);
135
- const caretText = range.getBoundingClientRect();
136
- const [initialCaretPosition, currentCarretPosition, offsetBase] = isRtl()
137
- ? [wholeText.right, caretText.left, wholeText.left]
138
- : [wholeText.left, caretText.right, wholeText.right];
139
- const caretPos = position === 0 ? initialCaretPosition : currentCarretPosition;
140
- const offset = offsetBase - caretPos;
141
- offsetPosition(this.caret, { x: -offset }, false);
135
+ const wholeTextDimensions = this.text.current!.getBoundingClientRect();
136
+ if (position >= this.text.current!.children.length) {
137
+ const offset = wholeTextDimensions.right - wholeTextDimensions.left;
138
+ this.caretPosition = isRtl() ? -offset : offset;
139
+ offsetPosition(this.caret, { x: this.caretPosition }, false);
140
+ return;
141
+ }
142
+ const charNode = this.text.current!.children[position - 1];
143
+ const charDimensions = charNode!.getBoundingClientRect();
144
+ const isCharMishmash = checkCharOrderMishmash(this.text.current!, position - 1);
145
+ if (isRtl()) {
146
+ if (isCharMishmash) {
147
+ this.caretPosition = charDimensions.right - wholeTextDimensions.right;
148
+ } else {
149
+ this.caretPosition = charDimensions.left - wholeTextDimensions.right;
150
+ }
151
+ } else if (isCharMishmash) {
152
+ this.caretPosition = charDimensions.left - wholeTextDimensions.left;
153
+ } else {
154
+ this.caretPosition = charDimensions.right - wholeTextDimensions.left;
155
+ }
156
+ offsetPosition(this.caret, { x: this.caretPosition }, false);
157
+ }
158
+
159
+ updateTextOverflow() {
160
+ const { shouldHandleOverflow } = this.props;
161
+ if (!shouldHandleOverflow) return;
162
+ const textMargin = handleOverflow(
163
+ this.wrap.current, this.caret.current, this.text.current,
164
+ );
165
+ offsetPosition(this.caret, { x: this.caretPosition - textMargin }, false);
142
166
  }
143
167
 
144
168
  /**
@@ -202,6 +226,14 @@ export class Input extends Component<Props> implements IFocusable {
202
226
  return text.replace(/ /g, NBSP);
203
227
  }
204
228
 
229
+ renderText(text: string): void {
230
+ const chars: JSX.Element[] = [];
231
+ for (let i = 0; i < text.length; i++) {
232
+ chars.push(<span className="char">{text[i]}</span>);
233
+ }
234
+ this.clearMount(chars, this.text);
235
+ }
236
+
205
237
  render() {
206
238
  const { value, type, placeholder, onFocus, onBlur } = this.props;
207
239
  return (
@@ -226,9 +258,7 @@ export class Input extends Component<Props> implements IFocusable {
226
258
  >
227
259
  {placeholder}
228
260
  </div>
229
- <div ref={this.text} className="text">
230
- {this.filterText(value)}
231
- </div>
261
+ <div ref={this.text} className="text" />
232
262
  <div ref={this.caret} className="caret" />
233
263
  </div>
234
264
  </Interactable>