@applicaster/zapp-react-native-utils 13.0.0-alpha.1552112220 → 13.0.0-alpha.1692038547
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/actionsExecutor/ActionExecutor.ts +16 -9
- package/actionsExecutor/ActionExecutorContext.tsx +74 -9
- package/alertUtils/alert.ts +148 -0
- package/alertUtils/index.ts +1 -148
- package/analyticsUtils/__tests__/__snapshots__/analyticsManagerNoModule.test.js.snap +9 -9
- package/analyticsUtils/helpers/hooks.ts +1 -1
- package/appUtils/HooksManager/Hook.ts +2 -2
- package/appUtils/HooksManager/__tests__/__snapshots__/hook.test.js.snap +7 -7
- package/appUtils/HooksManager/__tests__/__snapshots__/hooksManager.test.js.snap +186 -186
- package/appUtils/HooksManager/types.ts +5 -2
- package/appUtils/accessibilityManager/index.ts +42 -1
- package/appUtils/contextKeysManager/contextResolver.ts +77 -0
- package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +7 -6
- package/appUtils/focusManager/index.ts +100 -65
- package/appUtils/focusManager/treeDataStructure/Tree/index.js +23 -0
- package/appUtils/focusManager/utils/enums.ts +4 -0
- package/appUtils/focusManagerAux/utils/index.ts +4 -3
- package/appUtils/keyCodes/__tests__/__snapshots__/keyCodes.test.js.snap +2 -2
- package/appUtils/keyCodes/__tests__/keyCodes.test.js +1 -1
- package/appUtils/orientationHelper.ts +1 -1
- package/appUtils/platform/const.ts +14 -0
- package/appUtils/platform/platformUtils.ts +41 -4
- package/appUtils/playerManager/player.ts +2 -2
- package/appUtils/playerManager/playerNative.ts +1 -1
- package/arrayUtils/__tests__/__snapshots__/arrayUtils.test.ts.snap +4 -4
- package/focusManager/FocusManager.ts +27 -3
- package/functionUtils/__tests__/__snapshots__/functionUtils.test.js.snap +4 -4
- package/idleUtils/__tests__/withTimeout$.test.ts +37 -0
- package/idleUtils/index.ts +1 -1
- package/idleUtils/withTimeout.ts +15 -2
- package/logger/const.ts +9 -67
- package/manifestUtils/__tests__/createConfig.test.js +16 -16
- package/navigationUtils/__tests__/__snapshots__/navigationUtils.test.js.snap +6 -6
- package/navigationUtils/__tests__/itemTypes.test.js +2 -2
- package/navigationUtils/__tests__/navigationUtils.test.js +2 -2
- package/navigationUtils/index.ts +3 -3
- package/package.json +3 -2
- package/reactHooks/autoscrolling/__tests__/useTrackCurrentAutoScrollingElement.test.ts +1 -1
- package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +1 -1
- package/reactHooks/cell-click/__tests__/index.test.js +10 -2
- package/reactHooks/cell-click/index.ts +7 -1
- package/reactHooks/feed/__tests__/useBuildPipesUrl.test.tsx +4 -4
- package/reactHooks/feed/__tests__/useFeedLoader.test.tsx +10 -11
- package/reactHooks/feed/useFeedLoader.tsx +1 -1
- package/reactHooks/feed/usePipesCacheReset.ts +5 -5
- package/reactHooks/flatList/__tests__/index.test.tsx +30 -21
- package/reactHooks/layout/__tests__/index.test.tsx +10 -10
- package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.native.test.js +14 -28
- package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.test.js +1 -1
- package/reactHooks/layout/useDimensions/useDimensions.ts +8 -0
- package/reactHooks/navigation/__tests__/index.test.tsx +0 -4
- package/reactHooks/navigation/index.ts +22 -214
- package/reactHooks/navigation/useGetBottomTabBarHeight.ts +12 -0
- package/reactHooks/navigation/useGetNavBarTopBorderWidth.ts +14 -0
- package/reactHooks/navigation/useGetTabBarHeight.ts +10 -0
- package/reactHooks/navigation/useIsScreenActive.ts +17 -0
- package/reactHooks/navigation/useNavigationPluginData.ts +15 -0
- package/reactHooks/navigation/useNavigationType.ts +15 -0
- package/reactHooks/navigation/usePathname.ts +4 -0
- package/reactHooks/navigation/useRoute.ts +100 -0
- package/reactHooks/navigation/useUniqueRouteSuffix.ts +41 -0
- package/reactHooks/player/TVSeekControlller/TVSeekController.ts +4 -4
- package/reactHooks/player/__tests__/useAutoSeek._test.tsx +115 -0
- package/reactHooks/player/__tests__/useTapSeek._test.ts +94 -0
- package/reactHooks/state/useRefWithInitialValue.ts +14 -0
- package/reactHooks/state/useStateFromSubscribe.ts +23 -0
- package/reactHooks/usePluginConfiguration.ts +1 -1
- package/reactHooks/useSubscriberFor.ts +4 -3
- package/reactUtils/__tests__/reactUtils.test.js +10 -28
- package/reactUtils/createContext/__tests__/__snapshots__/helpers.test.js.snap +19 -19
- package/reactUtils/createContext/__tests__/__snapshots__/index.test.js.snap +2 -2
- package/reactUtils/createContext/__tests__/__snapshots__/provider.test.js.snap +3 -3
- package/reactUtils/createContext/__tests__/helpers.test.js +8 -8
- package/screenState/index.ts +24 -10
- package/theme/__mocks__/index.ts +4 -0
- package/theme/index.ts +1 -1
- package/time/Timer.ts +5 -2
- package/types.ts +1 -0
- package/zappFrameworkUtils/presentPluginOneTime.ts +2 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
3
|
exports[`shiftArray shifts the n first items from the head to the tail of the array with a positive offset 1`] = `
|
|
4
|
-
|
|
4
|
+
[
|
|
5
5
|
"bar",
|
|
6
6
|
"baz",
|
|
7
7
|
42,
|
|
@@ -10,7 +10,7 @@ Array [
|
|
|
10
10
|
`;
|
|
11
11
|
|
|
12
12
|
exports[`shiftArray shifts the n first items from the head to the tail of the array with a positive offset 2`] = `
|
|
13
|
-
|
|
13
|
+
[
|
|
14
14
|
"baz",
|
|
15
15
|
42,
|
|
16
16
|
"foo",
|
|
@@ -19,7 +19,7 @@ Array [
|
|
|
19
19
|
`;
|
|
20
20
|
|
|
21
21
|
exports[`shiftArray shifts the n last items from the tail to the head of the array with a negative offset 1`] = `
|
|
22
|
-
|
|
22
|
+
[
|
|
23
23
|
42,
|
|
24
24
|
"foo",
|
|
25
25
|
"bar",
|
|
@@ -28,7 +28,7 @@ Array [
|
|
|
28
28
|
`;
|
|
29
29
|
|
|
30
30
|
exports[`shiftArray shifts the n last items from the tail to the head of the array with a negative offset 2`] = `
|
|
31
|
-
|
|
31
|
+
[
|
|
32
32
|
"baz",
|
|
33
33
|
42,
|
|
34
34
|
"foo",
|
|
@@ -227,7 +227,14 @@ class FocusManager {
|
|
|
227
227
|
|
|
228
228
|
const nextNextFocus = FocusManager.getNextFocusable(direction, nextFocus);
|
|
229
229
|
|
|
230
|
-
|
|
230
|
+
if (!nextNextFocus) {
|
|
231
|
+
const nextNextFocusForParent =
|
|
232
|
+
FocusManager.instance.getNextFocusableForParent(direction, nextFocus);
|
|
233
|
+
|
|
234
|
+
FocusManager.instance.setFocus(nextNextFocusForParent, options);
|
|
235
|
+
} else {
|
|
236
|
+
FocusManager.instance.setFocus(nextNextFocus, options);
|
|
237
|
+
}
|
|
231
238
|
} else {
|
|
232
239
|
FocusManager.instance.setFocusLocal(nextFocus);
|
|
233
240
|
|
|
@@ -307,9 +314,26 @@ class FocusManager {
|
|
|
307
314
|
return FocusManager.getNextFocusable(direction);
|
|
308
315
|
}
|
|
309
316
|
|
|
310
|
-
getNextFocusableForParent(
|
|
317
|
+
getNextFocusableForParent(
|
|
318
|
+
direction,
|
|
319
|
+
focusable?: FocusManager.TouchableReactRef
|
|
320
|
+
) {
|
|
321
|
+
const focusableId = focusable
|
|
322
|
+
? getFocusableId(focusable)
|
|
323
|
+
: FocusManager.instance.focusedId;
|
|
324
|
+
|
|
311
325
|
const focusDirection = toFocusDirection(direction);
|
|
312
|
-
const parentNode = this.tree.findParent(
|
|
326
|
+
const parentNode = this.tree.findParent(focusableId);
|
|
327
|
+
|
|
328
|
+
const parentNodeParent = this.tree.findParent(parentNode?.id);
|
|
329
|
+
|
|
330
|
+
const hasNextFocusable = this.tree.find(
|
|
331
|
+
parentNode?.component?.current?.props[focusDirection]
|
|
332
|
+
);
|
|
333
|
+
|
|
334
|
+
if (!hasNextFocusable) {
|
|
335
|
+
return parentNodeParent?.component?.current?.props[focusDirection];
|
|
336
|
+
}
|
|
313
337
|
|
|
314
338
|
return parentNode?.component?.current?.props[focusDirection];
|
|
315
339
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
3
|
exports[`functionUtils subscriber can be invoked without args 1`] = `
|
|
4
|
-
|
|
5
|
-
"handlers":
|
|
4
|
+
{
|
|
5
|
+
"handlers": {},
|
|
6
6
|
"invokeHandler": [Function],
|
|
7
7
|
"on": [Function],
|
|
8
8
|
"removeHandler": [Function],
|
|
@@ -10,9 +10,9 @@ Object {
|
|
|
10
10
|
`;
|
|
11
11
|
|
|
12
12
|
exports[`functionUtils subscriber returns the original object with additional methods 1`] = `
|
|
13
|
-
|
|
13
|
+
{
|
|
14
14
|
"foo": "bar",
|
|
15
|
-
"handlers":
|
|
15
|
+
"handlers": {},
|
|
16
16
|
"invokeHandler": [Function],
|
|
17
17
|
"method": [Function],
|
|
18
18
|
"on": [Function],
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { TestScheduler } from "rxjs/testing";
|
|
2
|
+
|
|
3
|
+
import { withTimeout$ } from "..";
|
|
4
|
+
|
|
5
|
+
describe("withTimeout$", () => {
|
|
6
|
+
let testScheduler: TestScheduler;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
testScheduler = new TestScheduler((actual, expected) => {
|
|
10
|
+
expect(actual).toEqual(expected);
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it("should emit undefined after the specified timeout", () => {
|
|
15
|
+
testScheduler.run(({ expectObservable }) => {
|
|
16
|
+
const timeout = 1000;
|
|
17
|
+
const expectedMarble = "1s (a|)";
|
|
18
|
+
const expectedValues = { a: undefined };
|
|
19
|
+
|
|
20
|
+
const result$ = withTimeout$(timeout);
|
|
21
|
+
|
|
22
|
+
expectObservable(result$).toBe(expectedMarble, expectedValues);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("should complete after emitting undefined", () => {
|
|
27
|
+
testScheduler.run(({ expectObservable }) => {
|
|
28
|
+
const timeout = 500;
|
|
29
|
+
const expectedMarble = "500ms (a|)";
|
|
30
|
+
const expectedValues = { a: undefined };
|
|
31
|
+
|
|
32
|
+
const result$ = withTimeout$(timeout);
|
|
33
|
+
|
|
34
|
+
expectObservable(result$).toBe(expectedMarble, expectedValues);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
});
|
package/idleUtils/index.ts
CHANGED
package/idleUtils/withTimeout.ts
CHANGED
|
@@ -1,7 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { of, Observable } from "rxjs";
|
|
2
|
+
import { delay } from "rxjs/operators";
|
|
3
|
+
|
|
4
|
+
export const withTimeout = (timeout: number): Promise<void> => {
|
|
5
|
+
return new Promise<void>((resolve) => {
|
|
3
6
|
setTimeout(() => {
|
|
4
7
|
resolve(undefined);
|
|
5
8
|
}, timeout);
|
|
6
9
|
});
|
|
7
10
|
};
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Creates an observable that emits a single value after a specified timeout.
|
|
14
|
+
*
|
|
15
|
+
* @param timeout - The delay duration in milliseconds before emitting the value.
|
|
16
|
+
* @returns An observable that emits `undefined` after the specified timeout.
|
|
17
|
+
*/
|
|
18
|
+
export const withTimeout$ = (timeout: number): Observable<void> => {
|
|
19
|
+
return of(undefined).pipe(delay(timeout));
|
|
20
|
+
};
|
package/logger/const.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/* eslint-disable unused-imports/no-unused-vars */
|
|
2
|
-
import * as R from "ramda";
|
|
3
|
-
|
|
4
1
|
enum XRayLogLevel {
|
|
5
2
|
verbose = 0,
|
|
6
3
|
debug = 1,
|
|
@@ -11,51 +8,9 @@ enum XRayLogLevel {
|
|
|
11
8
|
off = 100,
|
|
12
9
|
}
|
|
13
10
|
|
|
14
|
-
|
|
15
|
-
off = "off",
|
|
16
|
-
verbose = "verbose",
|
|
17
|
-
debug = "debug",
|
|
18
|
-
info = "info",
|
|
19
|
-
warning = "warning",
|
|
20
|
-
error = "error",
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const toastLevelToLogLevel = (toastLogLevel: ToastLogLevel): XRayLogLevel => {
|
|
24
|
-
if (R.isNil(toastLogLevel)) {
|
|
25
|
-
return XRayLogLevel.off;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
switch (toastLogLevel) {
|
|
29
|
-
case ToastLogLevel.verbose:
|
|
30
|
-
return XRayLogLevel.verbose;
|
|
31
|
-
case ToastLogLevel.debug:
|
|
32
|
-
return XRayLogLevel.debug;
|
|
33
|
-
case ToastLogLevel.info:
|
|
34
|
-
return XRayLogLevel.info;
|
|
35
|
-
case ToastLogLevel.error:
|
|
36
|
-
return XRayLogLevel.error;
|
|
37
|
-
default:
|
|
38
|
-
return XRayLogLevel.off;
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const PLUGIN_IDENTIFIER = "xray_logging_plugin";
|
|
43
|
-
|
|
44
|
-
const wrapInObject = (obj, name) => {};
|
|
45
|
-
|
|
46
|
-
const applyConditions = (wrappedObj) => {};
|
|
47
|
-
|
|
48
|
-
const sanitizeEventPayload = () => {};
|
|
11
|
+
const wrapInObject = (_ctx: unknown, _key: string) => {};
|
|
49
12
|
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
const isWeb = () => {};
|
|
53
|
-
|
|
54
|
-
const isDOMApp = () => {};
|
|
55
|
-
|
|
56
|
-
const isBrowser = () => {};
|
|
57
|
-
|
|
58
|
-
const eventAllowed = () => {};
|
|
13
|
+
const applyConditions = (_fn: unknown) => {};
|
|
59
14
|
|
|
60
15
|
/**
|
|
61
16
|
* This is the mocked version of XRayLogger
|
|
@@ -90,34 +45,21 @@ export default class XRayLogger {
|
|
|
90
45
|
);
|
|
91
46
|
};
|
|
92
47
|
|
|
93
|
-
log = (
|
|
94
|
-
const logEvent = typeof event === "string" ? { message: event } : event;
|
|
95
|
-
};
|
|
48
|
+
log = (_event) => {};
|
|
96
49
|
|
|
97
|
-
debug = (
|
|
98
|
-
const logEvent = typeof event === "string" ? { message: event } : event;
|
|
99
|
-
};
|
|
50
|
+
debug = (_event) => {};
|
|
100
51
|
|
|
101
|
-
info = (
|
|
102
|
-
const logEvent = typeof event === "string" ? { message: event } : event;
|
|
103
|
-
};
|
|
52
|
+
info = (_event) => {};
|
|
104
53
|
|
|
105
|
-
warning = (
|
|
106
|
-
const logEvent = typeof event === "string" ? { message: event } : event;
|
|
107
|
-
};
|
|
54
|
+
warning = (_event) => {};
|
|
108
55
|
|
|
109
|
-
warn = (
|
|
56
|
+
warn = (_event) => {
|
|
110
57
|
this.warning(event);
|
|
111
58
|
};
|
|
112
59
|
|
|
113
|
-
error = (
|
|
114
|
-
const logEvent: XRayEventData =
|
|
115
|
-
event instanceof Error
|
|
116
|
-
? { exception: event as Error, message: event.message }
|
|
117
|
-
: (event as XRayEventData);
|
|
118
|
-
};
|
|
60
|
+
error = (_event) => {};
|
|
119
61
|
|
|
120
|
-
sendEvent = (
|
|
62
|
+
sendEvent = (_event, _eventData) => {};
|
|
121
63
|
|
|
122
64
|
// To be used by QuickBrick Hook events
|
|
123
65
|
sendAudienceEvent = (event, eventData = null) => {
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const styles = {
|
|
1
|
+
const mockStyles = {
|
|
4
2
|
fields: [{ key: "field_1", initial_value: 1 }],
|
|
5
3
|
label: "styles",
|
|
6
4
|
};
|
|
7
5
|
|
|
8
|
-
const
|
|
6
|
+
const mockStylesWithGroup = {
|
|
9
7
|
fields: [
|
|
10
8
|
{
|
|
11
9
|
group: true,
|
|
@@ -15,26 +13,28 @@ const stylesWithGroup = {
|
|
|
15
13
|
],
|
|
16
14
|
};
|
|
17
15
|
|
|
18
|
-
const
|
|
19
|
-
styles: jest.fn(() => ({ styles })),
|
|
16
|
+
const mockGenerators = {
|
|
17
|
+
styles: jest.fn(() => ({ styles: mockStyles })),
|
|
20
18
|
stylesGroup: jest.fn(() => ({
|
|
21
|
-
styles:
|
|
19
|
+
styles: mockStylesWithGroup,
|
|
22
20
|
})),
|
|
23
|
-
customConfiguration: jest.fn(() => ({ custom_configuration: [
|
|
21
|
+
customConfiguration: jest.fn(() => ({ custom_configuration: [mockStyles] })),
|
|
24
22
|
customConfigurationGroup: jest.fn(() => ({
|
|
25
|
-
custom_configuration: [
|
|
23
|
+
custom_configuration: [mockStylesWithGroup],
|
|
26
24
|
})),
|
|
27
25
|
};
|
|
28
26
|
|
|
29
|
-
jest.
|
|
27
|
+
jest.doMock("../defaultManifestConfigurations", () => ({
|
|
30
28
|
defaultConfigurations: {
|
|
31
|
-
styles:
|
|
32
|
-
stylesGroup:
|
|
33
|
-
customConfiguration:
|
|
34
|
-
customConfigurationGroup:
|
|
29
|
+
styles: mockGenerators.styles,
|
|
30
|
+
stylesGroup: mockGenerators.stylesGroup,
|
|
31
|
+
customConfiguration: mockGenerators.customConfiguration,
|
|
32
|
+
customConfigurationGroup: mockGenerators.customConfigurationGroup,
|
|
35
33
|
},
|
|
36
34
|
}));
|
|
37
35
|
|
|
36
|
+
const { createConfig } = require("../createConfig");
|
|
37
|
+
|
|
38
38
|
describe("createConfig", () => {
|
|
39
39
|
it("should return a function", () => {
|
|
40
40
|
const currentResult = createConfig(jest.fn());
|
|
@@ -78,7 +78,7 @@ describe("createConfig", () => {
|
|
|
78
78
|
extend: "styles",
|
|
79
79
|
})(props);
|
|
80
80
|
|
|
81
|
-
expect(
|
|
81
|
+
expect(mockGenerators.styles).toBeCalledWith(props);
|
|
82
82
|
});
|
|
83
83
|
|
|
84
84
|
it("should return base configuration if manifest is not provided", () => {
|
|
@@ -88,7 +88,7 @@ describe("createConfig", () => {
|
|
|
88
88
|
extend: "styles",
|
|
89
89
|
})({});
|
|
90
90
|
|
|
91
|
-
expect(currentResult).toEqual({ styles });
|
|
91
|
+
expect(currentResult).toEqual({ styles: mockStyles });
|
|
92
92
|
});
|
|
93
93
|
|
|
94
94
|
describe("Data merging", () => {
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
3
|
exports[`getNavigationProps returns the props otherwise 1`] = `
|
|
4
|
-
|
|
5
|
-
"assets":
|
|
4
|
+
{
|
|
5
|
+
"assets": {
|
|
6
6
|
"appLogo": "appLogo.png",
|
|
7
7
|
},
|
|
8
8
|
"home": false,
|
|
9
|
-
"nav_items":
|
|
10
|
-
|
|
9
|
+
"nav_items": [
|
|
10
|
+
{
|
|
11
11
|
"type": "label",
|
|
12
12
|
},
|
|
13
13
|
],
|
|
14
|
-
"rules":
|
|
14
|
+
"rules": {},
|
|
15
15
|
"selected": "A1234",
|
|
16
|
-
"styles":
|
|
16
|
+
"styles": {
|
|
17
17
|
"style": "foo",
|
|
18
18
|
},
|
|
19
19
|
"title": "testTitle",
|
|
@@ -61,8 +61,8 @@ describe("getTypeMatcher", () => {
|
|
|
61
61
|
|
|
62
62
|
describe("isItemOfType", () => {
|
|
63
63
|
it("is a curried function", () => {
|
|
64
|
-
expect(itemIsOfType(river, SCREEN_TYPES.RIVER)).
|
|
65
|
-
expect(itemIsOfType(river)).
|
|
64
|
+
expect(itemIsOfType(river, SCREEN_TYPES.RIVER)).toBeTruthy();
|
|
65
|
+
expect(itemIsOfType(river)).toBeInstanceOf(Function);
|
|
66
66
|
});
|
|
67
67
|
|
|
68
68
|
it("returns true if the item is of the given type", () => {
|
|
@@ -243,7 +243,7 @@ describe("getTargetRoute", () => {
|
|
|
243
243
|
it("returns a valid path when initial pathname is /", () => {
|
|
244
244
|
const targetRoute = getTargetRoute(river, "/", { layoutVersion });
|
|
245
245
|
expect(targetRoute).toEqual(`/river/${river.id}`);
|
|
246
|
-
expect(targetRoute).not.
|
|
246
|
+
expect(targetRoute).not.toContainEntry("//");
|
|
247
247
|
});
|
|
248
248
|
});
|
|
249
249
|
|
|
@@ -273,7 +273,7 @@ describe("getTargetRoute", () => {
|
|
|
273
273
|
it("returns a valid path when initial pathname is /", () => {
|
|
274
274
|
const targetRoute = getTargetRoute(river, "/", { layoutVersion });
|
|
275
275
|
expect(targetRoute).toEqual(`/river/${river.id}`);
|
|
276
|
-
expect(targetRoute).not.
|
|
276
|
+
expect(targetRoute).not.toContainEntry("//");
|
|
277
277
|
});
|
|
278
278
|
});
|
|
279
279
|
});
|
package/navigationUtils/index.ts
CHANGED
|
@@ -644,8 +644,8 @@ export const getScreenId = (
|
|
|
644
644
|
fallbackRiver: ZappRiver
|
|
645
645
|
) => {
|
|
646
646
|
return screenData?.targetScreen
|
|
647
|
-
? screenData?.targetScreen?.id ?? fallbackRiver.id
|
|
647
|
+
? (screenData?.targetScreen?.id ?? fallbackRiver.id)
|
|
648
648
|
: "screen_id" in screenData
|
|
649
|
-
|
|
650
|
-
|
|
649
|
+
? screenData.screen_id
|
|
650
|
+
: fallbackRiver.id;
|
|
651
651
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applicaster/zapp-react-native-utils",
|
|
3
|
-
"version": "13.0.0-alpha.
|
|
3
|
+
"version": "13.0.0-alpha.1692038547",
|
|
4
4
|
"description": "Applicaster Zapp React Native utilities package",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"homepage": "https://github.com/applicaster/quickbrick#readme",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@applicaster/applicaster-types": "13.0.0-alpha.
|
|
31
|
+
"@applicaster/applicaster-types": "13.0.0-alpha.1692038547",
|
|
32
32
|
"buffer": "^5.2.1",
|
|
33
33
|
"camelize": "^1.0.0",
|
|
34
34
|
"create-react-context": "^0.2.3",
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"immer": "*",
|
|
45
45
|
"react": "17.0.2",
|
|
46
46
|
"react-native": "0.68.6",
|
|
47
|
+
"uglify-js": "*",
|
|
47
48
|
"validate-color": "*",
|
|
48
49
|
"zustand": "*"
|
|
49
50
|
},
|
|
@@ -5,14 +5,14 @@ import { ActionExecutorContext } from "@applicaster/zapp-react-native-utils/acti
|
|
|
5
5
|
|
|
6
6
|
import { waitFor } from "@testing-library/react-native";
|
|
7
7
|
|
|
8
|
-
const
|
|
8
|
+
const mockNavigator = {
|
|
9
9
|
getPathname: () => "pathnameMock",
|
|
10
10
|
push: jest.fn(),
|
|
11
11
|
data: {},
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
|
|
15
|
-
useNavigation: () =>
|
|
15
|
+
useNavigation: () => mockNavigator,
|
|
16
16
|
useRoute: () => ({ pathname: "pathnameMock" }),
|
|
17
17
|
useProfilerLogging: () => {
|
|
18
18
|
return jest.fn();
|
|
@@ -25,7 +25,15 @@ jest.mock("@applicaster/zapp-react-native-utils/analyticsUtils/", () => ({
|
|
|
25
25
|
}),
|
|
26
26
|
}));
|
|
27
27
|
|
|
28
|
+
jest.mock("@applicaster/zapp-react-native-utils/reactHooks/screen", () => ({
|
|
29
|
+
useTargetScreenData: jest.fn(() => ({})),
|
|
30
|
+
useCurrentScreenData: jest.fn(() => ({})),
|
|
31
|
+
}));
|
|
32
|
+
|
|
28
33
|
jest.mock("@applicaster/zapp-react-native-ui-components/Contexts", () => ({
|
|
34
|
+
...jest.requireActual(
|
|
35
|
+
"@applicaster/zapp-react-native-ui-components/Contexts"
|
|
36
|
+
),
|
|
29
37
|
ZappPipesEntryContext: {
|
|
30
38
|
useZappPipesContext: jest.fn(() => [undefined, jest.fn()]),
|
|
31
39
|
},
|
|
@@ -16,6 +16,7 @@ import { ActionExecutorContext } from "@applicaster/zapp-react-native-utils/acti
|
|
|
16
16
|
import { isFunction, noop } from "../../functionUtils";
|
|
17
17
|
import { useSendAnalyticsOnPress } from "../analytics";
|
|
18
18
|
import { logOnPress, warnEmptyContentType } from "./helpers";
|
|
19
|
+
import { useCurrentScreenData } from "../screen";
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* If onCellTap is defined execute the function and
|
|
@@ -44,6 +45,7 @@ export const useCellClick = ({
|
|
|
44
45
|
|
|
45
46
|
const onCellTap: Option<Function> = React.useContext(CellTapContext);
|
|
46
47
|
const actionExecutor = React.useContext(ActionExecutorContext);
|
|
48
|
+
const screenData = useCurrentScreenData();
|
|
47
49
|
|
|
48
50
|
const cellSelectable = toBooleanWithDefaultTrue(
|
|
49
51
|
component?.rules?.component_cells_selectable
|
|
@@ -78,7 +80,10 @@ export const useCellClick = ({
|
|
|
78
80
|
logOnPress(selectedItem, pathname, component, onCellTap);
|
|
79
81
|
|
|
80
82
|
if (selectedItem) {
|
|
81
|
-
await actionExecutor?.handleEntryActions(selectedItem
|
|
83
|
+
await actionExecutor?.handleEntryActions(selectedItem, {
|
|
84
|
+
component,
|
|
85
|
+
screenData,
|
|
86
|
+
});
|
|
82
87
|
}
|
|
83
88
|
|
|
84
89
|
if (selectedItem?.type?.value === "action") {
|
|
@@ -111,6 +116,7 @@ export const useCellClick = ({
|
|
|
111
116
|
pathname,
|
|
112
117
|
push,
|
|
113
118
|
sendAnalyticsOnPress,
|
|
119
|
+
screenData,
|
|
114
120
|
]
|
|
115
121
|
);
|
|
116
122
|
|
|
@@ -7,12 +7,12 @@ const appData = {
|
|
|
7
7
|
sdk_version: "2.0.0",
|
|
8
8
|
};
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
const mockUseInflatedUrl = jest.fn();
|
|
11
11
|
|
|
12
12
|
jest.mock(
|
|
13
13
|
"@applicaster/zapp-react-native-utils/reactHooks/feed/useInflatedUrl",
|
|
14
14
|
() => ({
|
|
15
|
-
useInflatedUrl:
|
|
15
|
+
useInflatedUrl: mockUseInflatedUrl,
|
|
16
16
|
})
|
|
17
17
|
);
|
|
18
18
|
|
|
@@ -20,7 +20,7 @@ const { useBuildPipesUrl } = require("../useBuildPipesUrl");
|
|
|
20
20
|
|
|
21
21
|
describe("useBuildPipesUrl", () => {
|
|
22
22
|
it("returns the proper url", async () => {
|
|
23
|
-
|
|
23
|
+
mockUseInflatedUrl.mockReturnValue("http://foo.com/show/show-1");
|
|
24
24
|
const url = "http://foo.com/show/{{showId}}";
|
|
25
25
|
|
|
26
26
|
const mapping = {
|
|
@@ -65,7 +65,7 @@ describe("useBuildPipesUrl", () => {
|
|
|
65
65
|
});
|
|
66
66
|
|
|
67
67
|
it("returns empty object if url is not in endpoints", async () => {
|
|
68
|
-
|
|
68
|
+
mockUseInflatedUrl.mockReturnValue("http://foobar.com/show-1");
|
|
69
69
|
const url = "http://foobar.com/{{showId}}";
|
|
70
70
|
|
|
71
71
|
const mapping = {
|
|
@@ -6,42 +6,41 @@ import { Provider } from "react-redux";
|
|
|
6
6
|
import * as React from "react";
|
|
7
7
|
import configureStore from "redux-mock-store";
|
|
8
8
|
import thunk from "redux-thunk";
|
|
9
|
-
import * as
|
|
9
|
+
import * as useRouteHook from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useRoute";
|
|
10
10
|
import * as useNavigationHooks from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation";
|
|
11
|
+
import { useFeedLoader } from "../useFeedLoader";
|
|
11
12
|
|
|
12
13
|
const mockStore = configureStore([thunk]);
|
|
13
14
|
|
|
14
|
-
jest.useFakeTimers();
|
|
15
|
+
jest.useFakeTimers({ legacyFakeTimers: true });
|
|
15
16
|
|
|
16
|
-
const
|
|
17
|
+
const mockLogger = {
|
|
17
18
|
warning: jest.fn(),
|
|
18
19
|
log: jest.fn(),
|
|
19
20
|
info: jest.fn(),
|
|
20
21
|
};
|
|
21
22
|
|
|
22
|
-
const
|
|
23
|
+
const mockNavigator: any = {
|
|
23
24
|
currentRoute: "/river/A1234",
|
|
24
25
|
getStack: jest.fn(() => []),
|
|
25
26
|
};
|
|
26
27
|
|
|
27
|
-
const
|
|
28
|
+
const mockRouteData: any = {
|
|
28
29
|
screenData: {},
|
|
29
30
|
pathname: "/river/A1234",
|
|
30
31
|
};
|
|
31
32
|
|
|
32
|
-
jest.
|
|
33
|
+
jest.doMock("../../logger", () => ({
|
|
33
34
|
reactHooksLogger: {
|
|
34
|
-
addSubsystem: jest.fn(() =>
|
|
35
|
+
addSubsystem: jest.fn(() => mockLogger),
|
|
35
36
|
},
|
|
36
37
|
}));
|
|
37
38
|
|
|
38
39
|
jest
|
|
39
40
|
.spyOn(useNavigationHooks, "useNavigation")
|
|
40
|
-
.mockImplementation(() =>
|
|
41
|
+
.mockImplementation(() => mockNavigator);
|
|
41
42
|
|
|
42
|
-
jest.spyOn(
|
|
43
|
-
|
|
44
|
-
const { useFeedLoader } = require("../useFeedLoader");
|
|
43
|
+
jest.spyOn(useRouteHook, "useRoute").mockImplementation(() => mockRouteData);
|
|
45
44
|
|
|
46
45
|
const mockZappPipesData = {
|
|
47
46
|
data: {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { useDispatch } from "react-redux";
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
usePipesContexts,
|
|
7
|
-
} from "@applicaster/zapp-react-native-ui-components/Decorators/RiverFeedLoader/utils";
|
|
3
|
+
|
|
4
|
+
import { getDatasourceUrl } from "@applicaster/zapp-react-native-ui-components/Decorators/RiverFeedLoader/utils/getDatasourceUrl";
|
|
5
|
+
import { usePipesContexts } from "@applicaster/zapp-react-native-ui-components/Decorators/RiverFeedLoader/utils/usePipesContexts";
|
|
8
6
|
import { clearPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
|
|
9
7
|
|
|
8
|
+
import { useRoute } from "../navigation/useRoute";
|
|
9
|
+
|
|
10
10
|
/**
|
|
11
11
|
* reset river components cache when screen is unmounted
|
|
12
12
|
* @param {string} riverId screen id
|