@applicaster/zapp-react-native-utils 12.0.0-alpha.7254207052 → 12.0.0-alpha.7303454980

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 (93) hide show
  1. package/analyticsUtils/AnalyticPlayerListener.ts +141 -0
  2. package/analyticsUtils/AnalyticsEvents/index.ts +13 -0
  3. package/analyticsUtils/AnalyticsEvents/searchEvents.ts +21 -0
  4. package/analyticsUtils/AnalyticsEvents/sendShareEvent.ts +21 -0
  5. package/analyticsUtils/PlayerAnalyticsManager.ts +90 -0
  6. package/analyticsUtils/analyticsPlugins.ts +25 -0
  7. package/analyticsUtils/events.ts +12 -0
  8. package/analyticsUtils/index.tsx +12 -0
  9. package/analyticsUtils/{analyticsTracker.ts → playerAnalyticsTracker.ts} +19 -10
  10. package/appUtils/accessibilityManager/const.ts +50 -0
  11. package/appUtils/accessibilityManager/hooks.ts +40 -0
  12. package/appUtils/accessibilityManager/index.ts +166 -0
  13. package/appUtils/accessibilityManager/logger.ts +5 -0
  14. package/appUtils/focusManager/__tests__/__snapshots__/focusManager.test.js.snap +2 -3
  15. package/appUtils/focusManager/__tests__/focusManager.test.js +4 -24
  16. package/appUtils/focusManager/__tests__/index.test.ts +2 -3
  17. package/appUtils/focusManager/index.ts +76 -57
  18. package/appUtils/focusManager/treeDataStructure/Utils/index.js +75 -44
  19. package/appUtils/focusManager/utils/index.ts +100 -0
  20. package/appUtils/focusManagerAux/index.ts +76 -0
  21. package/appUtils/focusManagerAux/utils/index.ts +100 -0
  22. package/appUtils/index.js +2 -0
  23. package/appUtils/keyCodes/keys.web.js +8 -0
  24. package/appUtils/keyCodes/keysByPlatform.js +11 -1
  25. package/appUtils/platform/const.ts +25 -0
  26. package/appUtils/platform/index.ts +3 -0
  27. package/appUtils/platform/platformUtils.ts +217 -0
  28. package/appUtils/playerManager/conts.ts +1 -0
  29. package/appUtils/playerManager/index.ts +20 -32
  30. package/appUtils/playerManager/nativePlayerManager.ts +12 -0
  31. package/appUtils/playerManager/player.ts +10 -3
  32. package/appUtils/playerManager/playerHooks/usePlayerCurrentTime.tsx +57 -0
  33. package/appUtils/playerManager/playerNative.ts +11 -15
  34. package/appUtils/playerManager/usePlayerControllerSetup.tsx +8 -2
  35. package/appUtils/playerManager/usePlayerState.tsx +19 -34
  36. package/arrayUtils/__tests__/isFilledArray.test.ts +63 -0
  37. package/arrayUtils/index.ts +5 -0
  38. package/booleanUtils/index.ts +4 -4
  39. package/cellUtils/__tests__/cellUtils.test.ts +9 -20
  40. package/cellUtils/index.ts +44 -17
  41. package/dateUtils/index.ts +11 -0
  42. package/functionUtils/index.ts +38 -0
  43. package/headersUtils/index.ts +1 -0
  44. package/index.d.ts +15 -0
  45. package/inflatedUrlUtils/index.ts +4 -4
  46. package/keyboardState/index.ts +0 -0
  47. package/localizationUtils/__tests__/localizationUtils.test.ts +72 -53
  48. package/localizationUtils/index.ts +13 -22
  49. package/manifestUtils/defaultManifestConfigurations/generalContent.js +6 -0
  50. package/manifestUtils/defaultManifestConfigurations/player.js +121 -0
  51. package/manifestUtils/keys.js +2 -1
  52. package/navigationUtils/index.ts +48 -0
  53. package/numberUtils/__tests__/isLikeNumber.test.ts +18 -0
  54. package/numberUtils/__tests__/toNumber.test.ts +2 -2
  55. package/numberUtils/index.ts +25 -17
  56. package/package.json +2 -2
  57. package/playerUtils/configurationGenerator.ts +120 -0
  58. package/playerUtils/imaScriptDom.ts +59 -0
  59. package/pluginUtils/index.ts +9 -0
  60. package/reactHooks/autoscrolling/__tests__/{useTrackedView.test.ts → useTrackedView.test.tsx} +16 -1
  61. package/reactHooks/cell-click/__tests__/index.test.js +10 -1
  62. package/reactHooks/cell-click/index.ts +12 -12
  63. package/reactHooks/debugging/__tests__/index.test.js +81 -11
  64. package/reactHooks/feed/__tests__/useBuildPipesUrl.test.tsx +30 -70
  65. package/reactHooks/feed/__tests__/useFeedRefresh.test.tsx +6 -2
  66. package/reactHooks/feed/__tests__/useInflatedUrl.test.ts +18 -3
  67. package/reactHooks/feed/useBuildPipesUrl.ts +7 -10
  68. package/reactHooks/feed/useFeedRefresh.tsx +9 -7
  69. package/reactHooks/feed/useInflatedUrl.ts +44 -15
  70. package/reactHooks/layout/__tests__/{index.test.js → index.test.tsx} +43 -29
  71. package/reactHooks/layout/getDeviceInfo/index.ts +4 -2
  72. package/reactHooks/layout/types/index.ts +1 -0
  73. package/reactHooks/layout/useDimensions/useDimensions.ts +7 -2
  74. package/reactHooks/navigation/__mocks__/index.ts +13 -0
  75. package/reactHooks/navigation/__mocks__/useNavigation.ts +3 -0
  76. package/reactHooks/navigation/__tests__/index.test.tsx +11 -8
  77. package/reactHooks/navigation/index.ts +61 -63
  78. package/reactHooks/player/useAutoSeek.tsx +9 -7
  79. package/reactHooks/resolvers/useCellResolver.ts +5 -1
  80. package/reactHooks/screen/__tests__/useCurrentScreenData.test.tsx +21 -23
  81. package/reactHooks/screen/index.ts +2 -0
  82. package/reactHooks/screen/useScreenBackgroundColor.ts +23 -0
  83. package/reactHooks/screen/useScreenContext.ts +3 -3
  84. package/reactHooks/useConfiguration.ts +2 -2
  85. package/reactUtils/index.ts +104 -0
  86. package/screenState/index.ts +0 -8
  87. package/stringUtils/index.ts +5 -0
  88. package/testUtils/getByTestId.ts +14 -0
  89. package/testUtils/index.tsx +24 -22
  90. package/types.ts +4 -0
  91. package/appUtils/focusManager/FocusableEvents.ts +0 -8
  92. package/appUtils/focusManager/treeDataStructure/Utils/__tests__/Utils_android.test.js +0 -1094
  93. package/appUtils/focusManager/treeDataStructure/Utils/index.android.js +0 -261
