@applicaster/zapp-react-native-ui-components 14.0.0-alpha.5114565431 → 14.0.0-alpha.5203410334

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 (50) hide show
  1. package/Components/BaseFocusable/index.tsx +23 -12
  2. package/Components/Cell/__tests__/CellWIthFocusable.test.js +3 -2
  3. package/Components/Cell/index.js +1 -1
  4. package/Components/ComponentResolver/index.ts +1 -1
  5. package/Components/FeedLoader/FeedLoader.tsx +6 -15
  6. package/Components/FeedLoader/FeedLoaderHOC.tsx +21 -0
  7. package/Components/FeedLoader/index.js +2 -8
  8. package/Components/FreezeWithCallback/__tests__/index.test.tsx +67 -43
  9. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +42 -59
  10. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +13 -10
  11. package/Components/Layout/TV/LayoutBackground.tsx +1 -1
  12. package/Components/Layout/TV/__tests__/index.test.tsx +0 -1
  13. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +2 -0
  14. package/Components/MasterCell/DefaultComponents/Button.tsx +1 -1
  15. package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +1 -1
  16. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +10 -10
  17. package/Components/MasterCell/DefaultComponents/__tests__/text.test.tsx +18 -18
  18. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/index.test.tsx +10 -10
  19. package/Components/MasterCell/utils/behaviorProvider.ts +82 -14
  20. package/Components/MasterCell/utils/index.ts +11 -5
  21. package/Components/OfflineHandler/__tests__/index.test.tsx +26 -35
  22. package/Components/PlayerContainer/ErrorDisplay/index.ts +1 -1
  23. package/Components/PlayerContainer/ProgramInfo/index.tsx +1 -1
  24. package/Components/PlayerContainer/index.ts +1 -1
  25. package/Components/River/ComponentsMap/hooks/__tests__/useLoadingState.test.ts +378 -0
  26. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +2 -2
  27. package/Components/River/RefreshControl.tsx +11 -17
  28. package/Components/River/__tests__/river.test.js +12 -26
  29. package/Components/River/index.tsx +1 -1
  30. package/Components/Screen/__tests__/Screen.test.tsx +28 -29
  31. package/Components/Tabs/Tabs.tsx +2 -3
  32. package/Components/Touchable/__tests__/touchable.test.tsx +12 -17
  33. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +3 -9
  34. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +5 -5
  35. package/Contexts/ConfigutaionContext/__tests__/ConfigurationProvider.test.tsx +3 -3
  36. package/Contexts/ScreenContext/index.tsx +46 -6
  37. package/Decorators/ConfigurationWrapper/__tests__/withConfigurationProvider.test.tsx +3 -3
  38. package/Decorators/RiverFeedLoader/__tests__/__snapshots__/riverFeedLoader.test.tsx.snap +221 -209
  39. package/Decorators/RiverFeedLoader/__tests__/riverFeedLoader.test.tsx +14 -16
  40. package/Decorators/RiverFeedLoader/__tests__/utils.test.ts +0 -20
  41. package/Decorators/RiverFeedLoader/index.tsx +22 -4
  42. package/Decorators/RiverFeedLoader/utils/index.ts +0 -18
  43. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +3 -6
  44. package/Decorators/ZappPipesDataConnector/__tests__/UrlFeedResolver.test.tsx +27 -27
  45. package/Decorators/ZappPipesDataConnector/resolvers/UrlFeedResolver.tsx +35 -10
  46. package/Decorators/ZappPipesDataConnector/utils/mongoFilter.ts +738 -0
  47. package/Decorators/ZappPipesDataConnector/utils/useFilter.tsx +157 -0
  48. package/events/index.ts +1 -0
  49. package/package.json +5 -6
  50. package/Components/River/__tests__/__snapshots__/river.test.js.snap +0 -27
