@applicaster/zapp-react-dom-app 13.0.0-alpha.9946926334 → 13.0.0-rc.100

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.
@@ -31,7 +31,10 @@ import {
31
31
  import { PlayerContentContext } from "@applicaster/zapp-react-dom-ui-components/Contexts";
32
32
 
33
33
  import { withNavigator } from "@applicaster/zapp-react-native-ui-components/Decorators/Navigator";
34
- import { getXray } from "@applicaster/zapp-react-native-utils/logger";
34
+ import {
35
+ getXray,
36
+ createLogger,
37
+ } from "@applicaster/zapp-react-native-utils/logger";
35
38
 
36
39
  import {
37
40
  confirmationDialogStore,
@@ -51,6 +54,11 @@ import { KeyInputHandler } from "@applicaster/zapp-react-native-utils/appUtils/k
51
54
  const { withXray } = getXray();
52
55
  const globalAny: any = global;
53
56
 
57
+ const { log_debug, log_warning } = createLogger({
58
+ category: "InteractionManager",
59
+ subsystem: "zapp-react-dom-app",
60
+ });
61
+
54
62
  const shouldUseOnScreenKeyboard = () =>
55
63
  isVizioPlatform() || window.applicaster.useOnScreenKeyboard;
56
64
 
@@ -140,13 +148,16 @@ class InteractionManagerClass extends React.Component<Props, State> {
140
148
  this.onConfirmDialogOpen = this.onConfirmDialogOpen.bind(this);
141
149
  this.onConfirmDialogClose = this.onConfirmDialogClose.bind(this);
142
150
 
151
+ this.handlePhysicalKeyboardDismiss =
152
+ this.handlePhysicalKeyboardDismiss.bind(this);
153
+
143
154
  this.confirmDialog.setConfirmAction(this.performExit);
144
155
  this.confirmDialog.setCancelAction(this.onConfirmDialogClose);
145
156
  this.longPressDetector = new KeyboardLongPressManager();
146
157
  }
147
158
 
148
159
  componentDidMount() {
149
- window.addEventListener("keydown", this.onKeyDownListener);
160
+ window.addEventListener("keydown", this.onKeyDownListener, true);
150
161
  window.addEventListener("keyup", this.onKeyUp);
151
162
  window.addEventListener("mousemove", this.onMouseMoveListener);
152
163
 
@@ -181,6 +192,11 @@ class InteractionManagerClass extends React.Component<Props, State> {
181
192
  "onLongPressRelease",
182
193
  this.handleLongPressRelease.bind(this)
183
194
  );
195
+
196
+ document.addEventListener(
197
+ "keyboardDismissedByPhysicalKeypress",
198
+ this.handlePhysicalKeyboardDismiss
199
+ );
184
200
  }
185
201
 
186
202
  componentWillUnmount() {
@@ -209,6 +225,11 @@ class InteractionManagerClass extends React.Component<Props, State> {
209
225
  "onLongPressRelease",
210
226
  this.handleLongPressRelease
211
227
  );
228
+
229
+ document.removeEventListener(
230
+ "keyboardDismissedByPhysicalKeypress",
231
+ this.handlePhysicalKeyboardDismiss
232
+ );
212
233
  }
213
234
 
214
235
  performExit() {
@@ -270,8 +291,7 @@ class InteractionManagerClass extends React.Component<Props, State> {
270
291
  this.handleWebOsBack();
271
292
  }
272
293
  } catch (e) {
273
- // eslint-disable-next-line no-console
274
- console.warn("Failed to execute platformBack", e);
294
+ log_warning("Failed to execute platformBack", e);
275
295
  }
276
296
  }
277
297
 
@@ -365,28 +385,108 @@ class InteractionManagerClass extends React.Component<Props, State> {
365
385
  }
366
386
  }
367
387
 
