@applicaster/quick-brick-core
Version:
Core package for Applicaster's Quick Brick App
109 lines (89 loc) • 3.01 kB
text/typescript
import * as R from "ramda";
import { loadAppContextData } from "@applicaster/zapp-react-native-redux";
import { URL_KEYS } from "../consts";
import {
fetchPluginConfiguration,
getPromiseForKey,
prepareRuntimeConfigurationUrls,
} from "../helpers";
import { isTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
import { Dimensions } from "react-native";
import { cacheAssets } from "../../AssetCache";
const buildContextData = (remoteData) => {
const { width, height } = Dimensions.get("window");
const { tabletLayout = null, tabletCellStyles = null } = remoteData;
const useTabletLayout =
isTablet({ width, height }, width > height ? "landscape" : "portrait") &&
tabletLayout &&
tabletCellStyles;
if (useTabletLayout) {
remoteData.rivers = tabletLayout;
remoteData.cellStyles = tabletCellStyles;
}
return remoteData;
};
export async function getLegacyRemoteContextData(
dispatch,
runtimeConfigurationUrls,
plugins
) {
const layoutManagerPlugin = R.find(
R.pathSatisfies(R.is(Function), ["module", "selectLayout"])
)(plugins);
const { width, height } = Dimensions.get("window");
const isTabletDevice = isTablet(
{ width, height },
width > height ? "landscape" : "portrait"
);
const configurationUrls = await layoutManagerPlugin?.module?.selectLayout({
runtimeConfigurationUrls,
plugin: layoutManagerPlugin,
isTablet: isTabletDevice,
});
const { preparedRuntimeConfigurationUrls, layoutData = [] } =
await prepareRuntimeConfigurationUrls(
configurationUrls || runtimeConfigurationUrls,
isTabletDevice
);
const promises = R.compose(
R.map(getPromiseForKey(preparedRuntimeConfigurationUrls)),
R.reject(R.isNil),
R.keys,
R.pick(URL_KEYS)
)(preparedRuntimeConfigurationUrls);
const resolvedPromises = await Promise.all(promises);
const remoteData = R.compose(
buildContextData,
R.mergeAll
)([...layoutData, ...resolvedPromises]);
const useTabletLayout =
isTabletDevice &&
Boolean(remoteData.tabletLayout) &&
Boolean(remoteData.tabletCellStyles);
const cachedRemoteData = await cacheAssets({
layout: useTabletLayout ? remoteData.tabletLayout : remoteData.layout,
pluginConfigurations: remoteData.pluginConfigurations,
cellStyles: useTabletLayout
? remoteData.tabletCellStyles
: remoteData.cellStyles,
});
const { pluginConfigurations } = cachedRemoteData;
const updatedPlugins = R.map(
fetchPluginConfiguration(pluginConfigurations),
plugins
);
const appProperties = R.compose(
R.mergeLeft({
contentTypes: useTabletLayout
? remoteData?.tabletLayout?.content_types
: remoteData.layout?.content_types,
rivers: cachedRemoteData.layout,
cellStyles: cachedRemoteData.cellStyles,
}),
R.omit(["layout", "tabletLayout", "tabletCellStyles"])
)(remoteData);
loadAppContextData(dispatch, {
...appProperties,
plugins: updatedPlugins,
});
}