@applicaster/zapp-react-native-utils 13.0.0-alpha.1486614302 → 13.0.0-alpha.1503493274

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 (48) hide show
  1. package/actionsExecutor/ActionExecutorContext.tsx +55 -6
  2. package/actionsExecutor/consts.ts +4 -0
  3. package/appUtils/__tests__/__snapshots__/localizationsHelper.test.ts.snap +151 -0
  4. package/appUtils/__tests__/allZappLocales.ts +79 -0
  5. package/appUtils/__tests__/{localizationsHelper.test.js → localizationsHelper.test.ts} +11 -0
  6. package/appUtils/accessibilityManager/const.ts +18 -0
  7. package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +1 -0
  8. package/appUtils/focusManager/index.ios.ts +14 -4
  9. package/appUtils/focusManager/utils/__tests__/findChild.test.ts +35 -0
  10. package/appUtils/focusManager/utils/index.ts +5 -0
  11. package/appUtils/localizationsHelper.ts +31 -0
  12. package/appUtils/playerManager/playerHooks/usePlayerCurrentTime.tsx +11 -7
  13. package/appUtils/playerManager/usePlayerTitleSummaryOverlay.tsx +7 -1
  14. package/cellUtils/index.ts +9 -5
  15. package/componentsUtils/__tests__/isFirstComponentGallery.test.ts +33 -0
  16. package/componentsUtils/__tests__/isFirstComponentScreenPicker.test.ts +33 -0
  17. package/componentsUtils/__tests__/isGallery.test.ts +33 -0
  18. package/componentsUtils/__tests__/isScreenPicker.test.ts +33 -0
  19. package/componentsUtils/index.ts +39 -0
  20. package/dateUtils/index.ts +17 -0
  21. package/localizationUtils/index.ts +8 -13
  22. package/manifestUtils/defaultManifestConfigurations/generalContent.js +13 -0
  23. package/manifestUtils/defaultManifestConfigurations/player.js +0 -8
  24. package/manifestUtils/index.js +2 -0
  25. package/manifestUtils/keys.js +27 -2
  26. package/navigationUtils/__tests__/__snapshots__/navigationUtils.test.js.snap +1 -0
  27. package/navigationUtils/index.ts +3 -1
  28. package/package.json +2 -2
  29. package/playerUtils/configurationGenerator.ts +0 -16
  30. package/playerUtils/index.ts +23 -0
  31. package/reactHooks/app/useAppState.ts +2 -2
  32. package/reactHooks/feed/useBatchLoading.ts +10 -12
  33. package/reactHooks/feed/useFeedLoader.tsx +13 -6
  34. package/reactHooks/navigation/{useGetTabBarHeight.ts → getTabBarHeight.ts} +1 -1
  35. package/reactHooks/navigation/useGetBottomTabBarHeight.ts +10 -3
  36. package/reactHooks/navigation/useNavigationPluginData.ts +8 -4
  37. package/reactHooks/navigation/useNavigationType.ts +4 -2
  38. package/reactHooks/screen/__tests__/useScreenBackgroundColor.test.tsx +69 -0
  39. package/reactHooks/screen/useScreenBackgroundColor.ts +3 -15
  40. package/reactHooks/state/README.md +79 -0
  41. package/reactHooks/state/ZStoreProvider.tsx +71 -0
  42. package/reactHooks/state/__tests__/ZStoreProvider.test.tsx +66 -0
  43. package/reactHooks/state/index.ts +2 -0
  44. package/reactHooks/useListenEventBusEvent.ts +1 -1
  45. package/reactUtils/index.ts +9 -0
  46. package/typeGuards/index.ts +3 -0
  47. package/utils/index.ts +1 -13
  48. package/zappFrameworkUtils/localStorageHelper.ts +32 -10