368
- onKeyDown(event) {
388
+ /**
389
+ When pressing escape or the Native "Back" button:
390
+ if on the transport controls: we show the player
391
+ if on the player : we show the UI
392
+ if on the UI : we exit the app
393
+ note: backspace affects the keyboard input, so it behaves differently
394
+ */
395
+ onBackPress(event) {
369
396
  const { displayState, setDisplayState, navigator } = this.props;
397
+ const { isDialogVisible } = confirmationDialogStore.getState();
370
398
  const { isKeyboardVisible } = this.state;
371
399
 
372
- const { isDialogVisible } = confirmationDialogStore.getState();
400
+ log_debug("onBackPress", {
401
+ eventCode: event.code,
402
+ displayState,
403
+ isDialogVisible,
404
+ isKeyboardVisible,
405
+ });
373
406
 
374
407
  if (isKeyboardVisible && shouldUseOnScreenKeyboard()) {
375
- if (keyCode(event).matchesAny("Escape", "Back")) {
376
- this.handleKeyboardDismiss();
377
- }
378
-
408
+ this.handleKeyboardDismiss();
379
409
  event.preventDefault();
380
410
  event.stopPropagation();
381
411
 
382
412
  return;
383
413
  }
384
414
 
415
+ switch (displayState) {
416
+ case DISPLAY_STATES.DEFAULT:
417
+ case DISPLAY_STATES.PLAYER:
418
+ if (isDialogVisible) {
419
+ this.onConfirmDialogClose();
420
+ } else if (navigator.canGoBack()) {
421
+ navigator.goBack();
422
+ } else if (this.isHomeScreen()) {
423
+ this.platformBack();
424
+ } else if (navigator.currentRoute.includes("hook")) {
425
+ // If code reaches this block navigator cant go back, it is not home,
426
+ // and this is a login plugin that was pushed on top of the home
427
+ // Treat it like a home screen and run platformBack()
428
+ const entryData = navigator?.data?.entry;
429
+ const isHookInHomescreen = entryData?.payload?.home;
430
+
431
+ const isHookFlowBlocker =
432
+ typeof entryData?.hookPlugin?.module?.isFlowBlocker === "function"
433
+ ? entryData?.hookPlugin?.module?.isFlowBlocker()
434
+ : entryData?.hookPlugin?.module?.isFlowBlocker;
435
+
436
+ if (isHookInHomescreen && isHookFlowBlocker) {
437
+ this.platformBack();
438
+ } else {
439
+ navigator.goBack(false, true);
440
+ }
441
+ } else {
442
+ this.goToHome();
443
+ }
444
+
445
+ break;
446
+ case DISPLAY_STATES.HUD:
447
+ // IF transport controls are open, close them instead of closing player
448
+ setDisplayState(DISPLAY_STATES.PLAYER);
449
+ break;
450
+ default:
451
+ setDisplayState(DISPLAY_STATES.PLAYER);
452
+ break;
453
+ }
454
+ }
455
+
456
+ onBackspacePress(event) {
457
+ const isInputFocused =
458
+ document.activeElement instanceof HTMLInputElement ||
459
+ document.activeElement instanceof HTMLTextAreaElement;
460
+
461
+ // Don't handle backspace if input is focused
462
+ if (isInputFocused) {
463
+ return;
464
+ }
465
+
466
+ this.onBackPress(event);
467
+ }
468
+
469
+ onKeyDown(event) {
470
+ const { displayState, setDisplayState, navigator } = this.props;
471
+ const { isDialogVisible } = confirmationDialogStore.getState();
472
+
473
+ if (keyCode(event).matches("Backspace")) {
474
+ this.onBackspacePress(event);
475
+
476
+ return;
477
+ }
478
+
479
+ if (keyCode(event).matchesAny(KEYS.Back, KEYS.Escape, KEYS.EscapeDevice)) {
480
+ this.onBackPress(event);
481
+
482
+ return;
483
+ }
484
+
385
485
  if (this.keySupportsLongPress(event)) {
386
486
  this.longPressDetector.monitorKeyPress(event.code, event);
387
487
  }
388
488
 
389
- // None of the logic below should be executed for repeated keys
489
+ // Only handle repeat events for arrow keys
390
490
  if (event.repeat && !keyCode(event).matchesAny(...ARROW_KEYS)) return;
391
491
 
392
492
  /**
@@ -447,62 +547,6 @@ class InteractionManagerClass extends React.Component<Props, State> {
447
547
  }
448
548
  }
449
549
 
450
- /**
451
- When pressing backspace or the Native "Back" button:
452
- if on the transport controls: we show the player
453
- if on the player : we show the UI
454
- if on the UI : we exit the app
455
- */
456
-
457
- if (
458
- keyCode(event).matchesAny(
459
- KEYS.Back,
460
- KEYS.Escape,
461
- KEYS.EscapeDevice,
462
- KEYS.Backspace
463
- )
464
- ) {
465
- switch (displayState) {
466
- case DISPLAY_STATES.DEFAULT:
467
- case DISPLAY_STATES.PLAYER:
468
- if (isDialogVisible) {
469
- this.onConfirmDialogClose();
470
- } else if (navigator.canGoBack()) {
471
- navigator.goBack();
472
- } else if (this.isHomeScreen()) {
473
- this.platformBack();
474
- } else if (navigator.currentRoute.includes("hook")) {
475
- // If code reaches this block navigator cant go back, it is not home,
476
- // and this is a login plugin that was pushed on top of the home
477
- // Treat it like a home screen and run platformBack()
478
- const entryData = navigator?.data?.entry;
479
- const isHookInHomescreen = entryData?.payload?.home;
480
-
481
- const isHookFlowBlocker =
482
- typeof entryData?.hookPlugin?.module?.isFlowBlocker === "function"
483
- ? entryData?.hookPlugin?.module?.isFlowBlocker()
484
- : entryData?.hookPlugin?.module?.isFlowBlocker;
485
-
486
- if (isHookInHomescreen && isHookFlowBlocker) {
487
- this.platformBack();
488
- } else {
489
- navigator.goBack(false, true);
490
- }
491
- } else {
492
- this.goToHome();
493
- }
494
-
495
- break;
496
- case DISPLAY_STATES.HUD:
497
- // IF transport controls are open, close them instead of closing player
498
- setDisplayState(DISPLAY_STATES.PLAYER);
499
- break;
500
- default:
501
- setDisplayState(DISPLAY_STATES.PLAYER);
502
- break;
503
- }
504
- }
505
-
506
550
  if (
507
551
  keyCode(event).matches(KEYS.Enter) ||
508
552
  (__DEV__ && keyCode(event).matches(KEYS.X))
@@ -510,6 +554,7 @@ class InteractionManagerClass extends React.Component<Props, State> {
510
554
  if (displayState === DISPLAY_STATES.PLAYER) {
511
555
  setDisplayState(DISPLAY_STATES.HUD);
512
556
  } else {
557
+ focusManager.pressIn();
513
558
  focusManager.press();
514
559
  }
515
560
 
@@ -526,10 +571,7 @@ class InteractionManagerClass extends React.Component<Props, State> {
526
571
  this.platformBack();
527
572
  }
528
573
 
529
- if (
530
- keyCode(event).matchesAny(...ARROW_KEYS) &&
531
- !this.state.isKeyboardVisible
532
- ) {
574
+ if (keyCode(event).matchesAny(...ARROW_KEYS)) {
533
575
  if (displayState === DISPLAY_STATES.PLAYER) {
534
576
  setDisplayState(DISPLAY_STATES.HUD);
535
577
  }
@@ -652,7 +694,7 @@ class InteractionManagerClass extends React.Component<Props, State> {
652
694
  }
653
695
  }
654
696
 
655
- handleKeyboardDismiss = () => {
697
+ handleKeyboardDismiss() {
656
698
  this.isDismissing = true;
657
699
 
658
700
  this.setState(
@@ -663,9 +705,10 @@ class InteractionManagerClass extends React.Component<Props, State> {
663
705
  },
664
706
  () => {
665
707
  this.isDismissing = false;
708
+ focusManager.recoverFocus();
666
709
  }
667
710
  );
668
- };
711
+ }
669
712
 
670
713
  handleKeyboardInput = (value: string) => {
671
714
  const { activeInputRef } = this.state;
@@ -761,6 +804,35 @@ class InteractionManagerClass extends React.Component<Props, State> {
761
804
  ].includes(event.code);
762
805
  }
763
806
 
807
+ handlePhysicalKeyboardDismiss(event: CustomEvent) {
808
+ const { value, position, inputElement } = event.detail;
809
+
810
+ this.isDismissing = true;
811
+
812
+ this.setState(
813
+ {
814
+ isKeyboardVisible: false,
815
+ keyboardInput: "",
816
+ activeInputRef: null,
817
+ },
818
+ () => {
819
+ if (inputElement) {
820
+ inputElement.value = value;
821
+ inputElement.focus();
822
+ inputElement.setSelectionRange(position, position);
823
+
824
+ const keyboardEvent = new CustomEvent("keyboardUpdate", {
825
+ detail: { value },
826
+ });
827
+
828
+ document.dispatchEvent(keyboardEvent);
829
+ }
830
+
831
+ this.isDismissing = false;
832
+ }
833
+ );
834
+ }
835
+
764
836
  render() {
765
837
  return (
766
838
  (shouldUseOnScreenKeyboard() && this.state.isKeyboardVisible && (
@@ -4,8 +4,6 @@ import { Background } from "@applicaster/zapp-react-dom-ui-components/Components
4
4
  import { ConfirmDialog } from "@applicaster/zapp-react-dom-ui-components/Components/ConfirmDialog";
5
5
  import { NavWrapper } from "@applicaster/zapp-react-dom-ui-components/Components/NavWrapper";
6
6
  import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
7
- import { getLocalizations } from "@applicaster/zapp-react-native-utils/localizationUtils";
8
- import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
9
7
 
10
8
  import LayoutComponent from "@applicaster/zapp-react-native-ui-components/Components/Layout";
11
9
 
@@ -16,16 +14,11 @@ type Props = {
16
14
  export function Layout({ children }: Props) {
17
15
  const { activeRiver } = useNavigation();
18
16
 
19
- const { remoteConfigurations } = usePickFromState(["remoteConfigurations"]);
20
-
21
- const localizations = getLocalizations(remoteConfigurations);
22
-
23
17
  const ComponentsExtraProps = React.useMemo(
24
18
  () => ({
25
19
  NavBar: { activeRiver },
26
- Background: { localizations },
27
20
  }),
28
- [activeRiver, localizations]
21
+ [activeRiver]
29
22
  );
30
23
 
31
24
  return (
@@ -3,11 +3,6 @@ import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils"
3
3
  import { QuickBrickCommunicationModule } from "../../Polyfills/QuickBrickCommunicationModule";
4
4
  import { loadLocaleImpl, getLanguageCode } from "./utils";
5
5
 
6
- type Locale = {
7
- language: string,
8
- country: string,
9
- };
10
-
11
6
  async function getBrowserLocale() {
12
7
  return navigator.language;
13
8
  }
@@ -19,7 +14,7 @@ async function getSamsungLocale() {
19
14
  }
20
15
 
21
16
  try {
22
- tizen.systeminfo.getPropertyValue("LOCALE", (locale: Locale) => {
17
+ tizen.systeminfo.getPropertyValue("LOCALE", (locale) => {
23
18
  resolve(locale.language);
24
19
  });
25
20
  } catch (e) {
@@ -31,31 +31,3 @@ exports[`storageObject when the requested storage exists getAllItems returns all
31
31
  "otherKey": "otherValue",
32
32
  }
33
33
  `;
34
-
35
- exports[`storageObject when the requested storage exists getItem gets properties from the storage 1`] = `"bar"`;
36
-
37
- exports[`storageObject when the requested storage exists getItem gets properties from the storage 2`] = `"bar"`;
38
-
39
- exports[`storageObject when the requested storage exists getItem gets properties from the storage 3`] = `"bar"`;
40
-
41
- exports[`storageObject when the requested storage exists getItem gets properties from the storage 4`] = `"bar"`;
42
-
43
- exports[`storageObject when the requested storage exists getItem gets properties from the storage with a namespace 1`] = `"baz"`;
44
-
45
- exports[`storageObject when the requested storage exists getItem gets properties from the storage with a namespace 2`] = `"baz"`;
46
-
47
- exports[`storageObject when the requested storage exists getItem rejects if the property cannot be retrieved 1`] = `[Error: Could not retrieve item applicaster.v2_::_fail_key]`;
48
-
49
- exports[`storageObject when the requested storage exists getItem rejects if the property cannot be retrieved 2`] = `[Error: Could not retrieve item applicaster.v2_::_fail_key]`;
50
-
51
- exports[`storageObject when the requested storage exists removeItem removes an item 1`] = `true`;
52
-
53
- exports[`storageObject when the requested storage exists removeItem removes an item 2`] = `true`;
54
-
55
- exports[`storageObject when the requested storage exists removeItem removes an item 3`] = `true`;
56
-
57
- exports[`storageObject when the requested storage exists removeItem removes an item 4`] = `true`;
58
-
59
- exports[`storageObject when the requested storage exists setItem will reject a promise if it the setting of the data fails 1`] = `[Error: Could not set item applicaster.v2_::_fail_key]`;
60
-
61
- exports[`storageObject when the requested storage exists setItem will reject a promise if it the setting of the data fails 2`] = `[Error: Could not set item applicaster.v2_::_fail_key]`;
@@ -4,7 +4,8 @@ import {
4
4
  applyNamespaceToKeyName,
5
5
  STORAGE_TYPES,
6
6
  DEFAULT_NAMESPACE,
7
- } from "../index";
7
+ } from "../";
8
+
8
9
  import { StorageMock } from "./StorageMocks";
9
10
 
10
11
  import * as functionUtils from "@applicaster/zapp-react-native-utils/functionUtils";
@@ -26,14 +27,7 @@ function clearStorage() {
26
27
  R.forEach((storage) => global.window[storage].clear(), STORAGE_TYPES);
27
28
  }
28
29
 
29
- async function testStorage(expectations) {
30
- await Promise.all(
31
- R.map((storage) => {
32
- const Storage = getStorageModule(storage);
33
- expectations(Storage);
34
- }, STORAGE_TYPES)
35
- );
36
- }
30
+ const storages = R.map((storage) => getStorageModule(storage), STORAGE_TYPES);
37
31
 
38
32
  describe("storageObject", () => {
39
33
  beforeEach(resetMocks);
@@ -48,143 +42,119 @@ describe("storageObject", () => {
48
42
 
49
43
  beforeEach(clearStorage);
50
44
 
51
- it("returns an object with 3 methods", () => {
52
- expect.assertions(6);
53
-
54
- testStorage((Storage) => {
55
- expect(Storage).toHaveProperty("setItem");
56
- expect(Storage).toHaveProperty("getItem");
57
- expect(Storage).toHaveProperty("getAllItems");
58
- });
45
+ it.each(storages)("returns an object with 3 methods", (storage) => {
46
+ expect(storage).toHaveProperty("setItem");
47
+ expect(storage).toHaveProperty("getItem");
48
+ expect(storage).toHaveProperty("getAllItems");
59
49
  });
60
50
 
61
51
  describe("setItem", () => {
62
52
  beforeEach(clearStorage);
63
53
 
64
- it("sets a property in the storage", async () => {
65
- expect.assertions(4);
54
+ it.each(storages)("sets a property in the storage", async (storage) => {
55
+ const result = await storage.setItem(key, value, null);
66
56
 
67
- await testStorage(async (Storage) => {
68
- const result = await Storage.setItem(key, value, null);
57
+ const keyWithDefaultNameSpace = applyNamespaceToKeyName(
58
+ key,
59
+ DEFAULT_NAMESPACE
60
+ );
69
61
 
70
- const keyWithDefaultNameSpace = applyNamespaceToKeyName(
71
- key,
72
- DEFAULT_NAMESPACE
73
- );
62
+ expect(result).toBe(true);
74
63
 
75
- expect(result).toBe(true);
76
- expect(Storage[keyWithDefaultNameSpace]).toEqual(value);
77
- });
64
+ expect(storage.getItem(keyWithDefaultNameSpace)).resolves.toEqual(
65
+ value
66
+ );
78
67
  });
79
68
 
80
- it("sets a property in the storage with a namespace", async () => {
81
- expect.assertions(4);
82
-
83
- await testStorage(async (Storage) => {
84
- const result = await Storage.setItem(key, namespaceValue, namespace);
69
+ it.each(storages)(
70
+ "sets a property in the storage with a namespace",
71
+ async (storage) => {
72
+ const result = await storage.setItem(key, namespaceValue, namespace);
85
73
 
86
74
  expect(result).toBe(true);
87
- expect(Storage[keyName]).toEqual(namespaceValue);
88
- });
89
- });
90
75
 
91
- it("will reject a promise if it the setting of the data fails", async () => {
92
- expect.assertions(2);
76
+ expect(storage.getItem(keyName)).resolves.toEqual(namespaceValue);
77
+ }
78
+ );
93
79
 
94
- await testStorage(async (Storage) => {
95
- await expect(
96
- Storage.setItem(failKey, value)
97
- ).rejects.toMatchSnapshot();
98
- });
99
- });
80
+ it.each(storages)(
81
+ "will reject a promise if it the setting of the data fails",
82
+ async (storage) => {
83
+ await expect(storage.setItem(failKey, value)).rejects.toThrow(
84
+ "Could not set item applicaster.v2_::_fail_key"
85
+ );
86
+ }
87
+ );
100
88
  });
101
89
 
102
90
  describe("getItem", () => {
103
91
  beforeEach(async () => {
104
92
  clearStorage();
105
93
 
106
- await testStorage(async (Storage) => {
94
+ storages.forEach((Storage) => {
107
95
  Storage.setItem(key, value, null);
108
96
  Storage.setItem(key, namespaceValue, namespace);
109
97
  });
110
98
  });
111
99
 
112
- it("gets properties from the storage", async () => {
113
- expect.assertions(8);
114
-
115
- await testStorage(async (Storage) => {
116
- await expect(Storage.getItem(key)).resolves.toEqual(value);
117
- await expect(Storage.getItem(key)).resolves.toMatchSnapshot();
118
- await expect(Storage.getItem(key, null)).resolves.toEqual(value);
119
- await expect(Storage.getItem(key, null)).resolves.toMatchSnapshot();
120
- });
100
+ it.each(storages)("gets properties from the storage", async (storage) => {
101
+ const result = await storage.getItem(key);
102
+ const resultWithNull = await storage.getItem(key, null);
103
+ expect(result).toEqual(value);
104
+ expect(resultWithNull).toEqual(value);
121
105
  });
122
106
 
123
- it("gets properties from the storage with a namespace", async () => {
124
- expect.assertions(4);
125
-
126
- await testStorage(async (Storage) => {
127
- await expect(Storage.getItem(key, namespace)).resolves.toEqual(
128
- namespaceValue
107
+ it.each(storages)(
108
+ "gets properties from the storage with a namespace",
109
+ (storage) => {
110
+ expect(storage.getItem(key, namespace)).resolves.toEqual(
111
+ "namespaceValue"
129
112
  );
113
+ }
114
+ );
130
115
 
131
- await expect(
132
- Storage.getItem(key, namespace)
133
- ).resolves.toMatchSnapshot();
134
- });
135
- });
136
-
137
- it("rejects if the property cannot be retrieved", async () => {
138
- expect.assertions(2);
139
-
140
- await testStorage(async (Storage) => {
141
- await expect(Storage.getItem(failKey)).rejects.toMatchSnapshot();
142
- });
143
- });
116
+ it.each(storages)(
117
+ "rejects if the property cannot be retrieved",
118
+ async (storage) => {
119
+ await expect(storage.getItem(failKey)).rejects.toThrow(
120
+ "Could not retrieve item applicaster.v2_::_fail_key"
121
+ );
122
+ }
123
+ );
144
124
  });
145
125
 
146
126
  describe("getAllItems", () => {
147
127
  beforeEach(async () => {
148
128
  clearStorage();
149
129
 
150
- await testStorage(async (Storage) => {
151
- await Storage.setItem(key, value);
152
- await Storage.setItem(key, namespaceValue, namespace);
153
- await Storage.setItem("otherKey", "otherValue");
154
- await Storage.setItem("otherKey", "otherValue", namespace);
130
+ storages.forEach((Storage) => {
131
+ Storage.setItem(key, value);
132
+ Storage.setItem(key, namespaceValue, namespace);
133
+ Storage.setItem("otherKey", "otherValue");
134
+ Storage.setItem("otherKey", "otherValue", namespace);
155
135
  });
156
136
  });
157
137
 
158
- it("returns all keys", async () => {
159
- expect.assertions(2);
160
-
161
- await testStorage(async (Storage) => {
162
- await expect(Storage.getAllItems()).resolves.toMatchSnapshot();
163
- });
138
+ it.each(storages)("returns all keys", async (Storage) => {
139
+ const res = await Storage.getAllItems();
140
+ expect(res).toMatchSnapshot();
164
141
  });
165
142
 
166
- it("returns all keys in the namespace if provided", async () => {
167
- expect.assertions(2);
168
-
169
- await testStorage(async (Storage) => {
143
+ it.each(storages)(
144
+ "returns all keys in the namespace if provided",
145
+ async (Storage) => {
170
146
  await expect(
171
147
  Storage.getAllItems(namespace)
172
148
  ).resolves.toMatchSnapshot();
173
- });
174
- });
149
+ }
150
+ );
175
151
  });
176
152
 
177
153
  describe("removeItem", () => {
178
- it("removes an item", async () => {
179
- expect.assertions(4);
180
-
181
- await testStorage(async (Storage) => {
182
- await expect(Storage.removeItem(key)).resolves.toMatchSnapshot();
154
+ it.each(storages)("removes an item", async (Storage) => {
155
+ await expect(Storage.removeItem(key)).resolves.toBeTruthy();
183
156
 
184
- await expect(
185
- Storage.removeItem(key, namespace)
186
- ).resolves.toMatchSnapshot();
187
- });
157
+ await expect(Storage.removeItem(key, namespace)).resolves.toBeTruthy();
188
158
  });
189
159
  });
190
160
  });
package/index.js CHANGED
@@ -1,13 +1,11 @@
1
1
  /// <reference types="@applicaster/applicaster-types" />
2
2
  import * as R from "ramda";
3
- import { useHistory, useLocation } from "react-router-dom";
4
3
 
5
4
  import { createQuickBrickApp } from "@applicaster/quick-brick-core";
6
5
  import * as QuickBrickManager from "@applicaster/zapp-react-native-bridge/QuickBrick";
7
6
  import * as Contexts from "@applicaster/zapp-react-native-ui-components/Contexts";
8
7
  import { OfflineHandler } from "@applicaster/zapp-react-native-ui-components/Components/OfflineHandler";
9
8
  import { getXray } from "@applicaster/zapp-react-native-utils/logger";
10
- import { ZappDomRouter } from "./App/Router";
11
9
  import { Layout } from "./App/Layout";
12
10
  import { SplashLoader } from "./App/Loader/SplashLoader";
13
11
  import { appLoader } from "./App/Loader";
@@ -24,11 +22,6 @@ const contextProviders = R.map(R.prop("withProvider"), R.values(Contexts));
24
22
  if (withXray) contextProviders.push(withXray);
25
23
 
26
24
  export const ZappApp = createQuickBrickApp({
27
- navigations: {
28
- Router: ZappDomRouter,
29
- useLocation,
30
- useHistory,
31
- },
32
25
  QuickBrickManager,
33
26
  Layout,
34
27
  OfflineHandler,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-dom-app",
3
- "version": "13.0.0-alpha.9946926334",
3
+ "version": "13.0.0-rc.100",
4
4
  "description": "Zapp App Component for Applicaster's Quick Brick React Native App",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -22,13 +22,12 @@
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-alpha.9946926334",
26
- "@applicaster/zapp-react-native-bridge": "13.0.0-alpha.9946926334",
27
- "@applicaster/zapp-react-native-redux": "13.0.0-alpha.9946926334",
28
- "@applicaster/zapp-react-native-ui-components": "13.0.0-alpha.9946926334",
29
- "@applicaster/zapp-react-native-utils": "13.0.0-alpha.9946926334",
25
+ "@applicaster/zapp-react-dom-ui-components": "13.0.0-rc.100",
26
+ "@applicaster/zapp-react-native-bridge": "13.0.0-rc.100",
27
+ "@applicaster/zapp-react-native-redux": "13.0.0-rc.100",
28
+ "@applicaster/zapp-react-native-ui-components": "13.0.0-rc.100",
29
+ "@applicaster/zapp-react-native-utils": "13.0.0-rc.100",
30
30
  "abortcontroller-polyfill": "^1.7.5",
31
- "history": "^4.7.2",
32
31
  "react-router-dom": "^5.1.2",
33
32
  "typeface-montserrat": "^0.0.54",
34
33
  "video.js": "7.14.3",
@@ -38,15 +37,14 @@
38
37
  "peerDependencies": {
39
38
  "@applicaster/zapp-pipes-v2-client": "*",
40
39
  "@react-native-community/netinfo": "*",
41
- "@types/node": "*",
42
40
  "core-js": "3.29.1",
43
41
  "immer": "*",
44
- "react": "17.0.2",
45
- "react-dom": "17.0.2",
42
+ "react": "*",
43
+ "react-dom": "*",
46
44
  "react-native": "*",
47
45
  "react-native-safe-area-context": "*",
48
46
  "react-native-svg": "*",
49
- "react-native-web": "0.18.11",
47
+ "react-native-web": "*",
50
48
  "uglify-js": "*",
51
49
  "validate-color": "*",
52
50
  "zustand": "*"
@@ -1,17 +0,0 @@
1
- import React from "react";
2
- import PropTypes from "prop-types";
3
-
4
- import { Router } from "react-router";
5
- import { createMemoryHistory } from "history";
6
-
7
- const history = createMemoryHistory();
8
-
9
- export const ZappDomRouter = ({ children, ...otherProps }) => (
10
- <Router history={history} {...otherProps}>
11
- {children}
12
- </Router>
13
- );
14
-
15
- ZappDomRouter.propTypes = {
16
- children: PropTypes.node.isRequired,
17
- };
@@ -1,30 +0,0 @@
1
- import React from "react";
2
-
3
- import "./spinner-styles.css";
4
-
5
- export const Spinner = (color) => {
6
- const spinnerColor = {
7
- background: color.color,
8
- };
9
-
10
- return (
11
- <div>
12
- <div id="progress">
13
- <div className="spinner">
14
- <div style={spinnerColor} className="bar1" />
15
- <div style={spinnerColor} className="bar2" />
16
- <div style={spinnerColor} className="bar3" />
17
- <div style={spinnerColor} className="bar4" />
18
- <div style={spinnerColor} className="bar5" />
19
- <div style={spinnerColor} className="bar6" />
20
- <div style={spinnerColor} className="bar7" />
21
- <div style={spinnerColor} className="bar8" />
22
- <div style={spinnerColor} className="bar9" />
23
- <div style={spinnerColor} className="bar10" />
24
- <div style={spinnerColor} className="bar11" />
25
- <div style={spinnerColor} className="bar12" />
26
- </div>
27
- </div>
28
- </div>
29
- );
30
- };
@@ -1,81 +0,0 @@
1
- div.spinner {
2
- position: absolute;
3
- width: 100px;
4
- height: 100px;
5
- display: inline-block;
6
- top: 50%;
7
- left: 50%;
8
- margin: -60px 0 0 -70px;
9
- }
10
-
11
- div.spinner div {
12
- width: 6%;
13
- height: 16%;
14
- position: absolute;
15
- left: 49%;
16
- top: 43%;
17
- opacity: 0;
18
- -webkit-border-radius: 50px;
19
- -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
20
- -webkit-animation: fade 1s linear infinite;
21
- }
22
-
23
- @-webkit-keyframes fade {
24
- from {
25
- opacity: 1;
26
- }
27
- to {
28
- opacity: 0.25;
29
- }
30
- }
31
-
32
- div.spinner div.bar1 {
33
- -webkit-transform: rotate(0deg) translate(0, -130%);
34
- -webkit-animation-delay: 0s;
35
- }
36
-
37
- div.spinner div.bar2 {
38
- -webkit-transform: rotate(30deg) translate(0, -130%);
39
- -webkit-animation-delay: -0.9167s;
40
- }
41
-
42
- div.spinner div.bar3 {
43
- -webkit-transform: rotate(60deg) translate(0, -130%);
44
- -webkit-animation-delay: -0.833s;
45
- }
46
- div.spinner div.bar4 {
47
- -webkit-transform: rotate(90deg) translate(0, -130%);
48
- -webkit-animation-delay: -0.7497s;
49
- }
50
- div.spinner div.bar5 {
51
- -webkit-transform: rotate(120deg) translate(0, -130%);
52
- -webkit-animation-delay: -0.667s;
53
- }
54
- div.spinner div.bar6 {
55
- -webkit-transform: rotate(150deg) translate(0, -130%);
56
- -webkit-animation-delay: -0.5837s;
57
- }
58
- div.spinner div.bar7 {
59
- -webkit-transform: rotate(180deg) translate(0, -130%);
60
- -webkit-animation-delay: -0.5s;
61
- }
62
- div.spinner div.bar8 {
63
- -webkit-transform: rotate(210deg) translate(0, -130%);
64
- -webkit-animation-delay: -0.4167s;
65
- }
66
- div.spinner div.bar9 {
67
- -webkit-transform: rotate(240deg) translate(0, -130%);
68
- -webkit-animation-delay: -0.333s;
69
- }
70
- div.spinner div.bar10 {
71
- -webkit-transform: rotate(270deg) translate(0, -130%);
72
- -webkit-animation-delay: -0.2497s;
73
- }
74
- div.spinner div.bar11 {
75
- -webkit-transform: rotate(300deg) translate(0, -130%);
76
- -webkit-animation-delay: -0.167s;
77
- }
78
- div.spinner div.bar12 {
79
- -webkit-transform: rotate(330deg) translate(0, -130%);
80
- -webkit-animation-delay: -0.0833s;
81
- }