UNPKG

@applicaster/zapp-react-dom-app

Version:

Zapp App Component for Applicaster's Quick Brick React Native App

116 lines (92 loc) 3.38 kB
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 );