Skip to content

Commit 6fa69b8

Browse files
authored
feat: add mechanism for feature flags (#817)
1 parent 34b371a commit 6fa69b8

File tree

5 files changed

+25
-2
lines changed

5 files changed

+25
-2
lines changed

paths.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
3737
"@constants/*": ["src/constants/*"],
3838
"@hooks": ["src/hooks/"],
3939
"@hooks/*": ["src/hooks/*"],
40-
"@features": ["src/features/"],
41-
"@features/*": ["src/features/*"],
40+
"@feature-flags": ["src/feature-flags/"],
41+
"@feature-flags/*": ["src/feature-flags/*"],
4242
"@redux": ["src/redux/"],
4343
"@redux/*": ["src/redux/*"],
4444
"@permissions": ["src/permissions/"],

src/AppRoot.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import FingerprintJS from '@fingerprintjs/fingerprintjs';
1010
import {ConfigContext, DashboardContext, MainContext} from '@contexts';
1111
import {ModalHandler, ModalOutletProvider} from '@contexts/ModalContext';
1212

13+
import {FeatureFlagsProvider} from '@feature-flags';
14+
1315
import {useAxiosInterceptors} from '@hooks/useAxiosInterceptors';
1416
import {useLastCallback} from '@hooks/useLastCallback';
1517

@@ -110,6 +112,7 @@ const AppRoot: React.FC = () => {
110112
const plugins: Plugin[] = useMemo(() => [createAiInsightsPlugin()], []);
111113

112114
return composeProviders()
115+
.append(FeatureFlagsProvider, {})
113116
.append(ConfigContext.Provider, {value: config})
114117
.append(DashboardContext.Provider, {value: dashboardValue})
115118
.append(PermissionsProvider, {scope: permissionsScope, resolver: permissionsResolver})

src/feature-flags/context.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import {FC, PropsWithChildren, createContext, useState} from 'react';
2+
import {useEvent} from 'react-use';
3+
4+
export const FeatureFlagsContext = createContext<Record<string, boolean>>({});
5+
6+
export const FeatureFlagsProvider: FC<PropsWithChildren<{}>> = ({children}) => {
7+
const [flags, setFlags] = useState({});
8+
useEvent('feature-flags', ({data}) => setFlags({...flags, ...data}));
9+
return <FeatureFlagsContext.Provider value={flags}>{children}</FeatureFlagsContext.Provider>;
10+
};

src/feature-flags/hooks.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import {useContext} from 'react';
2+
3+
import {FeatureFlagsContext} from './context';
4+
5+
export const useFeatureFlag = (name: string): boolean => {
6+
const flags = useContext(FeatureFlagsContext);
7+
return Boolean(flags[name]);
8+
};

src/feature-flags/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './hooks';
2+
export {FeatureFlagsProvider} from './context';

0 commit comments

Comments
 (0)