@applicaster/zapp-react-dom-app
Version:
Zapp App Component for Applicaster's Quick Brick React Native App
116 lines (92 loc) • 3.38 kB
JavaScript
import * as R from "ramda";
import { appStore as AppStore } from "@applicaster/zapp-react-native-redux/AppStore";
import { NativeModules } from "react-native";
export const UI_LANGUAGE = "uiLanguage";
export const getLanguageCodeFromLocalStorage = () => {
return NativeModules.LocalStorage.getItem(UI_LANGUAGE);
};
export const persistLanguageSelection = async (languageCode) => {
await NativeModules.SessionStorage.setItem(UI_LANGUAGE, languageCode);
return NativeModules.LocalStorage.setItem(UI_LANGUAGE, languageCode);
};
export const getAvailableAppLanguagesImpl = (appStore) => {
try {
const remoteConfigurations = appStore.get("remoteConfigurations");
return R.keys(remoteConfigurations.localizations);
} catch (e) {
return [];
}
};
export const getAvailableAppLanguages = R.partial(
getAvailableAppLanguagesImpl,
[AppStore]
);
export const pickBestMatchedLanguage = (
currentLanguage,
availableLanguages
) => {
const bestMatch = availableLanguages.find(
(language) => language === currentLanguage
);
if (bestMatch) {
return bestMatch;
}
if (currentLanguage.includes("-")) {
const languageCode = R.head(R.split("-", currentLanguage));
const partialMatch = availableLanguages.find(
(language) => language === languageCode
);
if (partialMatch) {
return partialMatch;
}
}
// default
return R.head(availableLanguages);
};
export const getLanguageCodeImpl =
(
GetLanguageCodeFromLocalStorage,
GetAvailableAppLanguages,
PickBestMatchedLanguage
) =>
async (locale) => {
const languageFromLocalStorage = await GetLanguageCodeFromLocalStorage();
if (languageFromLocalStorage) {
return languageFromLocalStorage;
}
const availableAppLanguages = GetAvailableAppLanguages();
const pickedLanguage = PickBestMatchedLanguage(
locale,
availableAppLanguages
);
return pickedLanguage;
};
/**
/**
* Loads and sets locale-related information in the QuickBrickCommunicationModule.
* This function adds uiLanguage, countryLocale, languageLocale, and languageCode to the module.
*
* @param {Function} GetLocale - Function to retrieve the current locale.
* @param {Function} GetLanguageCode - Function to determine the language code based on available languages.
* @param {Object} quickBrickCommunicationModule - The module to be updated with locale information.
* @returns {Promise<Function>} An async function that loads and sets the locale information.
* Warning! This function mutates QuickBrickCommunicationModule
*/
export const loadLocaleImpl =
(GetLocale, GetLanguageCode, quickBrickCommunicationModule) => async () => {
const locale = await GetLocale();
const separator = locale.includes("_") ? "_" : "-";
const [languageLocale, countryLocale = ""] = R.split(separator, locale);
quickBrickCommunicationModule.languageLocale = R.toLower(languageLocale);
if (countryLocale) {
quickBrickCommunicationModule.countryLocale = R.toUpper(countryLocale);
}
const languageCode = await GetLanguageCode(locale);
quickBrickCommunicationModule.languageCode = languageCode;
quickBrickCommunicationModule.uiLanguage = languageCode;
};
export const getLanguageCode = getLanguageCodeImpl(
getLanguageCodeFromLocalStorage,
getAvailableAppLanguages,
pickBestMatchedLanguage
);