@applicaster/zapp-react-native-ui-components 13.0.0-rc.10 → 13.0.0-rc.12

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.
@@ -1,3 +1,4 @@
1
+ import * as React from "react";
1
2
  import { renderHook } from "@testing-library/react-hooks";
2
3
 
3
4
  import {
@@ -9,6 +10,42 @@ import {
9
10
  import * as redux from "react-redux";
10
11
  import * as layoutPresets from "@applicaster/zapp-react-native-redux/hooks/useLayoutPresets";
11
12
  import * as pipesFeeds from "@applicaster/zapp-react-native-redux/hooks/useZappPipesFeeds";
13
+ import { NavigationContext } from "@applicaster/zapp-react-native-ui-components/Contexts/NavigationContext";
14
+ import { PathnameContext } from "@applicaster/zapp-react-native-ui-components/Contexts/PathnameContext";
15
+
16
+ import { Provider } from "react-redux";
17
+ import configureStore from "redux-mock-store";
18
+
19
+ const homeStack = {
20
+ route: "/home",
21
+ state: {
22
+ screen: { id: "123" },
23
+ entry: { id: "abc" },
24
+ },
25
+ };
26
+
27
+ const mainStackNavigator = {
28
+ getStackForPathname: jest.fn().mockReturnValue(homeStack),
29
+ modalState: {
30
+ screen: {
31
+ id: "modal-1",
32
+ },
33
+ },
34
+ };
35
+
36
+ const store = configureStore()({});
37
+
38
+ const wrapper = ({ children }) => (
39
+ <Provider store={store}>
40
+ <NavigationContext.Provider
41
+ value={{ ...mainStackNavigator, currentRoute: homeStack.route }}
42
+ >
43
+ <PathnameContext.Provider value={homeStack.route}>
44
+ {children}
45
+ </PathnameContext.Provider>
46
+ </NavigationContext.Provider>
47
+ </Provider>
48
+ );
12
49
 
13
50
  describe("getTransformedPreset should return the passed components if smartComponents is empty", () => {
14
51
  describe("getTransformedPreset function", () => {
@@ -94,9 +131,13 @@ describe("getTransformedPreset should return the passed components if smartCompo
94
131
  },
95
132
  };
96
133
 
134
+ const mockUrlsMap = {
135
+ [mockSmartComp.id]: mockSmartComp.data.source,
136
+ };
137
+
97
138
  it("should return the component itself if its component_type is not SMART_COMPONENT_TYPE", () => {
98
139
  expect(
99
- enrichComponent(mockComp, 0, mockFeeds, mockLayoutPresets)
140
+ enrichComponent(mockComp, 0, mockFeeds, mockLayoutPresets, mockUrlsMap)
100
141
  ).toEqual([mockComp]);
101
142
  });
102
143
 
@@ -106,8 +147,18 @@ describe("getTransformedPreset should return the passed components if smartCompo
106
147
  data: { source: "missing_source" },
107
148
  };
108
149
 
150
+ const missing_source_urls_map = {
151
+ [missing_source_comp.id]: missing_source_comp.data.source,
152
+ };
153
+
109
154
  expect(
110
- enrichComponent(missing_source_comp, 0, mockFeeds, mockLayoutPresets)
155
+ enrichComponent(
156
+ missing_source_comp,
157
+ 0,
158
+ mockFeeds,
159
+ mockLayoutPresets,
160
+ missing_source_urls_map
161
+ )
111
162
  ).toEqual(null);
112
163
  });
113
164
 
@@ -116,7 +167,8 @@ describe("getTransformedPreset should return the passed components if smartCompo
116
167
  mockSmartComp,
117
168
  0,
118
169
  mockFeeds,
119
- mockLayoutPresets
170
+ mockLayoutPresets,
171
+ mockUrlsMap
120
172
  );
121
173
 
122
174
  expect(Array.isArray(result)).toBe(true);
@@ -262,7 +314,9 @@ describe("getTransformedPreset should return the passed components if smartCompo
262
314
 
263
315
  mockUseLayoutPresets.mockReturnValue({});
264
316
 
265
- const { result } = renderHook(() => useCurationAPI(mockComponents));
317
+ const { result } = renderHook(() => useCurationAPI(mockComponents), {
318
+ wrapper,
319
+ });
266
320
 
267
321
  // if there are no smart components, it should return the original array
268
322
  expect(result.current).toEqual(mockComponents);
@@ -313,7 +367,9 @@ describe("getTransformedPreset should return the passed components if smartCompo
313
367
 
314
368
  mockUseLayoutPresets.mockReturnValue(mockLayoutPresets);
315
369
 
316
- const { result } = renderHook(() => useCurationAPI(mockComponents));
370
+ const { result } = renderHook(() => useCurationAPI(mockComponents), {
371
+ wrapper,
372
+ });
317
373
 
318
374
  expect(result.current).toEqual(mockTransformedComponents);
319
375
  });
@@ -383,7 +439,9 @@ describe("getTransformedPreset should return the passed components if smartCompo
383
439
 
384
440
  mockUseLayoutPresets.mockReturnValue(mockLayoutPresets);
385
441
 
386
- const { result } = renderHook(() => useCurationAPI(mockComponents));
442
+ const { result } = renderHook(() => useCurationAPI(mockComponents), {
443
+ wrapper,
444
+ });
387
445
 
388
446
  expect(result.current).toEqual(mockTransformedComponents);
389
447
  });
@@ -434,7 +492,9 @@ describe("getTransformedPreset should return the passed components if smartCompo
434
492
  const mockUseLayoutPresets = jest.spyOn(layoutPresets, "useLayoutPresets");
435
493
  mockUseLayoutPresets.mockReturnValue(mockLayoutPresets);
436
494
 
437
- const { result } = renderHook(() => useCurationAPI(mockComponents));
495
+ const { result } = renderHook(() => useCurationAPI(mockComponents), {
496
+ wrapper,
497
+ });
438
498
 
439
499
  expect(result.current).toEqual(mockTransformedComponents);
440
500
  });
@@ -9,6 +9,18 @@ import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
9
9
  import { isEmptyOrNil } from "@applicaster/zapp-react-native-utils/cellUtils";
10
10
  import { Categories } from "./logger";
11
11
  import { createLogger } from "@applicaster/zapp-react-native-utils/logger";
12
+ import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
13
+ import {
14
+ ZappPipesEntryContext,
15
+ ZappPipesScreenContext,
16
+ ZappPipesSearchContext,
17
+ } from "@applicaster/zapp-react-native-ui-components/Contexts";
18
+
19
+ import {
20
+ getInflatedDataSourceUrl,
21
+ getSearchContext,
22
+ } from "@applicaster/zapp-react-native-utils/reactHooks/feed/useInflatedUrl";
23
+
12
24
  import { produce } from "immer";
13
25
  // types reference
14
26
 
@@ -20,6 +32,7 @@ type LayoutPresets = PresetsMapping["presets_mappings"];
20
32
 
21
33
  const SMART_COMPONENT_TYPE = "quick-brick-smart-component";
22
34
  const SOURCE_PATH = ["data", "source"];
35
+ const MAPPING_PATH = ["data", "mapping"];
23
36
 
24
37
  const isSmartComponent = (component) =>
25
38
  component.component_type === SMART_COMPONENT_TYPE;
@@ -58,13 +71,14 @@ export const enrichComponent = (
58
71
  comp: ZappUIComponent,
59
72
  index: number,
60
73
  feeds: Feeds,
61
- layoutPresets: LayoutPresets
74
+ layoutPresets: LayoutPresets,
75
+ urlsMap: { [key: string]: string }
62
76
  ): ZappUIComponent[] | null => {
63
77
  if (!isSmartComponent(comp)) {
64
78
  return [comp];
65
79
  }
66
80
 
67
- const presets = prop<string[]>(path(SOURCE_PATH, comp), feeds);
81
+ const presets = prop<string[]>(urlsMap[comp.id], feeds);
68
82
 
69
83
  if (presets && presets.data && presets.data.entry) {
70
84
  return presets.data.entry
@@ -113,11 +127,35 @@ export const useCurationAPI = (
113
127
  [components]
114
128
  );
115
129
 
116
- const urls = useMemo<string[]>(
117
- () =>
118
- smartComponents?.map?.((component) => path(SOURCE_PATH, component)) ?? [],
119
- [smartComponents]
120
- );
130
+ const { pathname } = useRoute();
131
+ const [entryContext] = ZappPipesEntryContext.useZappPipesContext(pathname);
132
+ const [searchContext] = ZappPipesSearchContext.useZappPipesContext();
133
+ const [screenContext] = ZappPipesScreenContext.useZappPipesContext();
134
+
135
+ const urlsMap = useMemo<{ [key: string]: string }>(() => {
136
+ const map = {};
137
+
138
+ smartComponents?.forEach?.((component) => {
139
+ const url = path(SOURCE_PATH, component);
140
+ const mapping = path(MAPPING_PATH, component);
141
+
142
+ map[component.id] = mapping
143
+ ? getInflatedDataSourceUrl({
144
+ source: url,
145
+ contexts: {
146
+ entry: entryContext,
147
+ screen: screenContext,
148
+ search: getSearchContext(searchContext, mapping),
149
+ },
150
+ mapping,
151
+ })
152
+ : url;
153
+ });
154
+
155
+ return map;
156
+ }, [smartComponents, entryContext, screenContext, searchContext]);
157
+
158
+ const urls = useMemo<string[]>(() => Object.values(urlsMap), [urlsMap]);
121
159
 
122
160
  useEffect(() => {
123
161
  urls.forEach((url, index) => {
@@ -138,11 +176,17 @@ export const useCurationAPI = (
138
176
  if (!components) return [];
139
177
 
140
178
  return components.reduce((acc, comp, index) => {
141
- const enrichedComp = enrichComponent(comp, index, feeds, layoutPresets);
179
+ const enrichedComp = enrichComponent(
180
+ comp,
181
+ index,
182
+ feeds,
183
+ layoutPresets,
184
+ urlsMap
185
+ );
142
186
 
143
187
  return enrichedComp ? [...acc, ...enrichedComp] : acc;
144
188
  }, [] as Array<ZappUIComponent>);
145
- }, [components, feeds, layoutPresets]);
189
+ }, [components, feeds, layoutPresets, urlsMap]);
146
190
 
147
191
  return getFinalComponents(
148
192
  enrichedComponents,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-ui-components",
3
- "version": "13.0.0-rc.10",
3
+ "version": "13.0.0-rc.12",
4
4
  "description": "Applicaster Zapp React Native ui components for the Quick Brick App",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -34,10 +34,10 @@
34
34
  "redux-mock-store": "^1.5.3"
35
35
  },
36
36
  "dependencies": {
37
- "@applicaster/applicaster-types": "13.0.0-rc.10",
38
- "@applicaster/zapp-react-native-bridge": "13.0.0-rc.10",
39
- "@applicaster/zapp-react-native-redux": "13.0.0-rc.10",
40
- "@applicaster/zapp-react-native-utils": "13.0.0-rc.10",
37
+ "@applicaster/applicaster-types": "13.0.0-rc.12",
38
+ "@applicaster/zapp-react-native-bridge": "13.0.0-rc.12",
39
+ "@applicaster/zapp-react-native-redux": "13.0.0-rc.12",
40
+ "@applicaster/zapp-react-native-utils": "13.0.0-rc.12",
41
41
  "promise": "^8.3.0",
42
42
  "react-router-native": "^5.1.2",
43
43
  "url": "^0.11.0",