@@ -0,0 +1,157 @@
1
+ import React, { useCallback, useEffect } from "react";
2
+
3
+ import { filterObjects } from "./mongoFilter";
4
+ import { getNamespaceAndKey } from "@applicaster/zapp-react-native-utils/appUtils/contextKeysManager/utils";
5
+ import { localStorage } from "@applicaster/zapp-react-native-bridge/ZappStorage/LocalStorage";
6
+ import { sessionStorage } from "@applicaster/zapp-react-native-bridge/ZappStorage/SessionStorage";
7
+
8
+ import {
9
+ extractAtValues,
10
+ resolveObjectValues,
11
+ } from "@applicaster/zapp-react-native-utils/appUtils/contextKeysManager/contextResolver";
12
+ import { createLogger } from "@applicaster/zapp-react-native-utils/logger";
13
+ import { ScreenSingleValueProvider } from "@applicaster/zapp-react-native-utils/storage/ScreenSingleValueProvider";
14
+ import { useScreenStateStore } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useScreenStateStore";
15
+ import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks";
16
+ import { useScreenResolvers } from "@applicaster/zapp-react-native-utils/actionsExecutor/screenResolver";
17
+
18
+ const { log_debug, log_error } = createLogger({
19
+ subsystem: "General",
20
+ category: "UseFilter",
21
+ });
22
+
23
+ export const useFilter: (
24
+ zappPipesData: ZappPipesData,
25
+ _component // In future filter will come from the component
26
+ ) => (zappPipesData: ZappPipesData) => ZappPipesData = (
27
+ zappPipesData: ZappPipesData,
28
+ _component
29
+ ) => {
30
+ const { pathname } = useRoute();
31
+ const screenStateStore = useScreenStateStore();
32
+ const [filter, setFilter] = React.useState(null);
33
+ const [inflatedFilter, setInflatedFilter] = React.useState(null);
34
+ const screenResolvers = useScreenResolvers();
35
+
36
+ useEffect(() => {
37
+ if (!filter) {
38
+ setInflatedFilter(null);
39
+
40
+ return;
41
+ }
42
+
43
+ const atValues = extractAtValues(filter);
44
+
45
+ log_debug("Extracted @ values from filter", { atValues });
46
+
47
+ if (!atValues.length) {
48
+ // no dynamic values - can apply right now
49
+ setInflatedFilter(filter);
50
+ } else {
51
+ const rebuildFilter = () =>
52
+ resolveObjectValues(filter, screenResolvers)
53
+ .then((resolvedFilter) => {
54
+ log_debug("Resolved filter values", { resolvedFilter });
55
+ setInflatedFilter(resolvedFilter);
56
+ })
57
+ .catch((error) => {
58
+ log_error(`Error resolving filter values: ${error.message}`);
59
+ setInflatedFilter(null);
60
+ });
61
+
62
+ rebuildFilter(); // have dynamic values - need to resolve before applying
63
+
64
+ // subscribe for future changes of dynamic values
65
+ const screenSubscriptions: (() => void)[] = atValues
66
+ .filter((data) => data.startsWith("screen/"))
67
+ .map((data: string) => {
68
+ const keyName = data.replace("screen/", "");
69
+
70
+ const provider = ScreenSingleValueProvider.getProvider(
71
+ keyName,
72
+ pathname,
73
+ screenStateStore
74
+ );
75
+
76
+ const subscription = provider.getObservable().subscribe((value) => {
77
+ if (value !== undefined) {
78
+ rebuildFilter();
79
+ }
80
+ });
81
+
82
+ return () => subscription.unsubscribe();
83
+ });
84
+
85
+ const storageSubscriptions: (() => void)[] = atValues
86
+ .filter((data) => !data.startsWith("screen/"))
87
+ .flatMap((data: string) => {
88
+ const keyName = data.replace("ctx/", "");
89
+ const { namespace, key } = getNamespaceAndKey(keyName);
90
+
91
+ return [
92
+ localStorage.addListener({ key, namespace }, rebuildFilter),
93
+ sessionStorage.addListener({ key, namespace }, rebuildFilter),
94
+ ];
95
+ });
96
+
97
+ const subscriptions = [...screenSubscriptions, ...storageSubscriptions];
98
+
99
+ return () => subscriptions.forEach((listener) => listener());
100
+ }
101
+ }, [filter]);
102
+
103
+ const filterFunc = useCallback(
104
+ (zappPipesData: ZappPipesData) => {
105
+ const { data } = zappPipesData;
106
+
107
+ if (!data || !data.entry) {
108
+ return zappPipesData;
109
+ }
110
+
111
+ const noResultBehavior =
112
+ data?.extensions?.filter?.no_result_behavior || "show_nothing";
113
+
114
+ const filterExpression = data?.extensions?.filter?.expression;
115
+
116
+ if (filterExpression) {
117
+ setFilter(filterExpression);
118
+
119
+ // if there is a filter, but it is not inflated yet,
120
+ // and the behavior is "show_nothing" - return no results
121
+ if (noResultBehavior === "show_nothing" && !inflatedFilter) {
122
+ return {
123
+ ...zappPipesData,
124
+ data: { ...data, entry: [] },
125
+ } as ZappPipesData;
126
+ }
127
+ }
128
+
129
+ if (!inflatedFilter) {
130
+ return zappPipesData;
131
+ }
132
+
133
+ log_debug("Applying filter to data", { filter, inflatedFilter });
134
+
135
+ const filteredEntries = filterObjects(data.entry, inflatedFilter);
136
+
137
+ if (!filteredEntries.length && noResultBehavior === "show_all") {
138
+ return zappPipesData;
139
+ }
140
+
141
+ return {
142
+ ...zappPipesData,
143
+ data: {
144
+ ...data,
145
+ entry: filteredEntries,
146
+ },
147
+ } as ZappPipesData;
148
+ },
149
+ [inflatedFilter, setFilter]
150
+ );
151
+
152
+ if (!zappPipesData || !zappPipesData.data) {
153
+ return (zappPipesData) => zappPipesData;
154
+ }
155
+
156
+ return filterFunc;
157
+ };
package/events/index.ts CHANGED
@@ -2,4 +2,5 @@ export enum QBUIComponentEvents {
2
2
  toggleGradient = "toggleGradient",
3
3
  topMenuBarTV_onFocus = "topMenuBarTV_onFocus",
4
4
  navigatorReplaceItem = "navigatorReplaceItem",
5
+ scrollVerticallyToInitialOffset = "scrollVerticallyToInitialOffset",
5
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/zapp-react-native-ui-components",
3
- "version": "14.0.0-alpha.5114565431",
3
+ "version": "14.0.0-alpha.5203410334",
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",
@@ -28,10 +28,10 @@
28
28
  },
