@applicaster/zapp-react-dom-app 13.0.0-rc.2 → 13.0.0-rc.20

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.
@@ -23,8 +23,6 @@ import {
23
23
 
24
24
  import { showConfirmationDialog } from "@applicaster/zapp-react-native-utils/alertUtils";
25
25
 
26
- import { withUseSeek } from "@applicaster/zapp-react-native-utils/reactHooks/player";
27
-
28
26
  import {
29
27
  DISPLAY_STATES,
30
28
  DisplayStateContext,
@@ -48,6 +46,7 @@ import {
48
46
 
49
47
  import { OnScreenKeyboard } from "@applicaster/zapp-react-dom-ui-components/Components/OnScreenKeyboard";
50
48
  import { KeyboardLongPressManager } from "@applicaster/zapp-react-dom-ui-components/Utils/KeyboardLongPressManager";
49
+ import { KeyInputHandler } from "@applicaster/zapp-react-native-utils/appUtils/keyInputHandler/KeyInputHandler";
51
50
 
52
51
  const { withXray } = getXray();
53
52
  const globalAny: any = global;
@@ -62,14 +61,6 @@ type Props = {
62
61
  navigator: QuickBrickAppNavigator;
63
62
  rivers: {};
64
63
  xray: XRayContext;
65
- seekMethods: {
66
- onRewindPress: () => void;
67
- onRewindLongPress: () => void;
68
- onForwardPress: () => void;
69
- onForwardLongPress: () => void;
70
- onRewindPressOut: () => void;
71
- onForwardPressOut: () => void;
72
- };
73
64
  confirmDialog: typeof confirmationDialogStore;
74
65
  };
75
66
 
@@ -181,6 +172,11 @@ class InteractionManagerClass extends React.Component<Props, State> {
181
172
 
182
173
  window.addEventListener("onLongPress", this.handleLongPress.bind(this));
183
174
 
175
+ window.addEventListener(
176
+ "onPressRelease",
177
+ this.handleLongPressRelease.bind(this)
178
+ );
179
+
184
180
  window.addEventListener(
185
181
  "onLongPressRelease",
186
182
  this.handleLongPressRelease.bind(this)
@@ -339,9 +335,34 @@ class InteractionManagerClass extends React.Component<Props, State> {
339
335
  }
340
336
 
341
337
  onKeyUp(event: KeyboardEvent) {
338
+ const { setDisplayState } = this.props;
339
+
342
340
  if (this.keySupportsLongPress(event)) {
343
341
  this.longPressDetector.endKeyPressMonitoring(event.code);
344
342
  }
343
+
344
+ if (
345
+ keyCode(event).matches(KEYS.Enter) ||
346
+ (__DEV__ && keyCode(event).matches(KEYS.X))
347
+ ) {
348
+ focusManager.pressOut();
349
+ }
350
+
351
+ if (
352
+ keyCode(event).matches(KEYS.Forward) ||
353
+ (__DEV__ && keyCode(event).matches(KEYS.C))
354
+ ) {
355
+ setDisplayState(DISPLAY_STATES.HUD);
356
+ KeyInputHandler.getInstance().onForwardPressOut();
357
+ }
358
+
359
+ if (
360
+ keyCode(event).matches(KEYS.Rewind) ||
361
+ (__DEV__ && keyCode(event).matches(KEYS.Z))
362
+ ) {
363
+ setDisplayState(DISPLAY_STATES.HUD);
364
+ KeyInputHandler.getInstance().onRewindPressOut();
365
+ }
345
366
  }
346
367
 
347
368
  onKeyDown(event) {
@@ -366,12 +387,13 @@ class InteractionManagerClass extends React.Component<Props, State> {
366
387
  }
367
388
 
368
389
  // None of the logic below should be executed for repeated keys
369
- if (event.repeat) return;
390
+ if (event.repeat && !keyCode(event).matchesAny(...ARROW_KEYS)) return;
370
391
 
371
392
  /**
372
393
  When the player is displayed, we listen to Native Play / Pause / Stop
373
394
  buttons. Any other key press will display the transport controls
374
395
  */
396
+
375
397
  if (
376
398
  displayState === DISPLAY_STATES.PLAYER ||
377
399
  displayState === DISPLAY_STATES.HUD
@@ -404,16 +426,22 @@ class InteractionManagerClass extends React.Component<Props, State> {
404
426
  return;
405
427
  }
406
428
 
407
- if (keyCode(event).matches(KEYS.Forward)) {
429
+ if (
430
+ keyCode(event).matches(KEYS.Forward) ||
431
+ (__DEV__ && keyCode(event).matches(KEYS.C))
432
+ ) {
408
433
  setDisplayState(DISPLAY_STATES.HUD);
409
- this.props.seekMethods.onForwardPress();
434
+ KeyInputHandler.getInstance().onForwardPress();
410
435
 
411
436
  return;
412
437
  }
413
438
 
414
- if (keyCode(event).matches(KEYS.Rewind)) {
439
+ if (
440
+ keyCode(event).matches(KEYS.Rewind) ||
441
+ (__DEV__ && keyCode(event).matches(KEYS.Z))
442
+ ) {
415
443
  setDisplayState(DISPLAY_STATES.HUD);
416
- this.props.seekMethods.onRewindPress();
444
+ KeyInputHandler.getInstance().onRewindPress();
417
445
 
418
446
  return;
419
447
  }
@@ -451,7 +479,9 @@ class InteractionManagerClass extends React.Component<Props, State> {
451
479
  const isHookInHomescreen = entryData?.payload?.home;
452
480
 
453
481
  const isHookFlowBlocker =
454
- entryData?.hookPlugin?.module?.isFlowBlocker();
482
+ typeof entryData?.hookPlugin?.module?.isFlowBlocker === "function"
483
+ ? entryData?.hookPlugin?.module?.isFlowBlocker()
484
+ : entryData?.hookPlugin?.module?.isFlowBlocker;
455
485
 
456
486
  if (isHookInHomescreen && isHookFlowBlocker) {
457
487
  this.platformBack();
@@ -473,7 +503,10 @@ class InteractionManagerClass extends React.Component<Props, State> {
473
503
  }
474
504
  }
475
505
 
476
- if (keyCode(event).matches(KEYS.Enter)) {
506
+ if (
507
+ keyCode(event).matches(KEYS.Enter) ||
508
+ (__DEV__ && keyCode(event).matches(KEYS.X))
509
+ ) {
477
510
  if (displayState === DISPLAY_STATES.PLAYER) {
478
511
  setDisplayState(DISPLAY_STATES.HUD);
479
512
  } else {
@@ -590,6 +623,7 @@ class InteractionManagerClass extends React.Component<Props, State> {
590
623
 
591
624
  if (
592
625
  (target.tagName === "INPUT" && target.type === "text") ||
626
+ (target.tagName === "INPUT" && target.type === "password") ||
593
627
  target.tagName === "TEXTAREA"
594
628
  ) {
595
629
  this.setState({
@@ -688,54 +722,43 @@ class InteractionManagerClass extends React.Component<Props, State> {
688
722
  }, SEQUENCE_ENTRY_TIME);
689
723
  }
690
724
 
725
+ // TODO: Delete it on next PR if not needed
691
726
  private handleLongPress = (event: CustomEvent) => {
692
727
  const { keyCode } = event.detail;
693
- const { displayState } = this.props;
694
- const playerState = displayState === DISPLAY_STATES.PLAYER;
695
- const hudState = displayState === DISPLAY_STATES.HUD;
696
- const playbackState = playerState || hudState;
697
728
  this.longPressActive = true;
698
729
  this.cancelHudTimeout();
699
730
 
700
731
  switch (keyCode) {
701
- case KEYS.Forward.code:
702
- playbackState && this.props.seekMethods.onForwardLongPress();
703
- break;
704
-
705
- case KEYS.Rewind.code:
706
- playbackState && this.props.seekMethods.onRewindLongPress();
707
- break;
708
-
709
732
  case KEYS.Enter.code:
733
+ case KEYS.X.code:
710
734
  focusManager.longPress();
711
735
  break;
712
736
  }
713
737
  };
714
738
 
739
+ // TODO: Delete it on next PR if not needed
715
740
  private handleLongPressRelease = (event: CustomEvent) => {
716
741
  const { keyCode } = event.detail;
717
742
  this.longPressActive = false;
718
743
  this.resetHudTimeout();
719
744
 
720
745
  switch (keyCode) {
721
- case KEYS.Forward.code:
722
- this.props.seekMethods.onForwardPressOut();
723
- break;
724
-
725
- case KEYS.Rewind.code:
726
- this.props.seekMethods.onRewindPressOut();
727
- break;
728
-
729
746
  case KEYS.Enter.code:
730
- focusManager.pressOut();
747
+ case KEYS.X.code:
748
+ // focusManager.pressOut();
731
749
  break;
732
750
  }
733
751
  };
734
752
 
735
753
  private keySupportsLongPress(event: KeyboardEvent): boolean {
736
- return [KEYS.Forward.code, KEYS.Rewind.code, KEYS.Enter.code].includes(
737
- event.code
738
- );
754
+ return [
755
+ KEYS.Forward.code,
756
+ KEYS.Rewind.code,
757
+ KEYS.Enter.code,
758
+ KEYS.Z.code,
759
+ KEYS.X.code,
760
+ KEYS.C.code,
761
+ ].includes(event.code);
739
762
  }
740
763
 
741
764
  render() {
@@ -754,7 +777,6 @@ class InteractionManagerClass extends React.Component<Props, State> {
754
777
 
755
778
  export const InteractionManager = R.compose(
756
779
  withNavigator,
757
- withUseSeek,
758
780
  withXray,
759
781
  connectToStore(R.pick(["rivers"])),
760
782
  PlayerContentContext.withConsumer,
@@ -1,15 +1,15 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
3
  exports[`loadDomPlugins when there are plugins requiring to write to the dom skips plugins without init method 1`] = `
4
- Array [
5
- Array [
4
+ [
5
+ [
6
6
  "could not initialize plugin Plugin with Dom node & no init method - it doesn't have an init method",
7
- Object {
8
- "plugin": Object {
9
- "configuration": Object {
7
+ {
8
+ "plugin": {
9
+ "configuration": {
10
10
  "foo": "bar",
11
11
  },
12
- "module": Object {
12
+ "module": {
13
13
  "requiresAppendingDomNode": true,
14
14
  },
15
15
  "name": "Plugin with Dom node & no init method",
@@ -11,11 +11,28 @@ import {
11
11
  PLATFORMS,
12
12
  } from "./const";
13
13
 
14
+ /**
15
+ * @typedef {"tv" | "web" | "other"} DeviceType
16
+ * @typedef {"samsung_tv" | "lg_tv" | unknown} CustomPlatformTypes
17
+ */
18
+
19
+ /**
20
+ * Retrieves the user agent string from the browser or global navigator.
21
+ * @returns {string} The user agent string.
22
+ */
14
23
  export const getUserAgent = () =>
15
24
  window?.navigator?.userAgent || global?.navigator?.userAgent;
16
25
 
26
+ /**
27
+ * Checks if the device is HD (1280 width).
28
+ * @returns {boolean} True if the device is HD, false otherwise.
29
+ */
17
30
  export const isHD = () => window.innerWidth === 1280;
18
31
 
32
+ /**
33
+ * Checks if the platform is LG.
34
+ * @returns {boolean} True if the platform is LG, false otherwise.
35
+ */
19
36
  export const isLgPlatform = () => {
20
37
  const userAgent = getUserAgent();
21
38
 
@@ -23,10 +40,13 @@ export const isLgPlatform = () => {
23
40
  return false;
24
41
  }
25
42
 
26
- // Note: LG uses the number 0 in their userAgent, possibly because of Palm WebOS
27
43
  return hasWebOS || userAgent.includes(PLATFORMS.webos);
28
44
  };
29
45
 
46
+ /**
47
+ * Checks if the platform is Samsung.
48
+ * @returns {boolean} True if the platform is Samsung, false otherwise.
49
+ */
30
50
  export const isSamsungPlatform = () => {
31
51
  const userAgent = getUserAgent();
32
52
 
@@ -42,42 +62,39 @@ export const isSamsungPlatform = () => {
42
62
  };
43
63
 
44
64
  /**
45
- * Checks if we are on the Vizio platform by using the userAgent string
46
- *
47
- * Use this method when you need to identify the platform on runtime
48
- * before the VIZIO Companion Library has loaded
65
+ * Checks if the platform is Vizio by using the user agent string.
66
+ * @returns {boolean} True if the platform is Vizio, false otherwise.
49
67
  */
50
68
  export const isVizioPlatform = () => {
51
69
  const userAgent = getUserAgent();
52
70
 
53
- const isVizioAgent =
71
+ return (
54
72
  userAgent.includes(PLATFORMS.vizio) ||
55
73
  userAgent.includes(PLATFORMS.smartcast) ||
56
- userAgent.includes(PLATFORMS.conjure);
57
-
58
- return isVizioAgent;
74
+ userAgent.includes(PLATFORMS.conjure)
75
+ );
59
76
  };
60
77
 
61
78
  /**
62
- * Checks if we are on the Vizio platform by checking for the global VIZIO object
63
- * and the VIZIO Companion Library. This method does not use the userAgent string,
64
- * because it mainly checks whether we have access to apis, which may not be available yet
79
+ * Checks if the Vizio APIs are available.
80
+ * @returns {boolean} True if the Vizio APIs are available, false otherwise.
65
81
  */
66
82
  export const hasVizioAPIs = () => {
67
- const hasAPIs =
83
+ return (
68
84
  typeof window.VIZIO !== "undefined" &&
69
- window?.applicaster?.vizioLibraryDidLoad;
70
-
71
- return hasAPIs;
85
+ window?.applicaster?.vizioLibraryDidLoad
86
+ );
72
87
  };
73
88
 
74
89
  /**
75
- * platformSelect can't be used, because Platform.OS is overriden
76
- * by overloadReactNativePlatform and don't support 'web' value
77
- * @returns {"tv" | "web" | "other"} value
90
+ * Determines the device type based on the platform.
91
+ * @returns {DeviceType} The device type ("tv", "web", or "other").
78
92
  */
79
93
  export const getDeviceType = () => {
80
- switch (Platform.OS) {
94
+ /** @type {CustomPlatformTypes} */
95
+ const platformOS = Platform.OS;
96
+
97
+ switch (platformOS) {
81
98
  case "samsung_tv":
82
99
  return isSamsungPlatform() ? "tv" : "web";
83
100
  case "lg_tv":
@@ -88,14 +105,15 @@ export const getDeviceType = () => {
88
105
  };
89
106
 
90
107
  /**
91
- * This function is used to rename keys
92
- * @param {string} key - key you would like to rename
108
+ * Renames keys based on a predefined map.
109
+ * @param {string} key - The key to rename.
110
+ * @returns {string} The renamed key.
93
111
  */
94
112
  export const renameKeys = (key) => desiredKeysMap?.[key] || key;
95
113
 
96
114
  /**
97
- * This function is used to get the connection info from WebOS
98
- * TODO: move to connection hook
115
+ * Retrieves the connection info from WebOS.
116
+ * @returns {Promise<{networkType: string} | null>} A promise that resolves with the connection info or null.
99
117
  */
100
118
  export const getWebOSConnectionInfo = () => {
101
119
  return new Promise((resolve, reject) => {
@@ -108,7 +126,6 @@ export const getWebOSConnectionInfo = () => {
108
126
  webOS.service.request("luna://com.palm.connectionmanager", {
109
127
  method: "getStatus",
110
128
  parameters: { subscribe: false },
111
-
112
129
  onSuccess: (args) => {
113
130
  const types = Object.keys(args)
114
131
  .filter((key) => args[key].state === "connected")
@@ -116,7 +133,6 @@ export const getWebOSConnectionInfo = () => {
116
133
 
117
134
  resolve({ networkType: types });
118
135
  },
119
-
120
136
  onFailure: (error) => {
121
137
  console.error(
122
138
  "getWebOSConnectionInfo: There was an error getting connection info",
@@ -129,6 +145,10 @@ export const getWebOSConnectionInfo = () => {
129
145
  });
130
146
  };
131
147
 
148
+ /**
149
+ * Retrieves the connection info from Tizen.
150
+ * @returns {Promise<{networkType: string} | null>} A promise that resolves with the connection info or null.
151
+ */
132
152
  export const getTizenConnectionInfo = () => {
133
153
  return new Promise((resolve, reject) => {
134
154
  if (!isSamsungPlatform) {
@@ -1,7 +1,7 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
3
  exports[`storageObject when the requested storage exists getAllItems returns all keys 1`] = `
4
- Object {
4
+ {
5
5
  "baz_::_foo": "baz",
6
6
  "baz_::_otherKey": "otherValue",
7
7
  "foo": "bar",
@@ -10,7 +10,7 @@ Object {
10
10
  `;
11
11
 
12
12
  exports[`storageObject when the requested storage exists getAllItems returns all keys 2`] = `
13
- Object {
13
+ {
14
14
  "baz_::_foo": "baz",
15
15
  "baz_::_otherKey": "otherValue",
16
16
  "foo": "bar",
@@ -19,14 +19,14 @@ Object {
19
19
  `;
20
20
 
21
21
  exports[`storageObject when the requested storage exists getAllItems returns all keys in the namespace if provided 1`] = `
22
- Object {
22
+ {
23
23
  "foo": "baz",
24
24
  "otherKey": "otherValue",
25
25
  }
26
26
  `;
27
27
 
28
28
  exports[`storageObject when the requested storage exists getAllItems returns all keys in the namespace if provided 2`] = `
29
- Object {
29
+ {
30
30
  "foo": "baz",
31
31
  "otherKey": "otherValue",
32
32
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-dom-app",
3
- "version": "13.0.0-rc.2",
3
+ "version": "13.0.0-rc.20",
4
4
  "description": "Zapp App Component for Applicaster's Quick Brick React Native App",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -22,11 +22,11 @@
22
22
  },
23
23
  "homepage": "https://github.com/applicaster/zapp-react-dom-app#readme",
24
24
  "dependencies": {
25
- "@applicaster/zapp-react-dom-ui-components": "13.0.0-rc.2",
26
- "@applicaster/zapp-react-native-bridge": "13.0.0-rc.2",
27
- "@applicaster/zapp-react-native-redux": "13.0.0-rc.2",
28
- "@applicaster/zapp-react-native-ui-components": "13.0.0-rc.2",
29
- "@applicaster/zapp-react-native-utils": "13.0.0-rc.2",
25
+ "@applicaster/zapp-react-dom-ui-components": "13.0.0-rc.20",
26
+ "@applicaster/zapp-react-native-bridge": "13.0.0-rc.20",
27
+ "@applicaster/zapp-react-native-redux": "13.0.0-rc.20",
28
+ "@applicaster/zapp-react-native-ui-components": "13.0.0-rc.20",
29
+ "@applicaster/zapp-react-native-utils": "13.0.0-rc.20",
30
30
  "abortcontroller-polyfill": "^1.7.5",
31
31
  "history": "^4.7.2",
32
32
  "react-router-dom": "^5.1.2",
@@ -36,9 +36,19 @@
36
36
  "videojs-contrib-quality-levels": "3.0.0"
37
37
  },
38
38
  "peerDependencies": {
39
+ "@applicaster/zapp-pipes-v2-client": "*",
40
+ "@react-native-community/netinfo": "*",
41
+ "@types/node": "*",
39
42
  "core-js": "3.29.1",
43
+ "immer": "*",
40
44
  "react": "17.0.2",
41
45
  "react-dom": "17.0.2",
42
- "react-native-web": "0.18.11"
46
+ "react-native": "*",
47
+ "react-native-safe-area-context": "*",
48
+ "react-native-svg": "*",
49
+ "react-native-web": "0.18.11",
50
+ "uglify-js": "*",
51
+ "validate-color": "*",
52
+ "zustand": "*"
43
53
  }
44
54
  }