@applicaster/zapp-react-native-utils 14.0.0-alpha.2345544020 → 14.0.0-alpha.3038031102

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 (63) hide show
  1. package/actionsExecutor/ActionExecutorContext.tsx +1 -1
  2. package/analyticsUtils/AnalyticsEvents/helper.ts +81 -0
  3. package/analyticsUtils/AnalyticsEvents/sendOnClickEvent.ts +14 -4
  4. package/analyticsUtils/__tests__/analyticsUtils.test.js +14 -0
  5. package/analyticsUtils/events.ts +8 -0
  6. package/appUtils/accessibilityManager/index.ts +5 -2
  7. package/appUtils/playerManager/OverlayObserver/OverlaysObserver.ts +0 -15
  8. package/appUtils/playerManager/useChapterMarker.tsx +0 -1
  9. package/appUtils/playerManager/usePlayerControllerSetup.tsx +16 -0
  10. package/arrayUtils/__tests__/isEmptyArray.test.ts +63 -0
  11. package/arrayUtils/__tests__/isFilledArray.test.ts +1 -1
  12. package/arrayUtils/index.ts +7 -2
  13. package/audioPlayerUtils/__tests__/getArtworkImage.test.ts +144 -0
  14. package/audioPlayerUtils/__tests__/getBackgroundImage.test.ts +72 -0
  15. package/audioPlayerUtils/__tests__/getImageFromEntry.test.ts +110 -0
  16. package/audioPlayerUtils/assets/index.ts +2 -0
  17. package/audioPlayerUtils/index.ts +242 -0
  18. package/conf/player/__tests__/selectors.test.ts +34 -0
  19. package/conf/player/selectors.ts +10 -0
  20. package/configurationUtils/__tests__/configurationUtils.test.js +0 -31
  21. package/configurationUtils/__tests__/getMediaItems.test.ts +65 -0
  22. package/configurationUtils/__tests__/imageSrcFromMediaItem.test.ts +34 -0
  23. package/configurationUtils/index.ts +63 -34
  24. package/focusManager/FocusManager.ts +26 -16
  25. package/focusManager/Tree.ts +25 -21
  26. package/focusManager/__tests__/FocusManager.test.ts +50 -8
  27. package/manifestUtils/_internals/getDefaultConfiguration.js +28 -0
  28. package/manifestUtils/{_internals.js → _internals/index.js} +2 -25
  29. package/manifestUtils/createConfig.js +4 -1
  30. package/manifestUtils/defaultManifestConfigurations/player.js +1239 -200
  31. package/manifestUtils/progressBar/__tests__/mobileProgressBar.test.js +0 -30
  32. package/manifestUtils/sharedConfiguration/screenPicker/stylesFields.js +1 -2
  33. package/navigationUtils/__tests__/mapContentTypesToRivers.test.ts +130 -0
  34. package/navigationUtils/index.ts +6 -4
  35. package/package.json +2 -2
  36. package/playerUtils/__tests__/configurationUtils.test.ts +1 -65
  37. package/playerUtils/__tests__/getPlayerActionButtons.test.ts +54 -0
  38. package/playerUtils/_internals/__tests__/utils.test.ts +71 -0
  39. package/playerUtils/_internals/index.ts +1 -0
  40. package/playerUtils/_internals/utils.ts +31 -0
  41. package/playerUtils/configurationUtils.ts +0 -44
  42. package/playerUtils/getPlayerActionButtons.ts +17 -0
  43. package/playerUtils/index.ts +2 -0
  44. package/playerUtils/useValidatePlayerConfig.tsx +22 -19
  45. package/reactHooks/autoscrolling/__tests__/useTrackedView.test.tsx +3 -1
  46. package/reactHooks/feed/useBatchLoading.ts +11 -9
  47. package/reactHooks/feed/useFeedLoader.tsx +12 -8
  48. package/reactHooks/feed/usePipesCacheReset.ts +3 -3
  49. package/reactHooks/layout/__tests__/index.test.tsx +3 -1
  50. package/reactHooks/layout/isTablet/index.ts +5 -2
  51. package/reactHooks/layout/useDimensions/__tests__/useDimensions.test.ts +34 -36
  52. package/reactHooks/layout/useDimensions/useDimensions.ts +2 -3
  53. package/reactHooks/layout/useLayoutVersion.ts +5 -5
  54. package/reactHooks/navigation/useIsScreenActive.ts +9 -5
  55. package/reactHooks/resolvers/__tests__/useCellResolver.test.tsx +4 -0
  56. package/reactHooks/screen/useScreenContext.ts +1 -1
  57. package/reactHooks/state/__tests__/ZStoreProvider.test.tsx +2 -1
  58. package/reactHooks/state/useRivers.ts +7 -8
  59. package/riverComponetsMeasurementProvider/index.tsx +1 -1
  60. package/services/js2native.ts +1 -0
  61. package/time/BackgroundTimer.ts +5 -3
  62. package/utils/index.ts +17 -1
  63. package/playerUtils/configurationGenerator.ts +0 -2572
