diff --git a/packages/common/src/utils.ts b/packages/common/src/utils.ts index dab6f700f0..ef62da2c0e 100644 --- a/packages/common/src/utils.ts +++ b/packages/common/src/utils.ts @@ -1321,3 +1321,47 @@ export const isMobileOrTablet = (): boolean => { } return false; }; + +type FEATURE_FLAGS = { + COMPLEX_BINDINGS: boolean; +}; + +const FEATURE_FLAGS_STORAGE_KEY = "feature-flags"; +const DEFAULT_FEATURE_FLAGS: FEATURE_FLAGS = { + COMPLEX_BINDINGS: false, +}; +let featureFlags: FEATURE_FLAGS | null = null; + +export const getFeatureFlag = ( + flag: F, +): FEATURE_FLAGS[F] => { + if (!featureFlags) { + try { + const serializedFlags = localStorage.getItem(FEATURE_FLAGS_STORAGE_KEY); + if (serializedFlags) { + const flags = JSON.parse(serializedFlags); + featureFlags = flags ?? DEFAULT_FEATURE_FLAGS; + } + } catch {} + } + + return (featureFlags || DEFAULT_FEATURE_FLAGS)[flag]; +}; + +export const setFeatureFlag = ( + flag: F, + value: FEATURE_FLAGS[F], +) => { + try { + featureFlags = { + ...(featureFlags || DEFAULT_FEATURE_FLAGS), + [flag]: value, + }; + localStorage.setItem( + FEATURE_FLAGS_STORAGE_KEY, + JSON.stringify(featureFlags), + ); + } catch (e) { + console.error("unable to set feature flag", e); + } +};