@@ -0,0 +1,33 @@
1
+ import { isFirstComponentScreenPicker } from "..";
2
+
3
+ describe("isFirstComponentScreenPicker", () => {
4
+ it("should return true if the first component screen-picker", () => {
5
+ const items = [{ component_type: "screen-picker-qb-tv" }];
6
+ expect(isFirstComponentScreenPicker(items)).toBe(true);
7
+ });
8
+
9
+ it("should return false if the first component type is not screen-picker", () => {
10
+ const items = [{ component_type: "other-component" }];
11
+ expect(isFirstComponentScreenPicker(items)).toBe(false);
12
+ });
13
+
14
+ it("should return false if the component type is undefined", () => {
15
+ const items = [{ component_type: undefined }];
16
+ expect(isFirstComponentScreenPicker(items)).toBe(false);
17
+ });
18
+
19
+ it("should return false if the item is null", () => {
20
+ const items = null;
21
+ expect(isFirstComponentScreenPicker(items)).toBe(false);
22
+ });
23
+
24
+ it("should return false if the item is undefined", () => {
25
+ const items = undefined;
26
+ expect(isFirstComponentScreenPicker(items)).toBe(false);
27
+ });
28
+
29
+ it("should return false if the item is an empty object", () => {
30
+ const items = {};
31
+ expect(isFirstComponentScreenPicker(items)).toBe(false);
32
+ });
33
+ });
@@ -0,0 +1,33 @@
1
+ import { isGallery } from "..";
2
+
3
+ describe("isGallery", () => {
4
+ it("should return true if the component type is 'gallery-qb'", () => {
5
+ const item = { component_type: "gallery-qb" };
6
+ expect(isGallery(item)).toBe(true);
7
+ });
8
+
9
+ it("should return false if the component type is not 'gallery-qb'", () => {
10
+ const item = { component_type: "other-component" };
11
+ expect(isGallery(item)).toBe(false);
12
+ });
13
+
14
+ it("should return false if the component type is undefined", () => {
15
+ const item = { component_type: undefined };
16
+ expect(isGallery(item)).toBe(false);
17
+ });
18
+
19
+ it("should return false if the item is null", () => {
20
+ const item = null;
21
+ expect(isGallery(item)).toBe(false);
22
+ });
23
+
24
+ it("should return false if the item is undefined", () => {
25
+ const item = undefined;
26
+ expect(isGallery(item)).toBe(false);
27
+ });
28
+
29
+ it("should return false if the item is an empty object", () => {
30
+ const item = {};
31
+ expect(isGallery(item)).toBe(false);
32
+ });
33
+ });
@@ -0,0 +1,33 @@
1
+ import { isScreenPicker } from "..";
2
+
3
+ describe("isScreenPicker", () => {
4
+ it("should return true if the component type is 'screen-picker-qb-tv'", () => {
5
+ const item = { component_type: "screen-picker-qb-tv" };
6
+ expect(isScreenPicker(item)).toBe(true);
7
+ });
8
+
9
+ it("should return false if the component type is not 'screen-picker-qb-tv'", () => {
10
+ const item = { component_type: "other-component" };
11
+ expect(isScreenPicker(item)).toBe(false);
12
+ });
13
+
14
+ it("should return false if the component type is undefined", () => {
15
+ const item = { component_type: undefined };
16
+ expect(isScreenPicker(item)).toBe(false);
17
+ });
18
+
19
+ it("should return false if the item is null", () => {
20
+ const item = null;
21
+ expect(isScreenPicker(item)).toBe(false);
22
+ });
23
+
24
+ it("should return false if the item is undefined", () => {
25
+ const item = undefined;
26
+ expect(isScreenPicker(item)).toBe(false);
27
+ });
28
+
29
+ it("should return false if the item is an empty object", () => {
30
+ const item = {};
31
+ expect(isScreenPicker(item)).toBe(false);
32
+ });
33
+ });
@@ -0,0 +1,39 @@
1
+ const GROUP = "group-qb";
2
+ const GROUP_INFO = "group-info-qb";
3
+ const GROUP_INFO_OLD = "group-info";
4
+ const EMPTY_GROUP_COMPONENT = "empty_group_component";
5
+
6
+ const GALLERY = "gallery-qb";
7
+
8
+ const SCREEN_PICKER = "screen-picker-qb-tv";
9
+
10
+ const HORIZONTAL_LIST = "horizontal_list_qb";
11
+
12
+ export const isGallery = (item): boolean => item?.component_type === GALLERY;
13
+
14
+ export const isHorizontalList = (item): boolean =>
15
+ item?.component_type === HORIZONTAL_LIST;
16
+
17
+ export const isScreenPicker = (item): boolean =>
18
+ item?.component_type === SCREEN_PICKER;
19
+
20
+ export const isFirstComponentScreenPicker = (
21
+ components: ZappUIComponent[]
22
+ ): boolean => {
23
+ return isScreenPicker(components?.[0]);
24
+ };
25
+
26
+ export const isFirstComponentGallery = (
27
+ components: ZappUIComponent[]
28
+ ): boolean => {
29
+ return isGallery(components?.[0]);
30
+ };
31
+
32
+ export const isGroup = (item): boolean => item?.component_type === GROUP;
33
+
34
+ export const isEmptyGroup = (item): boolean =>
35
+ item?.component_type === EMPTY_GROUP_COMPONENT;
36
+
37
+ export const isGroupInfo = (item): boolean =>
38
+ item?.component_type === GROUP_INFO ||
39
+ item?.component_type === GROUP_INFO_OLD;
@@ -3,6 +3,7 @@ import utc from "dayjs/plugin/utc";
3
3
  import timezone from "dayjs/plugin/timezone";
