UNPKG

@react-native-firebase/remote-config

Version:

React Native Firebase - React Native Firebase provides native integration with Remote Config, allowing you to change the appearance and/or functionality of your app without requiring an app update.

125 lines (119 loc) 4.01 kB
import { getApp, getRemoteConfig, activate, ensureInitialized, fetchAndActivate, fetchConfig, getAll, makeIDBAvailable, setCustomSignals, } from '@react-native-firebase/app/lib/internal/web/firebaseRemoteConfig'; import { guard } from '@react-native-firebase/app/lib/internal/web/utils'; let configSettingsForInstance = { // [APP_NAME]: RemoteConfigSettings }; let defaultConfigForInstance = { // [APP_NAME]: { [key: string]: string | number | boolean } }; function makeGlobalsAvailable() { navigator.onLine = true; makeIDBAvailable(); } function getRemoteConfigInstanceForApp(appName, overrides /*: RemoteConfigSettings */) { makeGlobalsAvailable(); const configSettings = configSettingsForInstance[appName] ?? { minimumFetchIntervalMillis: 43200000, fetchTimeoutMillis: 60000, }; const defaultConfig = defaultConfigForInstance[appName] ?? {}; Object.assign(configSettings, overrides); const app = getApp(appName); const instance = getRemoteConfig(app); for (const key in configSettings) { instance.settings[key] = configSettings[key]; } instance.defaultConfig = defaultConfig; return instance; } async function resultAndConstants(instance, result) { const response = { result }; const valuesRaw = getAll(instance); const values = {}; for (const key in valuesRaw) { const raw = valuesRaw[key]; values[key] = { source: raw.getSource(), value: raw.asString(), }; } response.constants = { values, lastFetchTime: instance.fetchTimeMillis === -1 ? 0 : instance.fetchTimeMillis, lastFetchStatus: instance.lastFetchStatus.replace(/-/g, '_'), minimumFetchInterval: instance.settings.minimumFetchIntervalMillis ? instance.settings.minimumFetchIntervalMillis / 1000 : 43200, fetchTimeout: instance.settings.fetchTimeoutMillis ? instance.settings.fetchTimeoutMillis / 1000 : 60, }; return response; } export default { activate(appName) { return guard(async () => { const remoteConfig = getRemoteConfigInstanceForApp(appName); return resultAndConstants(remoteConfig, await activate(remoteConfig)); }); }, setConfigSettings(appName, settings) { return guard(async () => { configSettingsForInstance[appName] = { minimumFetchIntervalMillis: settings.minimumFetchInterval * 1000, fetchTimeoutMillis: settings.fetchTimeout * 1000, }; const remoteConfig = getRemoteConfigInstanceForApp(appName, settings); return resultAndConstants(remoteConfig, null); }); }, fetch(appName, expirationDurationSeconds) { return guard(async () => { let overrides = {}; if (expirationDurationSeconds != -1) { overrides.minimumFetchIntervalMillis = expirationDurationSeconds * 1000; } const remoteConfig = getRemoteConfigInstanceForApp(appName, overrides); await fetchConfig(remoteConfig); return resultAndConstants(remoteConfig, null); }); }, fetchAndActivate(appName) { return guard(async () => { const remoteConfig = getRemoteConfigInstanceForApp(appName); const activated = await fetchAndActivate(remoteConfig); return resultAndConstants(remoteConfig, activated); }); }, ensureInitialized(appName) { return guard(async () => { const remoteConfig = getRemoteConfigInstanceForApp(appName); await ensureInitialized(remoteConfig); return resultAndConstants(remoteConfig, null); }); }, setDefaults(appName, defaults) { return guard(async () => { defaultConfigForInstance[appName] = defaults; const remoteConfig = getRemoteConfigInstanceForApp(appName); return resultAndConstants(remoteConfig, null); }); }, setCustomSignals(appName, customSignals) { return guard(async () => { const remoteConfig = getRemoteConfigInstanceForApp(appName); await setCustomSignals(remoteConfig, customSignals); return resultAndConstants(remoteConfig, null); }); }, };