@applicaster/zapp-react-native-ui-components
Version:
Applicaster Zapp React Native ui components for the Quick Brick App
101 lines (83 loc) • 2.52 kB
text/typescript
import * as R from "ramda";
import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
import {
getInflatedDataSourceUrl,
getSearchContext,
} from "@applicaster/zapp-react-native-utils/reactHooks";
import {
mapPromises,
reducePromises,
} from "@applicaster/zapp-react-native-utils/arrayUtils";
import {
ZappPipesEntryContext,
ZappPipesScreenContext,
ZappPipesSearchContext,
} from "../../Contexts";
export const DATASOURCE_CHUNKS = 10;
export async function loadDatasources(urls: string[][], riverId, dispatch) {
return reducePromises<string, void>(
mapPromises<string, void>((url) => {
if (url) {
return dispatch(loadPipesData(url, { riverId }));
}
}),
undefined,
urls
);
}
export function riverIsCurrentRoute(riverId, route) {
const routeRiverId = R.compose(R.last, R.split("/"))(route);
return typeof riverId === "undefined" || routeRiverId === riverId;
}
export const ignoreComponentsWithClearCacheFlag = R.reject(
R.pathEq(["rules", "clear_cache_on_reload"], true)
);
export const getDatasourceUrl: (
contexts: {
screenData?: Record<string, any>;
entryContext: ReturnType<
typeof ZappPipesEntryContext.useZappPipesContext
>[0];
searchContext: string;
screenContext: ZappRiver;
},
component?: ZappUIComponent
) => string | null = R.curry(
(
{ screenData, entryContext, searchContext, screenContext },
component: ZappUIComponent
) => {
const { source, mapping } = R.propOr({}, ["data"], component);
if (mapping) {
const contexts = {
entry: entryContext,
screen: screenContext || screenData,
search: getSearchContext(searchContext, mapping),
};
return getInflatedDataSourceUrl({ source, mapping, contexts });
}
return source;
}
);
export function usePipesContexts(
riverId: string,
route: string
): {
entryContext: ReturnType<typeof ZappPipesEntryContext.useZappPipesContext>[0];
searchContext: string;
screenContext: ZappRiver;
} {
const isNestedScreen = !riverIsCurrentRoute(riverId, route);
const routeForEntry = isNestedScreen ? `${route}/river/${riverId}` : route;
const [entryContext] = ZappPipesEntryContext.useZappPipesContext(
routeForEntry,
isNestedScreen
);
const [searchContext] = ZappPipesSearchContext.useZappPipesContext();
const [screenContext] = ZappPipesScreenContext.useZappPipesContext();
return {
entryContext,
searchContext,
screenContext,
};
}