29
29
  "homepage": "https://github.com/applicaster/quickbrick#readme",
30
30
  "dependencies": {
31
- "@applicaster/applicaster-types": "14.0.0-alpha.5114565431",
32
- "@applicaster/zapp-react-native-bridge": "14.0.0-alpha.5114565431",
33
- "@applicaster/zapp-react-native-redux": "14.0.0-alpha.5114565431",
34
- "@applicaster/zapp-react-native-utils": "14.0.0-alpha.5114565431",
31
+ "@applicaster/applicaster-types": "14.0.0-alpha.5203410334",
32
+ "@applicaster/zapp-react-native-bridge": "14.0.0-alpha.5203410334",
33
+ "@applicaster/zapp-react-native-redux": "14.0.0-alpha.5203410334",
34
+ "@applicaster/zapp-react-native-utils": "14.0.0-alpha.5203410334",
35
35
  "promise": "^8.3.0",
36
36
  "url": "^0.11.0",
37
37
  "uuid": "^3.3.2"
@@ -39,7 +39,6 @@
39
39
  "peerDependencies": {
40
40
  "@applicaster/zapp-pipes-v2-client": "*",
41
41
  "@react-native-community/netinfo": "*",
42
- "immer": "*",
43
42
  "react": "*",
44
43
  "react-native": "*",
45
44
  "react-native-svg": "*",
@@ -1,27 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`When River has a general_content type renders River component correctly 1`] = `
4
- <View
5
- onLayout={[Function]}
6
- style={
7
- {
8
- "flex": 1,
9
- }
10
- }
11
- testID="on-layout-view"
12
- >
13
- <View
14
- style={
15
- {
16
- "display": "none",
17
- "flex": 1,
18
- }
19
- }
20
- >
21
- <View
22
- screenId="A1234"
23
- testID="general-content-screen"
24
- />
25
- </View>
26
- </View>
27
- `;