@applicaster/zapp-react-native-utils 12.0.0-rc.25 → 12.0.0-rc.28

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 (29) hide show
  1. package/analyticsUtils/__tests__/analyticsManager.test.js +75 -73
  2. package/appUtils/keyCodes/__tests__/__snapshots__/keyCodes.test.js.snap +1 -1
  3. package/appUtils/keyCodes/__tests__/keyCodes.test.js +80 -85
  4. package/appUtils/keyCodes/keys.web.js +1 -0
  5. package/appUtils/playerManager/OverlayObserver/OverlaysObserver.ts +53 -0
  6. package/appUtils/playerManager/player.ts +12 -4
  7. package/appUtils/playerManager/playerNative.ts +26 -0
  8. package/appUtils/playerManager/usePlayerState.tsx +13 -1
  9. package/appUtils/playerManager/usePlayerTitleSummaryOverlay.tsx +50 -0
  10. package/cellUtils/__tests__/cellUtils.test.ts +59 -0
  11. package/cellUtils/__tests__/fixtures.ts +13 -0
  12. package/cellUtils/index.ts +29 -0
  13. package/functionUtils/__tests__/__snapshots__/functionUtils.test.js.snap +2 -2
  14. package/functionUtils/__tests__/functionUtils.test.js +244 -248
  15. package/localizationUtils/__tests__/localizationUtils.test.ts +17 -13
  16. package/manifestUtils/defaultManifestConfigurations/player.js +8 -0
  17. package/modalState/index.ts +57 -0
  18. package/navigationUtils/index.ts +52 -7
  19. package/package.json +3 -2
  20. package/playerUtils/configurationGenerator.ts +8 -0
  21. package/pluginUtils/index.ts +2 -2
  22. package/reactHooks/index.ts +2 -0
  23. package/reactHooks/layout/__tests__/index.test.js +22 -30
  24. package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.native.test.js +11 -16
  25. package/reactHooks/layout/useDimensions/helpers/__tests__/getInitialDimensions.test.js +12 -14
  26. package/reactHooks/navigation/__tests__/index.test.tsx +216 -75
  27. package/reactHooks/navigation/index.ts +201 -85
  28. package/reactHooks/screen/index.ts +2 -0
  29. package/screenState/index.ts +8 -0