4
4
  import isoWeek from "dayjs/plugin/isoWeek";
5
5
  import duration from "dayjs/plugin/duration";
6
+ import relativeTime from "dayjs/plugin/relativeTime";
6
7
 
7
8
  // Extend dayjs with plugins
8
9
  dayjs.extend(utc);
@@ -10,4 +11,20 @@ dayjs.extend(timezone);
10
11
  dayjs.extend(isoWeek);
11
12
  dayjs.extend(duration);
12
13
 
14
+ dayjs.extend(relativeTime, {
15
+ thresholds: [
16
+ { l: "s", r: 1 },
17
+ { l: "m", r: 1 },
18
+ { l: "mm", r: 59, d: "minute" },
19
+ { l: "h", r: 1 },
20
+ { l: "hh", r: 23, d: "hour" },
21
+ { l: "d", r: 1 },
22
+ { l: "dd", r: 29, d: "day" },
23
+ { l: "M", r: 1 },
24
+ { l: "MM", r: 11, d: "month" },
25
+ { l: "y", r: 1 },
26
+ { l: "yy", d: "year" },
27
+ ],
28
+ });
29
+
13
30
  export { dayjs };
@@ -1,9 +1,8 @@
1
- import * as R from "ramda";
2
1
  import { ViewStyle } from "react-native";
3
2
 
4
3
  import { useMemo } from "react";
5
- import { getUILanguage } from "../appUtils/localizationsHelper";
6
- import { utilsLogger } from "../logger";
4
+ import { getUILanguage } from "@applicaster/zapp-react-native-utils/appUtils/localizationsHelper";
5
+ import { utilsLogger } from "@applicaster/zapp-react-native-utils/logger";
7
6
 
8
7
  export {
9
8
  getLocale,
@@ -11,7 +10,7 @@ export {
11
10
  getCountryCode,
12
11
  getLocalizations,
13
12
  getUILanguage,
14
- } from "../appUtils/localizationsHelper";
13
+ } from "@applicaster/zapp-react-native-utils/appUtils/localizationsHelper";
15
14
 
