From 5f108351a0c612d809f8ee4f682fe9d73b0df945 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Fri, 31 Oct 2025 14:52:08 +0100 Subject: [PATCH] feat: Feature flag support --- packages/common/src/utils.ts | 44 ++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) 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); + } +};