@applicaster/zapp-react-native-bridge
Version:
Applicaster Zapp React Native modules
122 lines (110 loc) • 3.46 kB
text/typescript
import { createZappPipesLibrary } from "@applicaster/zapp-pipes-dev-kit/lib/app-pipes";
import {
platformSelect,
getPlatform,
} from "@applicaster/zapp-react-native-utils/reactUtils";
import * as R from "ramda";
import { getAppData } from "../QuickBrick";
import { localStorage } from "../ZappStorage/LocalStorage";
import { sessionStorage } from "../ZappStorage/SessionStorage";
import type { AppData } from "../QuickBrick";
type Provider = {
name: string;
handler: (any) => (any) => Promise<any>;
manifest: {
handlers: Array<string>;
help: any;
};
test: {
requestMocks: any;
testCommand: string;
};
};
type ZappPipesGetter = {
get: (url: string, callback: (any) => void) => void;
};
let cachedProviders: Array<Provider> | null = [];
let cachedZappPipesAdapter: ZappPipesGetter | null;
/**
* this functions add properties which may be missing from the native bridge
* This is required mainly for applicaster2 provider signed requests
*/
function getPlatformProperties() {
return platformSelect({
default: { platform: getPlatform() },
android_tv: {
os_type: "android",
os_version: 28,
platform: "android",
},
android: {
os_type: "android",
os_version: 28,
platform: "android",
},
tvos: { os_type: "ios", platform: "ios" },
ios: { os_type: "ios", platform: "ios" },
});
}
/**
* Creates a Zapp pipes adapter if necessary
* will only invoke the createZappPipesLibrary function if the adapter is not cached
* or if providers array has changed
*
* @export
* @param {Array<Provider>} providers to inject in the adapter
* @returns {ZappPipesGetter} Object containing a get method to load zapp pipes data source urls
*/
export function bootstrapZappPipes(
providers: Array<Provider>
): ZappPipesGetter {
if (!cachedZappPipesAdapter || !R.equals(providers, cachedProviders)) {
const zappPipesAdapter: ZappPipesGetter = {
get: createZappPipesLibrary({
providers,
release: "dev",
nativeBridge: {
appData(): AppData {
const appData = getAppData();
const additionalPlatformProperties = getPlatformProperties();
return { ...appData, ...additionalPlatformProperties };
},
getSessionStoreItem: sessionStorage.getItem,
setSessionStoreItem: sessionStorage.setItem,
getAllSessionItems: sessionStorage.getAllItems,
getLocalStoreItem: localStorage.getItem,
setLocalStoreItem: localStorage.setItem,
},
}),
};
cachedProviders = providers;
cachedZappPipesAdapter = zappPipesAdapter;
}
return cachedZappPipesAdapter;
}
/**
* Resets the providers & zapp pipes adapter cache
*
* @export
*/
export function resetZappPipesAdapterCache() {
cachedProviders = null;
cachedZappPipesAdapter = null;
}
/**
* Sets the proviers & zapp pipes adapter cache
* this function is meant to be used only in tests
*
* @export
* @param {Array<Provider>} _cachedProviders : array of providers to set in cache
* @param {ZappPipesGetter} _cachedZappPipesAdapter : zapp pides adapter to set in cache
*/
export function setZappPipesAdapterCache(
_cachedProviders: Array<Provider>,
_cachedZappPipesAdapter: ZappPipesGetter
) {
if (process && process.env && process.env.NODE_ENV === "test") {
cachedProviders = _cachedProviders;
cachedZappPipesAdapter = _cachedZappPipesAdapter;
}
}