@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.
- package/Components/BaseFocusable/index.tsx +23 -12
- package/Components/Cell/__tests__/CellWIthFocusable.test.js +3 -2
- package/Components/Cell/index.js +1 -1
- package/Components/ComponentResolver/index.ts +1 -1
- package/Components/FeedLoader/FeedLoader.tsx +6 -15
- package/Components/FeedLoader/FeedLoaderHOC.tsx +21 -0
- package/Components/FeedLoader/index.js +2 -8
- package/Components/FreezeWithCallback/__tests__/index.test.tsx +67 -43
- package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +42 -59
- package/Components/GeneralContentScreen/utils/useCurationAPI.ts +13 -10
- package/Components/Layout/TV/LayoutBackground.tsx +1 -1
- package/Components/Layout/TV/__tests__/index.test.tsx +0 -1
- package/Components/MasterCell/DefaultComponents/ActionButton.tsx +2 -0
- package/Components/MasterCell/DefaultComponents/Button.tsx +1 -1
- package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +1 -1
- package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +10 -10
- package/Components/MasterCell/DefaultComponents/__tests__/text.test.tsx +18 -18
- package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/index.test.tsx +10 -10
- package/Components/MasterCell/utils/behaviorProvider.ts +82 -14
- package/Components/MasterCell/utils/index.ts +11 -5
- package/Components/OfflineHandler/__tests__/index.test.tsx +26 -35
- package/Components/PlayerContainer/ErrorDisplay/index.ts +1 -1
- package/Components/PlayerContainer/ProgramInfo/index.tsx +1 -1
- package/Components/PlayerContainer/index.ts +1 -1
- package/Components/River/ComponentsMap/hooks/__tests__/useLoadingState.test.ts +378 -0
- package/Components/River/ComponentsMap/hooks/useLoadingState.ts +2 -2
- package/Components/River/RefreshControl.tsx +11 -17
- package/Components/River/__tests__/river.test.js +12 -26
- package/Components/River/index.tsx +1 -1
- package/Components/Screen/__tests__/Screen.test.tsx +28 -29
- package/Components/Tabs/Tabs.tsx +2 -3
- package/Components/Touchable/__tests__/touchable.test.tsx +12 -17
- package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +3 -9
- package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +5 -5
- package/Contexts/ConfigutaionContext/__tests__/ConfigurationProvider.test.tsx +3 -3
- package/Contexts/ScreenContext/index.tsx +46 -6
- package/Decorators/ConfigurationWrapper/__tests__/withConfigurationProvider.test.tsx +3 -3
- package/Decorators/RiverFeedLoader/__tests__/__snapshots__/riverFeedLoader.test.tsx.snap +221 -209
- package/Decorators/RiverFeedLoader/__tests__/riverFeedLoader.test.tsx +14 -16
- package/Decorators/RiverFeedLoader/__tests__/utils.test.ts +0 -20
- package/Decorators/RiverFeedLoader/index.tsx +22 -4
- package/Decorators/RiverFeedLoader/utils/index.ts +0 -18
- package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +3 -6
- package/Decorators/ZappPipesDataConnector/__tests__/UrlFeedResolver.test.tsx +27 -27
- package/Decorators/ZappPipesDataConnector/resolvers/UrlFeedResolver.tsx +35 -10
- package/Decorators/ZappPipesDataConnector/utils/mongoFilter.ts +738 -0
- package/Decorators/ZappPipesDataConnector/utils/useFilter.tsx +157 -0
- package/events/index.ts +1 -0
- package/package.json +5 -6
- 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
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.
|
|
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.
|
|
32
|
-
"@applicaster/zapp-react-native-bridge": "14.0.0-alpha.
|
|
33
|
-
"@applicaster/zapp-react-native-redux": "14.0.0-alpha.
|
|
34
|
-
"@applicaster/zapp-react-native-utils": "14.0.0-alpha.
|
|
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
|
-
`;
|