@@ -0,0 +1,57 @@
1
+ import { create } from "zustand";
2
+
3
+ interface ModalState {
4
+ visible: boolean;
5
+ screen: any;
6
+ options: Record<string, unknown>;
7
+ props: Record<string, unknown>;
8
+ }
9
+
10
+ interface ModalStore {
11
+ modalState: ModalState;
12
+ setModalState: (newState: Partial<ModalState>) => void;
13
+ openModal: (
14
+ item: any,
15
+ options?: Record<string, unknown>,
16
+ props?: Record<string, unknown>
17
+ ) => void;
18
+ dismissModal: () => void;
19
+ }
20
+
21
+ const initialModalState: ModalState = {
22
+ visible: false,
23
+ screen: null,
24
+ options: {},
25
+ props: {},
26
+ };
27
+
28
+ export const useModalStore = create<ModalStore>((set) => ({
29
+ modalState: initialModalState,
30
+ setModalState: (newState) =>
31
+ set((state) => ({
32
+ modalState: { ...state.modalState, ...newState },
33
+ })),
34
+ openModal: ({
35
+ item,
36
+ options = {},
37
+ props = { screenData: {} },
38
+ }: OpenModalArg) =>
39
+ set({
40
+ modalState: {
41
+ visible: true,
42
+ screen: item,
43
+ options: {
44
+ animated: true,
45
+ animationType: "slide",
46
+ onShow: () => {},
47
+ presentationStyle: "overFullScreen",
48
+ transparent: true,
49
+ ...options,
50
+ onDismiss: () => set({ modalState: initialModalState }),
51
+ onRequestClose: () => set({ modalState: initialModalState }),
52
+ },
53
+ props,
54
+ },
55
+ }),
56
+ dismissModal: () => set(() => ({ modalState: initialModalState })),
57
+ }));
@@ -93,19 +93,64 @@ export function resolveNavigationPlugin({
93
93
  * @param {Object} navigator to look for navigation props
94
94
  * @param {String} category to look for in screen navigations
95
95
  * @returns {Object} props
96
+ * @deprecated use getNavigationPropsV2 instead
96
97
  */
97
98
  export function getNavigationProps({
98
- navigator: { activeRiver },
99
+ navigator,
99
100
  title = "",
100
101
  category,
101
102
  }: {
102
103
  navigator: QuickBrickAppNavigator;
103
104
  title: string;
104
105
  category: string;
105
- }): Nullable<
106
- Partial<ZappNavigation> & { selected: string; title: string; home: boolean }
107
- > {
108
- const { navigations, id: selected, home } = activeRiver;
106
+ }): {
107
+ selected: string;
108
+ title: string;
109
+ home: boolean;
110
+ styles: unknown;
111
+ assets: ZappNavBarAssets;
112
+ rules: ZappNavBarRules;
113
+ nav_items: NavBarItem[];
114
+ } | null {
115
+ const { activeRiver } = navigator;
116
+ const { navigations, id: selected, home } = activeRiver; // use useRiver hook instead
117
+ const navigation = R.find(R.propEq("category", category), navigations);
118
+
119
+ if (!navigation) {
120
+ return null;
121
+ }
122
+
123
+ const { styles, assets, nav_items, rules } = navigation;
124
+
125
+ return {
126
+ selected,
127
+ title,
128
+ home,
129
+ styles,
130
+ assets,
131
+ nav_items,
132
+ rules,
133
+ };
134
+ }
135
+
136
+ export function getNavigationPropsV2({
137
+ currentRiver,
138
+ title = "",
139
+ category,
140
+ }: {
141
+ currentRiver: ZappRiver;
142
+ title: string;
143
+ category: string;
144
+ }): {
145
+ selected: string;
146
+ title: string;
147
+ home: boolean;
148
+ styles: unknown;
149
+ assets: ZappNavBarAssets;
150
+ rules: ZappNavBarRules;
151
+ nav_items: NavBarItem[];
152
+ } | null {
153
+ const { navigations, id: selected, home } = currentRiver; // use useRiver hook instead
109
154
  const navigation = R.find(R.propEq("category", category), navigations);
110
155
 
111
156
  if (!navigation) {
@@ -170,7 +215,7 @@ export function getScreenIdForContentType(payload, contentTypes) {
170
215
  export function getItemTargetId(
171
216
  item: ZappEntry | ZappRiver,
172
217
  screenType?: string, // todo: creat screen types enum
173
- contentTypes?: ZappContentTypes,
218
+ contentTypes?: ZappContentTypes | null,
174
219
  rivers?: Record<string, ZappRiver>
175
220
  ) {
176
221
  // Pipes v2 resolution
@@ -217,7 +262,7 @@ export function getTargetRoute(
217
262
  layoutVersion = undefined,
218
263
  rivers = {},
219
264
  }: {
220
- contentTypes?: ZappContentTypes;
265
+ contentTypes?: ZappContentTypes | null;
221
266
  layoutVersion?: Maybe<ZappLayoutVersions>;
222
267
  rivers?: Record<string, ZappRiver>;
223
268
  } = {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-utils",
3
- "version": "12.0.0-rc.25",
3
+ "version": "12.0.0-rc.28",
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-rc.25",
31
+ "@applicaster/applicaster-types": "12.0.0-rc.28",
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
+ "validate-color": "*",
47
48
  "zustand": "*"
48
49
  },
49
50
  "devDependencies": {
@@ -46,6 +46,14 @@ function getPlayerConfiguration({ platform }) {
46
46
  label_tooltip:
47
47
  "Enable if you want to have adaptive background gradient based on audio background image.",
48
48
  },
49
+ {
50
+ key: "audio_player_background_image_query",
51
+ label: "Audio Player Image Query",
52
+ initial_value: "",
53
+ type: "text_input",
54
+ label_tooltip:
55
+ "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.",
56
+ },
49
57
  ],
50
58
  };
51
59
 
@@ -20,14 +20,14 @@ type Plugin = {
20
20
  * returns the component module for a specific type
21
21
  * Will look in components first, then in plugins
22
22
  */
23
- function getComponentModule({
23
+ export function getComponentModule({
24
24
  componentType,
25
25
  components,
26
26
  plugins,
27
27
  }: {
28
28
  componentType: string;
29
29
  components: ComponentsMap;
30
- plugins: Plugin[];
30
+ plugins: Plugin[] | QuickBrickPlugin[];
31
31
  }) {
32
32
  const component = R.compose(
33
33
  R.prop(R.__, components),
@@ -13,3 +13,5 @@ export * from "./navigation";
13
13
  export * from "./device";
14
14
 
15
15
  export * from "./screen";
16
+
17
+ export * from "./state";
@@ -1,5 +1,7 @@
1
1
  import { cleanup, renderHook } from "@testing-library/react-hooks";
2
2
 
3
+ import * as ReactNative from "react-native";
4
+
3
5
  const mocked_return_value = (tv) => ({
4
6
  screen: tv
5
7
  ? { width: 50, height: 50, scale: 2, fontScale: 1 }
@@ -10,41 +12,31 @@ const mocked_return_value = (tv) => ({
10
12
  const platform = "android";
11
13
  let tv_flag = false;
12
14
 
13
- jest.mock("react-native-safe-area-context", () => ({
14
- useSafeAreaInsets: () => ({ top: 50 }),
15
- }));
15
+ ReactNative.Dimensions.get = jest.fn(
16
+ (context) => mocked_return_value(tv_flag)[context]
17
+ );
16
18
 
17
19
  const mockRemoveFn = jest.fn();
18
20
 
19
- jest.mock("react-native", () => {
20
- const RNMock = jest.genMockFromModule("react-native");
21
-
22
- const Dims = {
23
- get: jest.fn((context) => mocked_return_value(tv_flag)[context]),
24
- addEventListener: jest.fn().mockReturnValue({
25
- remove: mockRemoveFn,
26
- }),
27
- };
28
-
29
- const QuickBrickCommunicationModule = {
30
- initialProps: {
31
- is_tablet: false,
32
- },
33
- };
34
-
35
- return {
36
- ...RNMock,
37
- Dimensions: Dims,
38
- Platform: {
39
- OS: platform,
40
- },
41
- NativeModules: {
42
- ...RNMock.NativeModules,
43
- QuickBrickCommunicationModule,
44
- },
45
- };
21
+ ReactNative.Dimensions.addEventListener = jest.fn().mockReturnValue({
22
+ remove: mockRemoveFn,
46
23
  });
47
24
 
25
+ ReactNative.Platform.OS = platform;
26
+
27
+ const QuickBrickCommunicationModule = {
28
+ initialProps: {
29
+ is_tablet: false,
30
+ },
31
+ };
32
+
33
+ ReactNative.NativeModules.QuickBrickCommunicationModule =
34
+ QuickBrickCommunicationModule;
35
+
36
+ jest.mock("react-native-safe-area-context", () => ({
37
+ useSafeAreaInsets: () => ({ top: 50 }),
38
+ }));
39
+
48
40
  jest.mock("../../../reactUtils", () => ({
49
41
  platformSelect: jest.fn((specs) => specs[platform] || specs.default),
50
42
  isTV: jest.fn(() => tv_flag),
@@ -1,19 +1,14 @@
1
- let mockPlatformOS = "android";
1
+ import * as ReactNative from "react-native";
2
2
 
3
- jest.mock("react-native", () => {
4
- const mockDimensionsGet = jest.fn(
5
- (type) =>
6
- ({
7
- window: { width: 1, height: 1 },
8
- screen: { width: 360, height: 540 },
9
- }[type])
10
- );
3
+ const mockDimensionsGet = jest.fn(
4
+ (type) =>
5
+ ({
6
+ window: { width: 1, height: 1 },
7
+ screen: { width: 360, height: 540 },
8
+ }[type])
9
+ );
11
10
 
12
- return {
13
- Platform: jest.fn(() => ({ OS: mockPlatformOS })),
14
- Dimensions: { get: mockDimensionsGet },
15
- };
16
- });
11
+ ReactNative.Dimensions.get = mockDimensionsGet;
17
12
 
18
13
  const mockGetConstants = jest.fn().mockReturnValue({
19
14
  Dimensions: {
@@ -26,9 +21,10 @@ jest.mock("react-native/Libraries/Utilities/NativeDeviceInfo", () => ({
26
21
  getConstants: mockGetConstants,
27
22
  }));
28
23
 
29
- const { Platform, Dimensions } = require("react-native");
24
+ const { Platform, Dimensions } = ReactNative;
30
25
 
31
26
  Platform.OS = "android";
27
+
32
28
  const { getInitialDimensions } = require("../getInitialDimensions.native.ts");
33
29
 
34
30
  describe("useDimensions > helpers ( native )", () => {
@@ -48,7 +44,6 @@ describe("useDimensions > helpers ( native )", () => {
48
44
 
49
45
  it("should call NativeDeviceInfo.getConstants for ios when width === height", () => {
50
46
  Platform.OS = "ios";
51
- mockPlatformOS = "ios";
52
47
 
53
48
  jest.fn().mockReturnValue({
54
49
  Dimensions: {
@@ -1,21 +1,19 @@
1
- jest.mock("react-native", () => {
2
- const mockDimensionsGet = jest.fn(
3
- (type) =>
4
- ({
5
- window: { width: 1, height: 1 },
6
- screen: { width: 360, height: 540 },
7
- }[type])
8
- );
1
+ import * as ReactNative from "react-native";
9
2
 
10
- return {
11
- Platform: jest.fn(() => ({ OS: "web" })),
12
- Dimensions: { get: mockDimensionsGet },
13
- };
14
- });
3
+ const mockDimensionsGet = jest.fn(
4
+ (type) =>
5
+ ({
6
+ window: { width: 1, height: 1 },
7
+ screen: { width: 360, height: 540 },
8
+ }[type])
9
+ );
10
+
11
+ ReactNative.Dimensions.get = mockDimensionsGet;
15
12
 
16
- const { Platform, Dimensions } = require("react-native");
13
+ const { Platform, Dimensions } = ReactNative;
17
14
 
18
15
  Platform.OS = "web";
16
+
19
17
  const { getInitialDimensions } = require("../getInitialDimensions.ts");
20
18
 
21
19
  describe("useDimensions > helpers (web)", () => {