@applicaster/zapp-react-native-ui-components 14.0.0-alpha.8583696651 → 14.0.0-alpha.9203091422
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/MasterCell/utils/behaviorProvider.ts +82 -14
- package/Components/MasterCell/utils/index.ts +23 -3
- package/Components/Transitioner/Scene.tsx +1 -0
- package/Decorators/RiverFeedLoader/index.tsx +8 -2
- package/Decorators/RiverFeedLoader/utils/index.ts +7 -2
- package/Decorators/ZappPipesDataConnector/index.tsx +20 -2
- package/package.json +5 -5
|
@@ -1,28 +1,58 @@
|
|
|
1
1
|
import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
|
|
2
|
-
import { StorageSingleValueProvider } from "@applicaster/zapp-react-native-
|
|
2
|
+
import { StorageSingleValueProvider } from "@applicaster/zapp-react-native-utils/storage/StorageSingleSelectProvider";
|
|
3
3
|
import { PushTopicManager } from "@applicaster/zapp-react-native-bridge/PushNotifications/PushTopicManager";
|
|
4
|
-
import { StorageMultiSelectProvider } from "@applicaster/zapp-react-native-
|
|
4
|
+
import { StorageMultiSelectProvider } from "@applicaster/zapp-react-native-utils/storage/StorageMultiSelectProvider";
|
|
5
5
|
import React, { useEffect } from "react";
|
|
6
6
|
import { usePlayer } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayer";
|
|
7
7
|
import { BehaviorSubject } from "rxjs";
|
|
8
8
|
import { masterCellLogger } from "../logger";
|
|
9
9
|
import get from "lodash/get";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
import { ScreenMultiSelectProvider } from "@applicaster/zapp-react-native-utils/storage/ScreenStateMultiSelectProvider";
|
|
11
|
+
import { ScreenSingleValueProvider } from "@applicaster/zapp-react-native-utils/storage/ScreenSingleValueProvider";
|
|
12
|
+
import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
13
|
+
import { useScreenStateStore } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useScreenStateStore";
|
|
14
|
+
|
|
15
|
+
const parseContextKey = (
|
|
16
|
+
key: string,
|
|
17
|
+
context: string = "ctx"
|
|
18
|
+
): string | null => {
|
|
19
|
+
if (!key?.startsWith(`@{${context}/`)) return null;
|
|
20
|
+
|
|
21
|
+
return key.substring(`@{${context}/`.length, key.length - 1);
|
|
15
22
|
};
|
|
16
23
|
|
|
17
24
|
const getDataSourceProvider = (
|
|
18
|
-
behavior: Behavior
|
|
25
|
+
behavior: Behavior,
|
|
26
|
+
screenRoute: string,
|
|
27
|
+
screenStateStore: ScreenStateStore
|
|
19
28
|
): BehaviorSubject<string[] | string> | null => {
|
|
20
29
|
if (!behavior) return null;
|
|
21
30
|
|
|
22
31
|
const selection = String(behavior.current_selection);
|
|
32
|
+
const screenKey = parseContextKey(selection, "screen");
|
|
33
|
+
|
|
34
|
+
if (screenKey) {
|
|
35
|
+
if (behavior.select_mode === "multi") {
|
|
36
|
+
return ScreenMultiSelectProvider.getProvider(
|
|
37
|
+
screenKey,
|
|
38
|
+
screenRoute,
|
|
39
|
+
screenStateStore
|
|
40
|
+
).getObservable();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (behavior.select_mode === "single") {
|
|
44
|
+
return ScreenSingleValueProvider.getProvider(
|
|
45
|
+
screenKey,
|
|
46
|
+
screenRoute,
|
|
47
|
+
screenStateStore
|
|
48
|
+
).getObservable();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
23
52
|
const contextKey = parseContextKey(selection);
|
|
24
53
|
|
|
25
54
|
if (contextKey) {
|
|
55
|
+
// TODO: Add storage scope to behavior
|
|
26
56
|
if (behavior.select_mode === "multi") {
|
|
27
57
|
return StorageMultiSelectProvider.getProvider(contextKey).getObservable();
|
|
28
58
|
}
|
|
@@ -41,6 +71,8 @@ const getDataSourceProvider = (
|
|
|
41
71
|
|
|
42
72
|
export const useBehaviorUpdate = (behavior: Behavior) => {
|
|
43
73
|
const [lastUpdate, setLastUpdate] = React.useState<number | null>(null);
|
|
74
|
+
const screenRoute = useRoute()?.pathname || "";
|
|
75
|
+
const screenStateStore = useScreenStateStore();
|
|
44
76
|
const player = usePlayer();
|
|
45
77
|
|
|
46
78
|
const triggerUpdate = () => setLastUpdate(Date.now());
|
|
@@ -48,7 +80,11 @@ export const useBehaviorUpdate = (behavior: Behavior) => {
|
|
|
48
80
|
useEffect(() => {
|
|
49
81
|
if (!behavior) return;
|
|
50
82
|
|
|
51
|
-
const dataSource = getDataSourceProvider(
|
|
83
|
+
const dataSource = getDataSourceProvider(
|
|
84
|
+
behavior,
|
|
85
|
+
screenRoute,
|
|
86
|
+
screenStateStore
|
|
87
|
+
);
|
|
52
88
|
|
|
53
89
|
if (dataSource) {
|
|
54
90
|
const subscription = dataSource.subscribe(triggerUpdate);
|
|
@@ -72,10 +108,17 @@ export const useBehaviorUpdate = (behavior: Behavior) => {
|
|
|
72
108
|
|
|
73
109
|
// We cant use async in this function (its inside render),
|
|
74
110
|
// so we rely on useBehaviorUpdate to update current value and trigger re-render
|
|
75
|
-
export const isCellSelected = (
|
|
76
|
-
item
|
|
77
|
-
|
|
78
|
-
|
|
111
|
+
export const isCellSelected = ({
|
|
112
|
+
item,
|
|
113
|
+
screenRoute,
|
|
114
|
+
screenStateStore,
|
|
115
|
+
behavior,
|
|
116
|
+
}: {
|
|
117
|
+
item: ZappEntry;
|
|
118
|
+
screenRoute: string;
|
|
119
|
+
screenStateStore: ScreenStateStore;
|
|
120
|
+
behavior?: Behavior;
|
|
121
|
+
}): boolean => {
|
|
79
122
|
if (!behavior) return false;
|
|
80
123
|
|
|
81
124
|
const id = behavior.selector ? get(item, behavior.selector) : item.id;
|
|
@@ -99,7 +142,32 @@ export const isCellSelected = (
|
|
|
99
142
|
}
|
|
100
143
|
|
|
101
144
|
const selection = String(behavior.current_selection);
|
|
102
|
-
|
|
145
|
+
|
|
146
|
+
const screenKey = parseContextKey(selection, "screen");
|
|
147
|
+
|
|
148
|
+
if (screenKey) {
|
|
149
|
+
if (behavior.select_mode === "single") {
|
|
150
|
+
const selectedItem = ScreenSingleValueProvider.getProvider(
|
|
151
|
+
screenKey,
|
|
152
|
+
screenRoute,
|
|
153
|
+
screenStateStore
|
|
154
|
+
).getValue();
|
|
155
|
+
|
|
156
|
+
return selectedItem === String(id);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (behavior.select_mode === "multi") {
|
|
160
|
+
const selectedItems = ScreenMultiSelectProvider.getProvider(
|
|
161
|
+
screenKey,
|
|
162
|
+
screenRoute,
|
|
163
|
+
screenStateStore
|
|
164
|
+
).getSelectedItems();
|
|
165
|
+
|
|
166
|
+
return selectedItems?.includes(String(id));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const contextKey = parseContextKey(selection, "ctx");
|
|
103
171
|
|
|
104
172
|
if (contextKey) {
|
|
105
173
|
if (behavior.select_mode === "single") {
|
|
@@ -8,6 +8,8 @@ import { masterCellLogger } from "../logger";
|
|
|
8
8
|
import { getCellState } from "../../Cell/utils";
|
|
9
9
|
import { getColorFromData } from "@applicaster/zapp-react-native-utils/cellUtils";
|
|
10
10
|
import { isCellSelected, useBehaviorUpdate } from "./behaviorProvider";
|
|
11
|
+
import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
12
|
+
import { useScreenStateStore } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useScreenStateStore";
|
|
11
13
|
|
|
12
14
|
const hasElementSpecificViewType = (viewType) => (element) => {
|
|
13
15
|
if (R.isNil(element)) {
|
|
@@ -190,8 +192,18 @@ export const getFocusedButtonId = (focusable) => {
|
|
|
190
192
|
});
|
|
191
193
|
};
|
|
192
194
|
|
|
193
|
-
export const isSelected = (
|
|
194
|
-
|
|
195
|
+
export const isSelected = ({
|
|
196
|
+
item,
|
|
197
|
+
screenRoute,
|
|
198
|
+
screenStateStore,
|
|
199
|
+
behavior,
|
|
200
|
+
}: {
|
|
201
|
+
item: ZappEntry;
|
|
202
|
+
screenRoute: string;
|
|
203
|
+
screenStateStore: ScreenStateStore;
|
|
204
|
+
behavior?: Behavior;
|
|
205
|
+
}) => {
|
|
206
|
+
return isCellSelected({ item, screenRoute, screenStateStore, behavior });
|
|
195
207
|
};
|
|
196
208
|
|
|
197
209
|
export const useCellState = ({
|
|
@@ -204,9 +216,17 @@ export const useCellState = ({
|
|
|
204
216
|
focused: boolean;
|
|
205
217
|
}): CellState => {
|
|
206
218
|
const lastUpdate = useBehaviorUpdate(behavior);
|
|
219
|
+
const router = useRoute();
|
|
220
|
+
const screenStateStore = useScreenStateStore();
|
|
207
221
|
|
|
208
222
|
const _isSelected = useMemo(
|
|
209
|
-
() =>
|
|
223
|
+
() =>
|
|
224
|
+
isSelected({
|
|
225
|
+
item,
|
|
226
|
+
screenRoute: router?.pathname,
|
|
227
|
+
screenStateStore,
|
|
228
|
+
behavior,
|
|
229
|
+
}),
|
|
210
230
|
[behavior, item, lastUpdate]
|
|
211
231
|
);
|
|
212
232
|
|
|
@@ -36,6 +36,7 @@ export function CurrentScreenContextProvider({
|
|
|
36
36
|
screenData: NavigationScreenData;
|
|
37
37
|
}) {
|
|
38
38
|
const { pathname, isActive = false, screenData } = props;
|
|
39
|
+
console.log("CurrentScreenContextProvider", { screenData });
|
|
39
40
|
|
|
40
41
|
const [initialScreenData, setInitialScreenData] = React.useState(screenData);
|
|
41
42
|
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
loadDatasources,
|
|
14
14
|
usePipesContexts,
|
|
15
15
|
} from "./utils";
|
|
16
|
+
import { useScreenResolvers } from "@applicaster/zapp-react-native-utils/actionsExecutor/screenResolver";
|
|
16
17
|
|
|
17
18
|
type RiverProps = {
|
|
18
19
|
dispatch: DispatchProp;
|
|
@@ -25,7 +26,7 @@ export function WithRiverFeedLoader(Component: ZappComponent) {
|
|
|
25
26
|
return function WrappedWithRiverFeedLoader(props: RiverProps) {
|
|
26
27
|
const { river } = props;
|
|
27
28
|
const { screenData, pathname } = useRoute();
|
|
28
|
-
|
|
29
|
+
const resolvers = useScreenResolvers();
|
|
29
30
|
const pipesContexts = usePipesContexts(river.id, pathname);
|
|
30
31
|
|
|
31
32
|
const componentsToLoad = ignoreComponentsWithClearCacheFlag(
|
|
@@ -49,7 +50,12 @@ export function WithRiverFeedLoader(Component: ZappComponent) {
|
|
|
49
50
|
item?.filter((item2) => item2 !== undefined)
|
|
50
51
|
);
|
|
51
52
|
|
|
52
|
-
loadDatasources(
|
|
53
|
+
loadDatasources(
|
|
54
|
+
nonEmptyDataSources,
|
|
55
|
+
river?.id,
|
|
56
|
+
props.dispatch,
|
|
57
|
+
resolvers
|
|
58
|
+
);
|
|
53
59
|
}, []);
|
|
54
60
|
|
|
55
61
|
return <Component {...props} />;
|
|
@@ -12,11 +12,16 @@ export { getDatasourceUrl } from "./getDatasourceUrl";
|
|
|
12
12
|
|
|
13
13
|
export const DATASOURCE_CHUNKS = 10;
|
|
14
14
|
|
|
15
|
-
export async function loadDatasources(
|
|
15
|
+
export async function loadDatasources(
|
|
16
|
+
urls: string[][],
|
|
17
|
+
riverId,
|
|
18
|
+
dispatch,
|
|
19
|
+
resolvers
|
|
20
|
+
) {
|
|
16
21
|
return reducePromises<string, void>(
|
|
17
22
|
mapPromises<string, void>((url) => {
|
|
18
23
|
if (url) {
|
|
19
|
-
return dispatch(loadPipesData(url, { riverId }));
|
|
24
|
+
return dispatch(loadPipesData(url, { riverId, resolvers }));
|
|
20
25
|
}
|
|
21
26
|
}),
|
|
22
27
|
undefined,
|
|
@@ -19,7 +19,11 @@ import { ZappPipesSearchContext } from "@applicaster/zapp-react-native-ui-compon
|
|
|
19
19
|
import { useScreenContext } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext";
|
|
20
20
|
|
|
21
21
|
import { isVerticalListOrGrid } from "./utils";
|
|
22
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
subscribeForUrlContextKeyChanges,
|
|
24
|
+
subscribeForUrlScreenKeyChanges,
|
|
25
|
+
} from "@applicaster/zapp-pipes-v2-client";
|
|
26
|
+
import { useScreenStateStore } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useScreenStateStore";
|
|
23
27
|
|
|
24
28
|
type Props = {
|
|
25
29
|
component: ZappUIComponent;
|
|
@@ -204,7 +208,9 @@ export function zappPipesDataConnector(
|
|
|
204
208
|
Component: React.FC<any> | React.ComponentClass<any>
|
|
205
209
|
) {
|
|
206
210
|
return function WrappedWithZappPipesData(props: Props) {
|
|
207
|
-
const { screenData } = useRoute();
|
|
211
|
+
const { screenData, pathname } = useRoute();
|
|
212
|
+
const screenStateStore = useScreenStateStore();
|
|
213
|
+
|
|
208
214
|
const { plugins } = usePickFromState(["plugins"]);
|
|
209
215
|
|
|
210
216
|
const screenContextData = useScreenContext();
|
|
@@ -286,6 +292,18 @@ export function zappPipesDataConnector(
|
|
|
286
292
|
componentIndex
|
|
287
293
|
);
|
|
288
294
|
|
|
295
|
+
useEffect(() => {
|
|
296
|
+
if (!(dataSourceUrl?.includes("pipesv2://") && reloadData)) {
|
|
297
|
+
return subscribeForUrlScreenKeyChanges(
|
|
298
|
+
dataSourceUrl,
|
|
299
|
+
pathname,
|
|
300
|
+
screenStateStore,
|
|
301
|
+
{},
|
|
302
|
+
reloadData
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
}, [dataSourceUrl, reloadData]);
|
|
306
|
+
|
|
289
307
|
useEffect(() => {
|
|
290
308
|
if (dataSourceUrl?.includes("pipesv2://") && reloadData) {
|
|
291
309
|
const addListener = getListenerFromPlugin(dataSourceUrl, plugins);
|
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.9203091422",
|
|
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.9203091422",
|
|
32
|
+
"@applicaster/zapp-react-native-bridge": "14.0.0-alpha.9203091422",
|
|
33
|
+
"@applicaster/zapp-react-native-redux": "14.0.0-alpha.9203091422",
|
|
34
|
+
"@applicaster/zapp-react-native-utils": "14.0.0-alpha.9203091422",
|
|
35
35
|
"promise": "^8.3.0",
|
|
36
36
|
"url": "^0.11.0",
|
|
37
37
|
"uuid": "^3.3.2"
|