@@ -1,59 +1,59 @@
1
- import * as ReactNative from "react-native";
2
-
3
- const mocked_state = {
4
- remoteConfigurations: { localizations: {} },
5
- appData: {
6
- languageCode: "en",
7
- countryCode: "US",
8
- },
9
- };
10
-
11
- let mocked_locale = ["en-US"];
12
-
13
- jest.doMock("react-redux", () => ({
14
- useSelector: jest.fn((fn) => fn(mocked_state)),
15
- }));
1
+ import { NativeModules } from "react-native";
16
2
 
17
- const SettingsManager = {
3
+ const settingsManagerMock = {
18
4
  getConstants: jest.fn(() => ({
19
- settings: { AppleLanguages: mocked_locale },
5
+ settings: { AppleLanguages: ["en-US"] },
20
6
  })),
21
7
  };
22
8
 
23
- const QuickBrickCommunicationModule = {
9
+ const qbCommunicationModuleMock = {
24
10
  languageLocale: "en",
25
11
  countryLocale: "US",
12
+ uiLanguage: "en-US",
26
13
  };
27
14
 
28
- ReactNative.NativeModules.SettingsManager = SettingsManager;
29
-
30
- ReactNative.NativeModules.QuickBrickCommunicationModule =
31
- QuickBrickCommunicationModule;
32
-
33
- const { useIsRTL } = require("../index");
15
+ NativeModules.SettingsManager = settingsManagerMock;
16
+ NativeModules.QuickBrickCommunicationModule = qbCommunicationModuleMock;
34
17
 
35
18
  describe("localizationUtils", () => {
19
+ beforeEach(() => {
20
+ jest.resetModules();
21
+ });
22
+
36
23
  describe("when the app has a single locale", () => {
37
24
  describe("when the app has only a RTL language as locale", () => {
38
25
  beforeEach(() => {
39
- mocked_state.remoteConfigurations.localizations = {
40
- he: "http://url.com",
26
+ jest.resetModules();
27
+ const RN = require("react-native");
28
+
29
+ RN.NativeModules.QuickBrickCommunicationModule = {
30
+ languageLocale: "he",
31
+ countryLocale: "IL",
32
+ uiLanguage: "he-HE",
41
33
  };
42
34
  });
43
35
 
44
36
  it("useIsRTL returns true", () => {
37
+ const { useIsRTL } = require("../index");
45
38
  expect(useIsRTL()).toBe(true);
46
39
  });
47
40
  });
48
41
 
49
42
  describe("when the app has only a LTR language as locale", () => {
50
43
  beforeEach(() => {
51
- mocked_state.remoteConfigurations.localizations = {
52
- en: "http://url.com",
44
+ jest.resetModules();
45
+
46
+ const RN = require("react-native");
47
+
48
+ RN.NativeModules.QuickBrickCommunicationModule = {
49
+ languageLocale: "en",
50
+ countryLocale: "US",
51
+ uiLanguage: "en",
53
52
  };
54
53
  });
55
54
 
56
55
  it("useIsRTL returns false", () => {
56
+ const { useIsRTL } = require("../index");
57
57
  expect(useIsRTL()).toBe(false);
58
58
  });
59
59
  });
@@ -63,45 +63,56 @@ describe("localizationUtils", () => {
63
63
  describe("when device locale is in the app's locales", () => {
64
64
  describe("when device locale is LTR", () => {
65
65
  beforeEach(() => {
66
- mocked_state.remoteConfigurations.localizations = {
67
- he: "http://url.com",
68
- en: "http://url.com",
69
- };
66
+ jest.resetModules();
67
+
68
+ const RN = require("react-native");
70
69
 
71
- mocked_locale = ["en-US"];
70
+ RN.NativeModules.QuickBrickCommunicationModule = {
71
+ languageLocale: "en",
72
+ countryLocale: "US",
73
+ uiLanguage: "en-US",
74
+ };
72
75
  });
73
76
 
74
77
  it("useIsRTL returns false", () => {
78
+ const { useIsRTL } = require("../index");
75
79
  expect(useIsRTL()).toBe(false);
76
80
  });
77
81
  });
78
82
 
79
83
  describe("when device locale is RTL", () => {
80
84
  beforeEach(() => {
81
- mocked_state.remoteConfigurations.localizations = {
82
- he: "http://url.com",
83
- en: "http://url.com",
84
- };
85
+ jest.resetModules();
86
+ const RN = require("react-native");
85
87
 
86
- mocked_locale = ["he-HE"];
88
+ RN.NativeModules.QuickBrickCommunicationModule = {
89
+ languageLocale: "he",
90
+ countryLocale: "IL",
91
+ uiLanguage: "he",
92
+ };
87
93
  });
88
94
 
89
95
  it("useIsRTL returns true", () => {
96
+ const { useIsRTL } = require("../index");
90
97
  expect(useIsRTL()).toBe(true);
91
98
  });
92
99
  });
93
100
 
94
101
  describe("when a device has a secondary language in a supported language", () => {
95
102
  beforeEach(() => {
96
- mocked_state.remoteConfigurations.localizations = {
97
- en: "http://url.com",
98
- he: "http://url.com",
99
- };
103
+ jest.resetModules();
104
+
105
+ const RN = require("react-native");
100
106
 
101
- mocked_locale = ["es-SP", "he-HE"];
107
+ RN.NativeModules.QuickBrickCommunicationModule = {
108
+ languageLocale: "he",
109
+ countryLocale: "IL",
110
+ uiLanguage: "he",
111
+ };
102
112
  });
103
113
 
104
114
  it("useIsRTL returns true", () => {
115
+ const { useIsRTL } = require("../index");
105
116
  expect(useIsRTL()).toBe(true);
106
117
  });
107
118
  });
@@ -110,30 +121,38 @@ describe("localizationUtils", () => {
110
121
  describe("when device locale is not in the app's locales", () => {
111
122
  describe("when first app locale is LTR", () => {
112
123
  beforeEach(() => {
113
- mocked_state.remoteConfigurations.localizations = {
114
- en: "http://url.com",
115
- he: "http://url.com",
116
- };
124
+ jest.resetModules();
125
+
126
+ const RN = require("react-native");
117
127
 
118
- mocked_locale = ["fr-FR"];
128
+ RN.NativeModules.QuickBrickCommunicationModule = {
129
+ languageLocale: "fr",
130
+ countryLocale: "FR",
131
+ uiLanguage: "fr-FR",
132
+ };
119
133
  });
120
134
 
121
135
  it("useIsRTL returns false", () => {
136
+ const { useIsRTL } = require("../index");
122
137
  expect(useIsRTL()).toBe(false);
123
138
  });
124
139
  });
125
140
 
126
141
  describe("when first app locale is RTL", () => {
127
142
  beforeEach(() => {
128
- mocked_state.remoteConfigurations.localizations = {
129
- he: "http://url.com",
130
- en: "http://url.com",
131
- };
143
+ jest.resetModules();
144
+
145
+ const RN = require("react-native");
132
146
 
133
- mocked_locale = ["fr-FR"];
147
+ RN.NativeModules.QuickBrickCommunicationModule = {
148
+ languageLocale: "he",
149
+ countryLocale: "HE",
150
+ uiLanguage: "he",
151
+ };
134
152
  });
135
153
 
136
154
  it("useIsRTL returns true", () => {
155
+ const { useIsRTL } = require("../index");
137
156
  expect(useIsRTL()).toBe(true);
138
157
  });
139
158
  });
@@ -1,10 +1,9 @@
1
1
  import * as R from "ramda";
2
2
  import { ViewStyle } from "react-native";
3
- import { useSelector } from "react-redux";
4
3
 
5
- import { getDeviceLocales } from "./deviceLocales";
6
4
  import { useMemo } from "react";
7
5
  import { getUILanguage } from "../appUtils/localizationsHelper";
6
+ import { utilsLogger } from "../logger";
8
7
 
9
8
  export {
10
9
  getLocale,
@@ -45,34 +44,26 @@ export function useLocalizedStrings({ localizations }) {
45
44
  return result;
46
45
  }
47
46
 
48
- function getLocaleToUse(languageCodes, localizations) {
49
- const matchingLanguages = languageCodes.filter(
50
- R.contains(R.__, localizations)
51
- );
47
+ export function getIsRTL(): boolean {
48
+ const uiLanguage = getUILanguage();
49
+
50
+ if (!uiLanguage) {
51
+ utilsLogger.error({ message: "getUILanguage returned null or undefined" });
52
52
 
53
- if (matchingLanguages?.length) {
54
- return R.head(matchingLanguages);
53
+ return false;
55
54
  }
56
55
 
57
- return R.head(localizations);
58
- }
56
+ const [languageCode] = uiLanguage.split("-");
59
57
 
60
- export function getIsRTLFromLocalizations(localizations): boolean {
61
- const deviceLocales = getDeviceLocales() || [];
62
- const localeToUse = getLocaleToUse(deviceLocales, R.keys(localizations));
58
+ const lowerCaseLanguageCode = languageCode.toLocaleLowerCase();
63
59
 
64
- return R.contains(localeToUse, RTL_LOCALES);
65
- }
60
+ const isRTL = R.contains(lowerCaseLanguageCode, RTL_LOCALES);
66
61
 
67
- const remoteConfigLocalizationSelector = R.path([
68
- "remoteConfigurations",
69
- "localizations",
70
- ]);
62
+ return isRTL;
63
+ }
71
64
 
72
65
  export function useIsRTL(): boolean {
73
- const localizations = useSelector(remoteConfigLocalizationSelector);
74
-
75
- return getIsRTLFromLocalizations(localizations);
66
+ return getIsRTL();
76
67
  }
77
68
 
78
69
  export const applyRTLStylesIfNeeded = (
@@ -245,6 +245,12 @@ const generalContent = () => ({
245
245
  ],
246
246
  initial_value: "reloading...",
247
247
  },
248
+ {
249
+ type: "text_input",
250
+ label: "Navigation Bar Screen Title",
251
+ key: "screen_title",
252
+ initial_value: null,
253
+ },
248
254
  ],
249
255
  },
250
256
  advertising: {
@@ -18,6 +18,7 @@ function getDevice(platform) {
18
18
  case "lg_tv":
19
19
  case "samsung_tv":
20
20
  case "web":
21
+ case "vizio":
21
22
  return "tv";
22
23
  }
23
24
  }
@@ -1795,6 +1796,30 @@ function getPlayerConfiguration({ platform }) {
1795
1796
  key: "menu_header_samsung_letter_spacing",
1796
1797
  initial_value: 0,
1797
1798
  },
1799
+ {
1800
+ type: "vizio_font_selector",
1801
+ label: "Vizio Font Family",
1802
+ key: "menu_header_vizio_font_family",
1803
+ initial_value: "SmsungOneUI-Bold",
1804
+ },
1805
+ {
1806
+ type: "number_input",
1807
+ label: "Vizio Font Size",
1808
+ key: "menu_header_vizio_font_size",
1809
+ initial_value: 30,
1810
+ },
1811
+ {
1812
+ type: "number_input",
1813
+ label: "Vizio Line Height",
1814
+ key: "menu_header_vizio_line_height",
1815
+ initial_value: 60,
1816
+ },
1817
+ {
1818
+ type: "number_input",
1819
+ label: "Vizio Letter Spacing",
1820
+ key: "menu_header_vizio_letter_spacing",
1821
+ initial_value: 0,
1822
+ },
1798
1823
  ]
1799
1824
  ),
1800
1825
  // Captions Menu - Item Text Label
@@ -1874,6 +1899,30 @@ function getPlayerConfiguration({ platform }) {
1874
1899
  key: "menu_item_samsung_letter_spacing",
1875
1900
  initial_value: 0,
1876
1901
  },
1902
+ {
1903
+ type: "vizio_font_selector",
1904
+ label: "Vizio Font Family",
1905
+ key: "menu_item_vizio_font_family",
1906
+ initial_value: "SmsungOneUI-Bold",
1907
+ },
1908
+ {
1909
+ type: "number_input",
1910
+ label: "Vizio Font Size",
1911
+ key: "menu_item_vizio_font_size",
1912
+ initial_value: 25,
1913
+ },
1914
+ {
1915
+ type: "number_input",
1916
+ label: "Vizio Line Height",
1917
+ key: "menu_item_vizio_line_height",
1918
+ initial_value: 40,
1919
+ },
1920
+ {
1921
+ type: "number_input",
1922
+ label: "Vizio Letter Spacing",
1923
+ key: "menu_item_vizio_letter_spacing",
1924
+ initial_value: 0,
1925
+ },
1877
1926
  ]
1878
1927
  ),
1879
1928
  // Captions Menu - Item Border
@@ -2017,6 +2066,18 @@ function getPlayerConfiguration({ platform }) {
2017
2066
  key: "samsung_tv_video_player_title_font_size",
2018
2067
  initial_value: 64,
2019
2068
  },
2069
+ {
2070
+ type: "vizio_font_selector",
2071
+ label: "Vizio Font Family",
2072
+ key: "vizio_video_player_title_font_family",
2073
+ initial_value: "Ubuntu-Bold",
2074
+ },
2075
+ {
2076
+ type: "number_input",
2077
+ label: "Vizio Font Size",
2078
+ key: "vizio_video_player_title_font_size",
2079
+ initial_value: 64,
2080
+ },
2020
2081
  {
2021
2082
  type: "tvos_font_selector",
2022
2083
  label: "tvOS Font Family",
@@ -2090,6 +2151,18 @@ function getPlayerConfiguration({ platform }) {
2090
2151
  key: "samsung_tv_video_player_summary_font_size",
2091
2152
  initial_value: 30,
2092
2153
  },
2154
+ {
2155
+ type: "vizio_font_selector",
2156
+ label: "Vizio Font Family",
2157
+ key: "vizio_video_player_summary_font_family",
2158
+ initial_value: "Ubuntu-Bold",
2159
+ },
2160
+ {
2161
+ type: "number_input",
2162
+ label: "Vizio Font Size",
2163
+ key: "vizio_video_player_summary_font_size",
2164
+ initial_value: 30,
2165
+ },
2093
2166
  {
2094
2167
  type: "tvos_font_selector",
2095
2168
  label: "tvOS Font Family",
@@ -2157,6 +2230,18 @@ function getPlayerConfiguration({ platform }) {
2157
2230
  key: "samsung_tv_audio_player_title_font_size",
2158
2231
  initial_value: 38,
2159
2232
  },
2233
+ {
2234
+ type: "vizio_font_selector",
2235
+ label: "Vizio Font Family",
2236
+ key: "vizio_tv_audio_player_title_font_family",
2237
+ initial_value: "Ubuntu-Bold",
2238
+ },
2239
+ {
2240
+ type: "number_input",
2241
+ label: "Vizio Font Size",
2242
+ key: "vizio_audio_player_title_font_size",
2243
+ initial_value: 38,
2244
+ },
2160
2245
  {
2161
2246
  type: "tvos_font_selector",
2162
2247
  label: "tvOS Font Family",
@@ -2212,6 +2297,18 @@ function getPlayerConfiguration({ platform }) {
2212
2297
  key: "samsung_tv_audio_player_summary_font_size",
2213
2298
  initial_value: 20,
2214
2299
  },
2300
+ {
2301
+ type: "vizio_font_selector",
2302
+ label: "Vizio Font Family",
2303
+ key: "vizio_audio_player_summary_font_family",
2304
+ initial_value: "Ubuntu-Bold",
2305
+ },
2306
+ {
2307
+ type: "number_input",
2308
+ label: "Vizio Font Size",
2309
+ key: "vizio_audio_player_summary_font_size",
2310
+ initial_value: 20,
2311
+ },
2215
2312
  {
2216
2313
  type: "tvos_font_selector",
2217
2314
  label: "tvOS Font Family",
@@ -2267,6 +2364,18 @@ function getPlayerConfiguration({ platform }) {
2267
2364
  key: "samsung_tv_player_time_font_size",
2268
2365
  initial_value: 20,
2269
2366
  },
2367
+ {
2368
+ type: "vizio_font_selector",
2369
+ label: "Vizio Font Family",
2370
+ key: "vizio_player_time_font_family",
2371
+ initial_value: "Ubuntu-Bold",
2372
+ },
2373
+ {
2374
+ type: "number_input",
2375
+ label: "Vizio Font Size",
2376
+ key: "vizio_player_time_font_size",
2377
+ initial_value: 20,
2378
+ },
2270
2379
  {
2271
2380
  type: "android_font_selector",
2272
2381
  label: "Android TV Font Family",
@@ -2322,6 +2431,18 @@ function getPlayerConfiguration({ platform }) {
2322
2431
  key: "samsung_tv_audio_player_run_time_font_size",
2323
2432
  initial_value: 20,
2324
2433
  },
2434
+ {
2435
+ type: "vizio_font_selector",
2436
+ label: "Vizio Font Family",
2437
+ key: "vizio_audio_player_run_time_font_family",
2438
+ initial_value: "Ubuntu-Bold",
2439
+ },
2440
+ {
2441
+ type: "number_input",
2442
+ label: "Vizio Font Size",
2443
+ key: "vizio_audio_player_run_time_font_size",
2444
+ initial_value: 20,
2445
+ },
2325
2446
  {
2326
2447
  type: "tvos_font_selector",
2327
2448
  label: "tvOS Font Family",
@@ -17,10 +17,11 @@ const ZAPPIFEST_FIELDS = {
17
17
  lg: "lg_tv_font_selector",
18
18
  samsung: "samsung_font_selector",
19
19
  roku: "roku_font_selector",
20
+ vizio: "vizio_font_selector",
20
21
  },
21
22
  };
22
23
 
23
- const TV_PLATFORMS = ["tvOS", "android", "LG", "samsung", "roku"];
24
+ const TV_PLATFORMS = ["tvOS", "android", "LG", "samsung", "roku", "vizio"];
24
25
 
25
26
  const FontPropsForTVPlatform = (platform) => ({
26
27
  [`${R.toLower(platform)}FontFamily`]: {
@@ -592,3 +592,51 @@ export function isMenuDisabled(
592
592
  export function routeIsPlayerScreen(currentRoute) {
593
593
  return currentRoute?.includes("/playable");
594
594
  }
595
+
596
+ export const getNavBarProps =
597
+ (currentRiver: ZappRiver, pathname: string, title: string) => () => {
598
+ const props = getNavigationPropsV2({
599
+ currentRiver,
600
+ title,
601
+ category: "nav_bar",
602
+ });
603
+
604
+ if (props) {
605
+ return {
606
+ ...props,
607
+ id: pathname,
608
+ pathname: pathname,
609
+ };
610
+ }
611
+
612
+ return null;
613
+ };
614
+
615
+ export const findMenuPlugin = (
616
+ navigations: ZappNavigation[],
617
+ plugins
618
+ ): QuickBrickPlugin => {
619
+ return resolveNavigationPlugin({
620
+ category: "menu",
621
+ navigations,
622
+ plugins,
623
+ }) as QuickBrickPlugin;
624
+ };
625
+
626
+ export const shouldNavBarDisplayMenu = (currentRiver: ZappRiver, plugins) =>
627
+ findMenuPlugin(currentRiver.navigations, plugins)?.identifier ===
628
+ "quick_brick_side_menu" ||
629
+ currentRiver?.navigations.findIndex(
630
+ (nav) => nav.category === "nav_bar" && nav.general?.override_menu_target
631
+ ) > -1;
632
+
633
+ export const getScreenId = (
634
+ screenData: LegacyNavigationScreenData,
635
+ fallbackRiver: ZappRiver
636
+ ) => {
637
+ return screenData?.targetScreen
638
+ ? screenData?.targetScreen?.id ?? fallbackRiver.id
639
+ : "screen_id" in screenData
640
+ ? screenData.screen_id
641
+ : fallbackRiver.id;
642
+ };
@@ -7,12 +7,24 @@ describe("isLikeNumber", () => {
7
7
  expect(isLikeNumber(value)).toBe(true);
8
8
  });
9
9
 
10
+ it("value is a number", () => {
11
+ const value = 123.45;
12
+
13
+ expect(isLikeNumber(value)).toBe(true);
14
+ });
15
+
10
16
  it("value is a string as number", () => {
11
17
  const value = "123";
12
18
 
13
19
  expect(isLikeNumber(value)).toBe(true);
14
20
  });
15
21
 
22
+ it("value is a string as number", () => {
23
+ const value = "123.45";
24
+
25
+ expect(isLikeNumber(value)).toBe(true);
26
+ });
27
+
16
28
  it("value is empty string", () => {
17
29
  const value = "";
18
30
 
@@ -54,4 +66,10 @@ describe("isLikeNumber", () => {
54
66
 
55
67
  expect(isLikeNumber(value)).toBe(false);
56
68
  });
69
+
70
+ it("NaN is not a number", () => {
71
+ const value = NaN;
72
+
73
+ expect(isLikeNumber(value)).toBe(false);
74
+ });
57
75
  });
@@ -2,7 +2,7 @@ import { toNumber } from "..";
2
2
 
3
3
  describe("toNumber", () => {
4
4
  it("return number if input is number", () => {
5
- const inputs = [-1, 0, 1, 100];
5
+ const inputs = [-1, 0, 1, 100, 0.2];
6
6
  expect.assertions(inputs.length);
7
7
 
8
8
  inputs.forEach((input) => {
@@ -12,7 +12,7 @@ describe("toNumber", () => {
12
12
  });
13
13
 
14
14
  it("return number if input is string as number", () => {
15
- const inputs = ["-1", "0", "1", "100"];
15
+ const inputs = ["-1", "0", "1", "100", "0.2"];
16
16
  expect.assertions(inputs.length);
17
17
 
18
18
  inputs.forEach((input) => {
@@ -50,28 +50,36 @@ export const toFiniteNumberWithDefault = (
50
50
  return possibleNumber;
51
51
  };
52
52
 
53
- export const isLikeNumber = (value: any): boolean => {
54
- if (R.isEmpty(value)) {
53
+ export const isLikeNumber = (value: unknown): boolean => {
54
+ const possibleNumber = toNumber(value);
55
+
56
+ if (R.isNil(possibleNumber)) {
55
57
  return false;
56
58
  }
57
59
 
58
- if (R.is(Number, value)) {
59
- return true;
60
- }
60
+ return true;
61
+ };
62
+
63
+ export const isZero = (value: unknown): boolean =>
64
+ Object.is(value, -0) || Object.is(value, 0);
61
65
 
62
- if (R.is(String, value)) {
63
- const onlyDigit = value
64
- .split("")
65
- .filter((char) =>
66
- ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"].includes(char)
67
- )
68
- .join("");
66
+ export const isMinusZero = (value: number) => {
67
+ return 1 / value === -Infinity;
68
+ };
69
69
 
70
- return value === onlyDigit;
70
+ export const toPositiveNumberWithDefault = (
71
+ defaultValue: number,
72
+ value: any
73
+ ): number => {
74
+ const possibleNumber = toNumber(value);
75
+
76
+ if (R.isNil(possibleNumber)) {
77
+ return defaultValue;
71
78
  }
72
79
 
73
- return false;
74
- };
80
+ if (possibleNumber < 0) {
81
+ return defaultValue;
82
+ }
75
83
 
76
- export const isZero = (value: unknown): boolean =>
77
- Object.is(value, -0) || Object.is(value, 0);
84
+ return possibleNumber;
85
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-utils",
3
- "version": "12.0.0-alpha.7254207052",
3
+ "version": "12.0.0-alpha.7303454980",
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": "12.0.0-alpha.7254207052",
31
+ "@applicaster/applicaster-types": "12.0.0-alpha.7303454980",
32
32
  "buffer": "^5.2.1",
33
33
  "camelize": "^1.0.0",
34
34
  "create-react-context": "^0.2.3",