@@ -18,36 +18,6 @@ describe("mobileProgressBar", () => {
18
18
  ]),
19
19
  });
20
20
 
21
- // const timeRemainingLabelConditions = (condition) => ({
22
- // rules: "all_conditions",
23
- // conditional_fields: compact([
24
- // {
25
- // key: "assets/progress_bar_switch",
26
- // condition_value: true,
27
- // },
28
- // {
29
- // key: "assets/progress_bar_time_remaining_label_enable",
30
- // condition_value: true,
31
- // },
32
- // condition,
33
- // ]),
34
- // });
35
-
36
- // const watchedLabelConditions = (condition) => ({
37
- // rules: "all_conditions",
38
- // conditional_fields: compact([
39
- // {
40
- // key: "assets/progress_bar_switch",
41
- // condition_value: true,
42
- // },
43
- // {
44
- // key: "assets/progress_bar_watched_label_enable",
45
- // condition_value: true,
46
- // },
47
- // condition,
48
- // ]),
49
- // });
50
-
51
21
  it("generate progress-bar configuration - enabled and with bottom_of_cell", () => {
52
22
  const enable = true;
53
23
  const hideUnwatched = true;
@@ -8,7 +8,6 @@ const {
8
8
  conditional_horizontal_type,
9
9
  conditional_vertical_type,
10
10
  conditional_horizontal_type_item_fixed,
11
- conditional_horizontal_type_item_dynamic,
12
11
  conditional_horizontal_asset_on,
13
12
  conditional_horizontal_display_type_fixed,
14
13
  } = require("./utils");
@@ -48,7 +47,7 @@ const componentConfigurationFields = [
48
47
  { text: "Right", value: "right" },
49
48
  { text: "Center", value: "center" },
50
49
  ],
51
- ...conditional_horizontal_type_item_dynamic,
50
+ ...conditional_horizontal_type,
52
51
  },
53
52
  {
54
53
  type: "select",
@@ -0,0 +1,130 @@
1
+ import { mapContentTypesToRivers } from "../index";
2
+
3
+ describe("mapContentTypesToRivers", () => {
4
+ it("should return the correct content types mapped to rivers", () => {
5
+ const state = {
6
+ rivers: {
7
+ "river-1": {
8
+ plugin_type: "river",
9
+ },
10
+ },
11
+ contentTypes: {
12
+ "content-type-1": {
13
+ screen_id: "river-1",
14
+ },
15
+ },
16
+ };
17
+
18
+ const result = mapContentTypesToRivers(state);
19
+
20
+ expect(result).toEqual({
21
+ "content-type-1": {
22
+ screenType: "river",
23
+ screen_id: "river-1",
24
+ },
25
+ });
26
+ });
27
+
28
+ it("should return null if contentTypes is undefined", () => {
29
+ const state = {
30
+ rivers: {
31
+ "river-1": {
32
+ plugin_type: "river",
33
+ },
34
+ },
35
+ // contentTypes is missing
36
+ };
37
+
38
+ const result = mapContentTypesToRivers(state);
39
+
40
+ expect(result).toBeNull();
41
+ });
42
+
43
+ it("should skip content types whose screen does not exist in rivers", () => {
44
+ const state = {
45
+ rivers: {
46
+ "river-1": {
47
+ plugin_type: "river",
48
+ },
49
+ },
50
+ contentTypes: {
51
+ "content-type-1": {
52
+ screen_id: "river-1",
53
+ },
54
+ "content-type-2": {
55
+ screen_id: "river-2", // river-2 does not exist
56
+ },
57
+ },
58
+ };
59
+
60
+ const result = mapContentTypesToRivers(state);
61
+
62
+ expect(result).toEqual({
63
+ "content-type-1": {
64
+ screenType: "river",
65
+ screen_id: "river-1",
66
+ },
67
+ });
68
+
69
+ // result is not null, but may be undefined for missing keys
70
+ expect(result && result["content-type-2"]).toBeUndefined();
71
+ });
72
+
73
+ it("should use 'type' if 'plugin_type' is not present in river", () => {
74
+ const state = {
75
+ rivers: {
76
+ "river-1": {
77
+ type: "custom-type",
78
+ },
79
+ },
80
+ contentTypes: {
81
+ "content-type-1": {
82
+ screen_id: "river-1",
83
+ },
84
+ },
85
+ };
86
+
87
+ const result = mapContentTypesToRivers(state);
88
+
89
+ expect(result).toEqual({
90
+ "content-type-1": {
91
+ screenType: "custom-type",
92
+ screen_id: "river-1",
93
+ },
94
+ });
95
+ });
96
+
97
+ it("should skip content types if neither plugin_type nor type is present in river", () => {
98
+ const state = {
99
+ rivers: {
100
+ "river-1": {
101
+ // no plugin_type or type
102
+ },
103
+ },
104
+ contentTypes: {
105
+ "content-type-1": {
106
+ screen_id: "river-1",
107
+ },
108
+ },
109
+ };
110
+
111
+ const result = mapContentTypesToRivers(state);
112
+
113
+ expect(result).toEqual({});
114
+ });
115
+
116
+ it("should handle empty contentTypes object", () => {
117
+ const state = {
118
+ rivers: {
119
+ "river-1": {
120
+ plugin_type: "river",
121
+ },
122
+ },
123
+ contentTypes: {},
124
+ };
125
+
126
+ const result = mapContentTypesToRivers(state);
127
+
128
+ expect(result).toEqual({});
129
+ });
130
+ });
@@ -13,6 +13,7 @@ import {
13
13
  isPlayable,
14
14
  isV2River,
15
15
  } from "./itemTypeMatchers";
16
+ import { RootState } from "@applicaster/zapp-react-native-redux/store";
16
17
 
17
18
  type PathAttribute = {
18
19
  screenType: string;
@@ -377,10 +378,11 @@ export const usesVideoModal = (
377
378
  return targetScreenConfiguration?.styles?.use_video_modal;
378
379
  };
379
380
 
380
- export const mapContentTypesToRivers = ({
381
- rivers,
382
- contentTypes,
383
- }): ZappContentTypesMapped | null => {
381
+ export const mapContentTypesToRivers = (
382
+ state: Partial<RootState>
383
+ ): ZappContentTypesMapped | null => {
384
+ const { rivers, contentTypes } = state;
385
+
384
386
  if (!contentTypes) {
385
387
  return null;
386
388
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-utils",
3
- "version": "14.0.0-alpha.2345544020",
3
+ "version": "14.0.0-alpha.3038031102",
4
4
  "description": "Applicaster Zapp React Native utilities package",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -27,7 +27,7 @@
27
27
  },
28
28
  "homepage": "https://github.com/applicaster/quickbrick#readme",
29
29
  "dependencies": {
30
- "@applicaster/applicaster-types": "14.0.0-alpha.2345544020",
30
+ "@applicaster/applicaster-types": "14.0.0-alpha.3038031102",
31
31
  "buffer": "^5.2.1",
32
32
  "camelize": "^1.0.0",
33
33
  "dayjs": "^1.11.10",
@@ -1,72 +1,8 @@
1
1
  import * as utils from "../configurationUtils";
2
2
 
3
- const { modifyDefaultConfigValues, parseLanguageTracks } = utils;
4
-
5
- const configuration = {
6
- general: { fields: [{ key: "general_1", initial_value: true }] },
7
- styles: { fields: [{ key: "styles_1", initial_value: true }] },
8
- localizations: {
9
- fields: [{ key: "localizations_1", initial_value: true, label: "label" }],
10
- },
11
- custom_configuration_fields: [
12
- { key: "custom_configuration_fields_1", initial_value: true },
13
- { key: "custom_configuration_fields_2", initial_value: "black" },
14
- {
15
- group: true,
16
- fields: [{ key: "custom_configuration_fields_3", initial_value: "red" }],
17
- },
18
- ],
19
- };
3
+ const { parseLanguageTracks } = utils;
20
4
 
21
5
  describe("utilities", () => {
22
- describe("modifyDefaultConfigValues", () => {
23
- it("should not modify the configuration if a map key doesn't exist in configuration ", function () {
24
- const res = modifyDefaultConfigValues(configuration, {
25
- custom_configuration_fields: {
26
- non_existing_key: { initial_value: "true" },
27
- },
28
- });
29
-
30
- expect(res).toEqual(configuration);
31
- });
32
-
33
- it("should modify the key from mapping", function () {
34
- const currentResult = modifyDefaultConfigValues(configuration, {
35
- styles: { styles_1: { initial_value: false } },
36
- });
37
-
38
- expect(currentResult.styles.fields[0].initial_value).toBe(false);
39
- });
40
-
41
- it("should add extra keys the key from mapping", function () {
42
- const currentResult = modifyDefaultConfigValues(configuration, {
43
- styles: { styles_1: { extra_key: false } },
44
- });
45
-
46
- expect(currentResult.styles.fields[0].extra_key).toBeDefined();
47
- });
48
-
49
- it("should not remove existing keys that aren't being overwritten", function () {
50
- const currentResult = modifyDefaultConfigValues(configuration, {
51
- localizations: { localizations_1: { initial_value: false } },
52
- });
53
-
54
- expect(currentResult.localizations.fields[0].label).toBeDefined();
55
- });
56
-
57
- it("should modify values in groups as well", function () {
58
- const currentResult = modifyDefaultConfigValues(configuration, {
59
- custom_configuration_fields: {
60
- custom_configuration_fields_3: { initial_value: "blue" },
61
- },
62
- });
63
-
64
- expect(
65
- currentResult.custom_configuration_fields[2].fields[0].initial_value
66
- ).toBe("blue");
67
- });
68
- });
69
-
70
6
  describe("parseLanguageTracks", () => {
71
7
  const textTrack = { index: 0, id: "text-0" };
72
8
  const audioTrack = { index: 0, id: "audio-0" };
@@ -0,0 +1,54 @@
1
+ import { getPlayerActionButtons } from "../getPlayerActionButtons";
2
+ import { selectActionButtons } from "../../conf/player/selectors";
3
+
4
+ jest.mock("../../conf/player/selectors", () => ({
5
+ selectActionButtons: jest.fn(),
6
+ }));
7
+
8
+ describe("getPlayerActionButtons", () => {
9
+ afterEach(() => {
10
+ jest.clearAllMocks();
11
+ });
12
+
13
+ it("returns an empty array if selectActionButtons returns undefined", () => {
14
+ (selectActionButtons as jest.Mock).mockReturnValue(undefined);
15
+ const result = getPlayerActionButtons({});
16
+ expect(result).toEqual([]);
17
+ });
18
+
19
+ it("returns an empty array if selectActionButtons returns null", () => {
20
+ (selectActionButtons as jest.Mock).mockReturnValue(null);
21
+ const result = getPlayerActionButtons({});
22
+ expect(result).toEqual([]);
23
+ });
24
+
25
+ it("returns an empty array if selectActionButtons returns empty string", () => {
26
+ (selectActionButtons as jest.Mock).mockReturnValue("");
27
+ const result = getPlayerActionButtons({});
28
+ expect(result).toEqual([]);
29
+ });
30
+
31
+ it("returns the first two trimmed action buttons", () => {
32
+ (selectActionButtons as jest.Mock).mockReturnValue(" play , pause , stop ");
33
+ const result = getPlayerActionButtons({});
34
+ expect(result).toEqual(["play", "pause"]);
35
+ });
36
+
37
+ it("returns only one button if only one is present", () => {
38
+ (selectActionButtons as jest.Mock).mockReturnValue(" play ");
39
+ const result = getPlayerActionButtons({});
40
+ expect(result).toEqual(["play"]);
41
+ });
42
+
43
+ it("trims whitespace from button names", () => {
44
+ (selectActionButtons as jest.Mock).mockReturnValue(" play , pause ");
45
+ const result = getPlayerActionButtons({});
46
+ expect(result).toEqual(["play", "pause"]);
47
+ });
48
+
49
+ it("returns an empty array if selectActionButtons returns only commas", () => {
50
+ (selectActionButtons as jest.Mock).mockReturnValue(" , , ");
51
+ const result = getPlayerActionButtons({});
52
+ expect(result).toEqual(["", ""]);
53
+ });
54
+ });
@@ -0,0 +1,71 @@
1
+ import { getAllFields, getConfigurationDiff } from "../utils";
2
+
3
+ describe("getAllFields", () => {
4
+ it("should return all field keys from flat configs", () => {
5
+ const config1 = {
6
+ fields: [{ key: "foo" }, { key: "bar" }],
7
+ };
8
+
9
+ const config2 = {
10
+ fields: [{ key: "baz" }],
11
+ };
12
+
13
+ expect(getAllFields(config1, config2)).toEqual(["foo", "bar", "baz"]);
14
+ });
15
+
16
+ it("should handle grouped fields", () => {
17
+ const config = {
18
+ fields: [
19
+ {
20
+ group: true,
21
+ fields: [{ key: "grouped1" }, { key: "grouped2" }],
22
+ },
23
+ { key: "single" },
24
+ ],
25
+ };
26
+
27
+ expect(getAllFields(config)).toEqual(["grouped1", "grouped2", "single"]);
28
+ });
29
+
30
+ it("should filter out fields without a key", () => {
31
+ const config = {
32
+ fields: [{ key: "foo" }, { notAKey: "bar" }],
33
+ };
34
+
35
+ expect(getAllFields(config)).toEqual(["foo"]);
36
+ });
37
+
38
+ it("should return an empty array if no fields are present", () => {
39
+ expect(getAllFields({})).toEqual([]);
40
+ });
41
+ });
42
+
43
+ describe("getConfigurationDiff", () => {
44
+ it("should return keys in defaultConfig not present in config", () => {
45
+ const defaultConfig = ["foo", "bar", "baz"];
46
+ const config = { foo: 1, baz: 2 };
47
+
48
+ expect(getConfigurationDiff(defaultConfig, config)).toEqual(["bar"]);
49
+ });
50
+
51
+ it("should return all keys if config is empty", () => {
52
+ const defaultConfig = ["foo", "bar"];
53
+ const config = {};
54
+
55
+ expect(getConfigurationDiff(defaultConfig, config)).toEqual(["foo", "bar"]);
56
+ });
57
+
58
+ it("should return an empty array if all keys are present", () => {
59
+ const defaultConfig = ["foo"];
60
+ const config = { foo: 1 };
61
+
62
+ expect(getConfigurationDiff(defaultConfig, config)).toEqual([]);
63
+ });
64
+
65
+ it("should return defaultConfig if config has no matching keys", () => {
66
+ const defaultConfig = ["foo", "bar"];
67
+ const config = { baz: 1 };
68
+
69
+ expect(getConfigurationDiff(defaultConfig, config)).toEqual(["foo", "bar"]);
70
+ });
71
+ });
@@ -0,0 +1 @@
1
+ export * from "./utils";
@@ -0,0 +1,31 @@
1
+ import {
2
+ flatMap,
3
+ get,
4
+ flatten,
5
+ difference,
6
+ } from "@applicaster/zapp-react-native-utils/utils";
7
+
8
+ const extractFields = (field: any) => {
9
+ if (field.group === true) {
10
+ return field.fields;
11
+ }
12
+
13
+ return field;
14
+ };
15
+
16
+ export const getAllFields = (...configs: any[]) => {
17
+ const allFields = flatMap(configs, (config) => get(config, "fields", []));
18
+
19
+ const processedFields = flatten(allFields.map(extractFields))
20
+ .map((field) => get(field, "key"))
21
+ .filter(Boolean);
22
+
23
+ return processedFields;
24
+ };
25
+
26
+ export const getConfigurationDiff = (
27
+ defaultConfig,
28
+ config: Record<string, any>
29
+ ) => {
30
+ return difference(defaultConfig, Object.keys(config));
31
+ };
@@ -1,50 +1,6 @@
1
1
  import { parseJsonIfNeeded } from "../functionUtils";
2
2
  import * as R from "ramda";
3
3
 
4
- import { getNativeName as nativeNameUtil } from "../localizationUtils/localeLanguage";
5
-
6
- export const modifyDefaultConfigValues = (
7
- configuration: ConfigurationKeys,
8
- mapping: ConfigValuesMapping
9
- ): DefaultConfiguration => {
10
- return R.mapObjIndexed((value, key) => {
11
- const isFieldlessKey = key === "custom_configuration_fields";
12
- const keyMapping = mapping[key];
13
- const fields = value?.fields || value;
14
-
15
- if (!keyMapping) {
16
- return value;
17
- }
18
-
19
- const mapper = (obj) => {
20
- if (obj.fields) {
21
- return R.mergeLeft({ fields: R.map(mapper)(obj.fields) })(obj);
22
- }
23
-
24
- return R.mergeLeft(keyMapping?.[obj.key])(obj);
25
- };
26
-
27
- const mappedFields = R.map(mapper)(fields);
28
-
29
- return R.unless(() => isFieldlessKey, R.objOf("fields"))(mappedFields);
30
- })(configuration);
31
- };
32
-
33
- export function nativeName(localeCode) {
34
- try {
35
- const {
36
- getNativeName,
37
- } = require("@applicaster/zapp-react-native-utils/localizationUtils/localeLanguage");
38
-
39
- return getNativeName(localeCode);
40
- } catch (error) {
41
- // eslint-disable-next-line no-console
42
- console.warn("Could not load localeLanguage utils from QB", error);
43
-
44
- return nativeNameUtil(localeCode);
45
- }
46
- }
47
-
48
4
  const setTrackType = R.curry(
49
5
  (
50
6
  type: QuickBrickPlayer.TrackType,
@@ -0,0 +1,17 @@
1
+ import { map, take, trim } from "../utils";
2
+ import { selectActionButtons } from "../conf/player/selectors";
3
+
4
+ /**
5
+ * Returns the first two action buttons from the configuration.
6
+ * @param {Object} configuration - The player configuration object.
7
+ * @returns {Array} An array containing the first two action buttons.
8
+ */
9
+ export const getPlayerActionButtons = (configuration: any) => {
10
+ const buttonsString = selectActionButtons(configuration);
11
+
12
+ if (!buttonsString) {
13
+ return [];
14
+ }
15
+
16
+ return take(map(buttonsString.split(","), trim), 2);
17
+ };
@@ -6,6 +6,8 @@ import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
6
6
 
7
7
  import { getBoolFromConfigValue } from "../configurationUtils";
8
8
 
9
+ export { getPlayerActionButtons } from "./getPlayerActionButtons";
10
+
9
11
  /**
10
12
  * Gets duration value from player manager, and from extensions
11
13
  * then checks whether the value from either is a not a valid number
@@ -1,34 +1,37 @@
1
1
  import * as React from "react";
2
- import * as R from "ramda";
3
- import generateConfiguration from "./configurationGenerator";
4
2
  import { createLogger } from "../logger";
3
+ import { createConfig } from "../manifestUtils/createConfig";
4
+ import { getAllFields, getConfigurationDiff } from "./_internals";
5
5
 
6
6
  export const logger = createLogger({
7
7
  category: "useValidatePlayerConfig",
8
8
  subsystem: "useValidatePlayerConfig",
9
9
  });
10
10
 
11
- const configuration = generateConfiguration();
11
+ /** Default Player Configuration */
12
+ const {
13
+ styles,
14
+ general,
15
+ localizations,
16
+ custom_configuration_fields,
17
+ }: DefaultConfiguration = createConfig(
18
+ () => {
19
+ return {};
20
+ },
21
+ { extend: "player" }
22
+ ) as any;
23
+
24
+ const QBPlayerConfigFields = getAllFields(
25
+ styles,
26
+ general,
27
+ localizations,
28
+ custom_configuration_fields
29
+ );
12
30
 
13
31
  export const useValidatePlayerConfig = (config) => {
14
32
  React.useEffect(() => {
15
33
  try {
16
- const QBPlayerConfigFields = R.compose(
17
- R.map(R.prop("key")),
18
- R.flatten,
19
- R.map(R.compose(R.when(R.propEq("group", true), R.prop("fields")))),
20
- R.concat
21
- )(
22
- configuration.styles.fields,
23
- configuration.general.fields,
24
- configuration.localizations.fields,
25
- configuration.custom_configuration_fields
26
- );
27
-
28
- const diff = R.compose(
29
- R.difference(QBPlayerConfigFields),
30
- R.keys
31
- )(config);
34
+ const diff = getConfigurationDiff(QBPlayerConfigFields, config);
32
35
 
33
36
  logger.log_info(
34
37
  "Missing following configuration properties. Some elements of the player may not work correctly. Check QuickBrickPlayerPlugin for the configuration reference https://github.com/applicaster/QuickBrick/tree/main/plugins/zapp-react-native-default-player/manifests",
@@ -21,7 +21,9 @@ jest.mock(
21
21
 
22
22
  jest.useFakeTimers({ legacyFakeTimers: true });
23
23
 
24
- jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation");
24
+ jest.mock(
25
+ "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation"
26
+ );
25
27
 
26
28
  const mockStore = configureStore();
27
29
 
@@ -1,8 +1,10 @@
1
1
  import { complement, compose, isNil, map, min, prop, take, uniq } from "ramda";
2
- import { useDispatch } from "react-redux";
3
2
  import * as React from "react";
4
- import { useZappPipesFeeds } from "@applicaster/zapp-react-native-redux/hooks";
5
- import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
3
+ import {
4
+ ZappPipes,
5
+ useAppDispatch,
6
+ useZappPipesFeed,
7
+ } from "@applicaster/zapp-react-native-redux";
6
8
  import { isNilOrEmpty } from "../../reactUtils/helpers";
7
9
  import { ZappPipesSearchContext } from "@applicaster/zapp-react-native-ui-components/Contexts";
8
10
  import {
@@ -10,7 +12,7 @@ import {
10
12
  getSearchContext,
11
13
  } from "@applicaster/zapp-react-native-utils/reactHooks";
12
14
  import { isGallery } from "@applicaster/zapp-react-native-utils/componentsUtils";
13
- import { useScreenContext } from "../screen/useScreenContext";
15
+ import { useScreenContext } from "../screen";
14
16
 
15
17
  type Options = {
16
18
  initialBatchSize?: number;
@@ -63,7 +65,7 @@ export const useBatchLoading = (
63
65
  componentsToRender: { data?: ZappDataSource; component_type: string }[],
64
66
  options: Options
65
67
  ) => {
66
- const dispatch = useDispatch();
68
+ const dispatch = useAppDispatch();
67
69
  const { screen: screenContext, entry: entryContext } = useScreenContext();
68
70
  const [searchContext] = ZappPipesSearchContext.useZappPipesContext();
69
71
  const [hasEverBeenReady, setHasEverBeenReady] = React.useState(false);
@@ -118,7 +120,7 @@ export const useBatchLoading = (
118
120
  []
119
121
  );
120
122
 
121
- const feeds = useZappPipesFeeds(feedUrls);
123
+ const feeds = useZappPipesFeed(feedUrls);
122
124
 
123
125
  // dispatch loadPipesData for each feed that is not loaded
124
126
  const runBatchLoading = React.useCallback(() => {
@@ -139,16 +141,16 @@ export const useBatchLoading = (
139
141
  if (mappedFeedUrl) {
140
142
  // 4. load data
141
143
  return dispatch(
142
- loadPipesData(mappedFeedUrl, { riverId: options.riverId })
144
+ ZappPipes.loadPipesData(mappedFeedUrl, { riverId: options.riverId })
143
145
  );
144
146
  }
145
147
  }
146
148
  });
147
- }, [feedUrls]);
149
+ }, [feedUrls, feeds]);
148
150
 
149
151
  React.useEffect(() => {
150
152
  runBatchLoading();
151
- }, []);
153
+ }, [runBatchLoading]); // Adding runBatchLoading as a dependency to ensure that it reloads feeds when clearPipesData is called
152
154
 
153
155
  React.useEffect(() => {
154
156
  // check if all feeds are ready and set hasEverBeenReady to true