16
15
  const RTL_LOCALES = [
17
16
  "ar", // Arabic
@@ -29,14 +28,16 @@ const RTL_LOCALES = [
29
28
  "yi", // Yiddish
30
29
  ];
31
30
 
32
- export function useLocalizedStrings({ localizations }) {
31
+ export function useLocalizedStrings({ localizations = {} }) {
33
32
  const languageCode = getUILanguage();
34
33
 
35
34
  // TODO: probably we can call getLocalizations here from localizationsHelper.js
36
35
  const result = useMemo(
37
36
  () =>
38
37
  localizations?.[languageCode] ||
39
- R.compose(R.head, R.filter(R.is(Object)), R.values)(localizations) ||
38
+ Object.values(localizations).find(
39
+ (value) => typeof value === "object" && value !== null
40
+ ) ||
40
41
  {},
41
42
  [languageCode, localizations]
42
43
  );
@@ -53,13 +54,7 @@ export function getIsRTL(): boolean {
53
54
  return false;
54
55
  }
55
56
 
56
- const [languageCode] = uiLanguage.split("-");
57
-
58
- const lowerCaseLanguageCode = languageCode.toLocaleLowerCase();
59
-
60
- const isRTL = R.contains(lowerCaseLanguageCode, RTL_LOCALES);
61
-
62
- return isRTL;
57
+ return RTL_LOCALES.includes(uiLanguage.split("-")[0].toLocaleLowerCase());
63
58
  }
64
59
 
65
60
  export function useIsRTL(): boolean {
@@ -251,6 +251,19 @@ const generalContent = () => ({
251
251
  key: "screen_title",
252
252
  initial_value: null,
253
253
  },
254
+ {
255
+ type: "text_input",
256
+ label: "Maximum Selection Reached - Alert Description",
257
+ key: "msg_maximum_selection_reached_message",
258
+ initial_value:
259
+ "You’ve reached the maximum number of items you can select.",
260
+ },
261
+ {
262
+ type: "text_input",
263
+ label: "Maximum Selection Reached - Alert Button",
264
+ key: "msg_maximum_selection_reached_message_ok_button",
265
+ initial_value: "Got it",
266
+ },
254
267
  ],
255
268
  },
256
269
  advertising: {
@@ -42,14 +42,6 @@ function getPlayerConfiguration({ platform }) {
42
42
  label_tooltip:
43
43
  "Enable if you want to have adaptive background gradient based on audio background image.",
44
44
  },
45
- {
46
- key: "audio_player_background_image_query",
47
- label: "Audio Player Image Query",
48
- initial_value: "",
49
- type: "text_input",
50
- label_tooltip:
51
- "Set the query params which control the size of the image e.g width, height. This will help to optimize the loading time, when magic background is enabled.",
52
- },
53
45
  {
54
46
  key: "audio_player_background_image_default_color",
55
47
  label: "Audio Player Background Image Default Color",
@@ -8,6 +8,7 @@ const {
8
8
 
9
9
  const { tvActionButtonsContainer } = require("./tvAction/container");
10
10
  const { tvActionButton } = require("./tvAction/button");
11
+ const { compact } = require("./_internals");
11
12
 
12
13
  const { spacingKey, absolutePositionElement } = require("./containers");
13
14
 
@@ -46,4 +47,5 @@ module.exports = {
46
47
  tvProgressBar,
47
48
  secondaryImage,
48
49
  getUpdatedSecondaryImageKeys,
50
+ compact,
49
51
  };
@@ -21,7 +21,30 @@ const ZAPPIFEST_FIELDS = {
21
21
  },
22
22
  };
23
23
 
24
- const TV_PLATFORMS = ["tvOS", "android", "LG", "samsung", "roku", "vizio"];
24
+ const TV_PLATFORMS_FOR_FONTS = [
25
+ "tvOS",
26
+ "android",
27
+ "LG",
28
+ "samsung",
29
+ "roku",
30
+ "vizio",
31
+ ];
32
+
33
+ const MOBILE_PLATFORMS = [
34
+ "ios",
35
+ "ios_for_quickbrick",
36
+ "android",
37
+ "android_for_quickbrick",
38
+ ];
39
+
40
+ const TV_PLATFORMS = [
41
+ "android_tv_for_quickbrick",
42
+ "amazon_fire_tv_for_quickbrick",
43
+ "tvos_for_quickbrick",
44
+ "samsung_tv",
45
+ "lg_tv",
46
+ "vizio",
47
+ ];
25
48
 
26
49
  const FontPropsForTVPlatform = (platform) => ({
27
50
  [`${R.toLower(platform)}FontFamily`]: {
@@ -92,7 +115,7 @@ const TV_FONT_KEY_DATA = {
92
115
  name: "focused font color",
93
116
  type: ZAPPIFEST_FIELDS.color_picker,
94
117
  },
95
- ...R.reduce(addTVFontsForPlatform, {}, TV_PLATFORMS),
118
+ ...R.reduce(addTVFontsForPlatform, {}, TV_PLATFORMS_FOR_FONTS),
96
119
  textAlignment: {
97
120
  name: "text alignment",
98
121
  type: ZAPPIFEST_FIELDS.select,
@@ -2083,4 +2106,6 @@ module.exports = {
2083
2106
  TV_CELL_BADGE_FIELDS,
2084
2107
  progressBarFields,
2085
2108
  secondaryImageFields,
2109
+ TV_PLATFORMS,
2110
+ MOBILE_PLATFORMS,
2086
2111
  };
@@ -5,6 +5,7 @@ exports[`getNavigationProps returns the props otherwise 1`] = `
5
5
  "assets": {
6
6
  "appLogo": "appLogo.png",
7
7
  },
8
+ "data": undefined,
8
9
  "home": false,
9
10
  "nav_items": [
10
11
  {
@@ -111,6 +111,7 @@ export function getNavigationProps({
111
111
  assets: ZappNavBarAssets;
112
112
  rules: ZappNavBarRules;
113
113
  nav_items: NavBarItem[];
114
+ data: MenuItemDataProperties;
114
115
  } | null {
115
116
  const { activeRiver } = navigator;
116
117
  const { navigations, id: selected, home } = activeRiver; // use useRiver hook instead
@@ -124,7 +125,7 @@ export function getNavigationProps({
124
125
  return null;
125
126
  }
126
127
 
127
- const { styles, assets, nav_items, rules } = navigation;
128
+ const { styles, assets, nav_items, rules, data } = navigation;
128
129
 
129
130
  return {
130
131
  selected,
@@ -134,6 +135,7 @@ export function getNavigationProps({
134
135
  assets: assets as ZappNavBarAssets,
135
136
  nav_items: nav_items as any as NavBarItem[],
136
137
  rules: rules as any as ZappNavBarRules,
138
+ data: data as MenuItemDataProperties,
137
139
  };
138
140
  }
139
141
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-utils",
3
- "version": "13.0.0-alpha.1486614302",
3
+ "version": "13.0.0-alpha.1503493274",
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": "13.0.0-alpha.1486614302",
30
+ "@applicaster/applicaster-types": "13.0.0-alpha.1503493274",
31
31
  "buffer": "^5.2.1",
32
32
  "camelize": "^1.0.0",
33
33
  "dayjs": "^1.11.10",
@@ -39,22 +39,6 @@ function getPlayerConfiguration({ platform }) {
39
39
  label_tooltip:
40
40
  "Disable if you don't want the content to have a right orientation",
41
41
  },
42
- {
43
- key: "magic_background",
44
- label: "Enable Magic Background",
45
- initial_value: false,
46
- type: "switch",
47
- label_tooltip:
48
- "Enable if you want to have adaptive background gradient based on audio background image.",
49
- },
50
- {
51
- key: "audio_player_background_image_query",
52
- label: "Audio Player Image Query",
53
- initial_value: "",
54
- type: "text_input",
55
- label_tooltip:
56
- "Set the query params which control the size of the image e.g width, height. This will help to optimize the loading time, when magic background is enabled.",
57
- },
58
42
  {
59
43
  key: "audio_player_background_image_default_color",
60
44
  label: "Audio Player Background Image Default Color",
@@ -1,5 +1,9 @@
1
1
  import * as R from "ramda";
2
2
  import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils/playerManager";
3
+ import { isString } from "@applicaster/zapp-react-native-utils/typeGuards";
4
+ import { isFilledArray } from "@applicaster/zapp-react-native-utils/arrayUtils";
5
+ import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
6
+
3
7
  import { getBoolFromConfigValue } from "../configurationUtils";
4
8
 
5
9
  /**
@@ -72,3 +76,22 @@ function isLiveByManager(): boolean {
72
76
  export function isLive(entry: ZappEntry): boolean {
73
77
  return isEntryLive(entry) || isLiveByManager();
74
78
  }
79
+
80
+ export const isAudioItem = (item: Option<ZappEntry>) => {
81
+ if (
82
+ isString(item?.content?.type) &&
83
+ item?.content?.type?.includes?.("audio")
84
+ ) {
85
+ return true;
86
+ }
87
+
88
+ if (isString(item?.type?.value) && item?.type?.value?.includes?.("audio")) {
89
+ return true;
90
+ }
91
+
92
+ return false;
93
+ };
94
+
95
+ export const isInlineTV = (screenData) => {
96
+ return isTV() && isFilledArray(screenData?.ui_components);
97
+ };
@@ -14,10 +14,10 @@ export function useAppState(returnIsActive) {
14
14
  };
15
15
 
16
16
  React.useEffect(() => {
17
- AppState.addEventListener("change", setAppState);
17
+ const subscription = AppState.addEventListener("change", setAppState);
18
18
 
19
19
  return () => {
20
- AppState.removeEventListener("change", setAppState);
20
+ subscription.remove();
21
21
  };
22
22
  }, []);
23
23
 
@@ -1,7 +1,7 @@
1
- import { isNil, complement, compose, map, min, prop, take, uniq } from "ramda";
1
+ import { complement, compose, isNil, map, min, prop, take, uniq } from "ramda";
2
2
  import { useDispatch } from "react-redux";
3
3
  import * as React from "react";
4
- import { useZappPipesFeeds } from "@applicaster/zapp-react-native-redux/hooks/useZappPipesFeeds";
4
+ import { useZappPipesFeeds } from "@applicaster/zapp-react-native-redux/hooks";
5
5
  import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
6
6
  import { isNilOrEmpty } from "../../reactUtils/helpers";
7
7
  import { ZappPipesSearchContext } from "@applicaster/zapp-react-native-ui-components/Contexts";
@@ -9,6 +9,7 @@ import {
9
9
  getInflatedDataSourceUrl,
10
10
  getSearchContext,
11
11
  } from "@applicaster/zapp-react-native-utils/reactHooks";
12
+ import { isGallery } from "@applicaster/zapp-react-native-utils/componentsUtils";
12
13
  import { useScreenContext } from "../screen/useScreenContext";
13
14
 
14
15
  type Options = {
@@ -46,9 +47,7 @@ const filterEmptyData = (data) => {
46
47
  };
47
48
 
48
49
  const getData = (rawData) =>
49
- rawData.component_type === "gallery-qb"
50
- ? rawData.ui_components[0].data
51
- : rawData.data;
50
+ isGallery(rawData) ? rawData.ui_components[0].data : rawData.data;
52
51
 
53
52
  const extractData = compose(uniq, map(getData));
54
53
 
@@ -70,13 +69,12 @@ export const useBatchLoading = (
70
69
  const [hasEverBeenReady, setHasEverBeenReady] = React.useState(false);
71
70
 
72
71
  // if first component is gallery-qb, take only one component for initial load
73
- const takeSize =
74
- componentsToRender?.[0]?.component_type === "gallery-qb"
75
- ? 1
76
- : min(
77
- options.initialBatchSize ?? DEFAULT_BATCH_SIZE,
78
- componentsToRender.length
79
- );
72
+ const takeSize = isGallery(componentsToRender?.[0])
73
+ ? 1
74
+ : min(
75
+ options.initialBatchSize ?? DEFAULT_BATCH_SIZE,
76
+ componentsToRender.length
77
+ );
80
78
 
81
79
  const takeBatchSize = React.useCallback(take(takeSize), [takeSize]);
82
80
 
@@ -20,6 +20,7 @@ type Props = {
20
20
  silentRefresh?: boolean;
21
21
  method?: "get" | "post";
22
22
  bodyParams?: Record<string, unknown>;
23
+ skipLoading?: boolean;
23
24
  };
24
25
  };
25
26
 
@@ -95,7 +96,7 @@ export const useFeedLoader = ({
95
96
  if (
96
97
  shouldDispatchData(callableFeedUrl, currentFeed, pipesOptions.clearCache)
97
98
  ) {
98
- if (callableFeedUrl) {
99
+ if (callableFeedUrl && !pipesOptions.skipLoading) {
99
100
  dispatch(
100
101
  loadPipesData(callableFeedUrl, {
101
102
  ...pipesOptions,
@@ -103,26 +104,33 @@ export const useFeedLoader = ({
103
104
  riverId,
104
105
  })
105
106
  );
106
- } else {
107
+ } else if (!callableFeedUrl) {
107
108
  logger.info({
108
109
  message:
109
110
  "Feed is not defined or not inflated, skipping loading. \nMake sure you have correct feedUrl and mapping.",
110
111
  jsOnly: true,
111
112
  });
113
+ } else {
114
+ logger.info({
115
+ message:
116
+ "Loading skipped as per pipesOptions.skipLoading configuration.",
117
+ data: { url: callableFeedUrl },
118
+ jsOnly: true,
119
+ });
112
120
  }
113
121
  } else {
114
122
  logger.info({
115
123
  message:
116
- "Feed already exist, skipping loading. \nCall reloadData() if you want to refresh data.",
124
+ "Feed already exists, skipping loading. \nCall reloadData() if you want to refresh data.",
117
125
  data: { url: callableFeedUrl },
118
126
  jsOnly: true,
119
127
  });
120
128
  }
121
129
  }, []);
122
130
 
123
- // Reload feed when feedUrl changes
131
+ // Reload feed when feedUrl changes, unless skipLoading is true
124
132
  useEffect(() => {
125
- if (!isInitialRender && callableFeedUrl) {
133
+ if (!isInitialRender && callableFeedUrl && !pipesOptions.skipLoading) {
126
134
  dispatch(loadPipesData(callableFeedUrl, { ...pipesOptions, riverId }));
127
135
  }
128
136
  }, [callableFeedUrl]);
@@ -158,7 +166,6 @@ export const useFeedLoader = ({
158
166
  currentFeed?.data,
159
167
  currentFeed?.error,
160
168
  currentFeed?.loading,
161
-
162
169
  reloadData,
163
170
  loadNext,
164
171
  ]);
@@ -3,7 +3,7 @@ import { platformSelect } from "../../reactUtils";
3
3
  const TAB_BAR_HEIGHT_IOS = 49;
4
4
  const TAB_BAR_HEIGHT_ANDROID = 56;
5
5
 
6
- export const useGetTabBarHeight = () =>
6
+ export const getTabBarHeight = () =>
7
7
  platformSelect({
8
8
  ios: TAB_BAR_HEIGHT_IOS,
9
9
  android: TAB_BAR_HEIGHT_ANDROID,
@@ -1,12 +1,19 @@
1
1
  import { useGetNavBarTopBorderWidth } from "./useGetNavBarTopBorderWidth";
2
- import { useGetTabBarHeight } from "./useGetTabBarHeight";
2
+ import { getTabBarHeight } from "./getTabBarHeight";
3
+ import { useNavigation } from "./useNavigation";
3
4
  import { MenuTypes, useNavigationType } from "./useNavigationType";
5
+ import { useNavigationPluginData } from "./useNavigationPluginData";
4
6
 
5
7
  export const useGetBottomTabBarHeight = (): number => {
8
+ const { activeRiver } = useNavigation();
9
+
10
+ const navigationPluginData = useNavigationPluginData(activeRiver);
11
+ const navigationType = useNavigationType(navigationPluginData);
12
+
6
13
  const topBorderWidth = useGetNavBarTopBorderWidth();
7
- const tabBarHeight = useGetTabBarHeight();
14
+ const tabBarHeight = getTabBarHeight();
8
15
 
9
- const isBottomBarNavigation = useNavigationType() === MenuTypes.bottomTabBar;
16
+ const isBottomBarNavigation = navigationType === MenuTypes.bottomTabBar;
10
17
 
11
18
  return !isBottomBarNavigation ? 0 : tabBarHeight + topBorderWidth;
12
19
  };
@@ -1,13 +1,17 @@
1
1
  import { useRoute } from "./useRoute";
2
2
 
3
- export const useNavigationPluginData = (): ZappNavigation | undefined => {
3
+ export const useNavigationPluginData = (
4
+ screenData?: LegacyNavigationScreenData | null
5
+ ): ZappNavigation | undefined => {
4
6
  const {
5
7
  screenData: useRouteScreenData,
6
8
  }: { screenData: QuickBrickNavigationData | null } = useRoute();
7
9
 
8
- const navigations = useRouteScreenData?.targetScreen
9
- ? (useRouteScreenData.targetScreen as ZappRiver).navigations
10
- : (useRouteScreenData as ZappRiver).navigations;
10
+ const activeScreenData = screenData ?? useRouteScreenData;
11
+
12
+ const navigations = activeScreenData?.targetScreen
13
+ ? (activeScreenData.targetScreen as ZappRiver).navigations
14
+ : (activeScreenData as ZappRiver).navigations;
11
15
 
12
16
  const navigationMenu = navigations?.find((nav) => nav.category === "menu");
13
17
 
@@ -5,8 +5,10 @@ export enum MenuTypes {
5
5
  bottomTabBar = "BOTTOM_TAB_BAR",
6
6
  }
7
7
 
8
- export const useNavigationType = (): MenuTypes => {
9
- const navigationMenu = useNavigationPluginData();
8
+ export const useNavigationType = (navigation?: ZappNavigation): MenuTypes => {
9
+ const navigationPluginData = useNavigationPluginData();
10
+
11
+ const navigationMenu = navigation ?? navigationPluginData;
10
12
 
11
13
  return !navigationMenu ||
12
14
  navigationMenu.navigation_type === "quick_brick_side_menu"