Skip to content

Commit 48d14dc

Browse files
authored
refactor(webapp): expose startup feature toggle checker via RootContext (#20587)
Inject isFeatureToggleEnabled directly into RootProvider context value
1 parent a00d7a6 commit 48d14dc

File tree

5 files changed

+30
-20
lines changed

5 files changed

+30
-20
lines changed

apps/webapp/src/script/page/AppMain.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import {ContentState, useAppState} from './useAppState';
6767
import {runClientVersionCheck} from '../application-periodic-checks/runClientVersionCheck';
6868
import {startApplicationPeriodicChecks} from '../application-periodic-checks/startApplicationPeriodicChecks';
6969
import {createWallClock} from '../clock/wallClock';
70-
import {StartupFeatureToggleName, StartupFeatureToggles} from '../featureToggles/startupFeatureToggles';
70+
import {StartupFeatureToggles} from '../featureToggles/startupFeatureToggles';
7171
import {App} from '../main/app';
7272
import {initialiseMLSMigrationFlow} from '../mls/MLSMigration';
7373
import {generateConversationUrl} from '../router/routeGenerator';
@@ -302,10 +302,6 @@ export const AppMain = ({
302302

303303
const showLeftSidebar = (isMobileView && isMobileLeftSidebarView) || (!isMobileView && !isLeftSidebarHidden);
304304
const showMainContent = currentTab === SidebarTabs.CELLS || !isMobileView || isMobileCentralColumnView;
305-
function isFeatureFlagEnabled(featureName: StartupFeatureToggleName): boolean {
306-
return startupFeatureToggles.isFeatureToggleEnabled(featureName);
307-
}
308-
309305
return (
310306
<StyledApp
311307
themeId={THEME_ID.DEFAULT}
@@ -315,7 +311,14 @@ export const AppMain = ({
315311
data-uie-value="is-loaded"
316312
>
317313
{!locked && <WindowTitleUpdater />}
318-
<RootProvider value={{mainViewModel: mainView, wallClock, doesApplicationNeedForceReload, isFeatureFlagEnabled}}>
314+
<RootProvider
315+
value={{
316+
mainViewModel: mainView,
317+
wallClock,
318+
doesApplicationNeedForceReload,
319+
isFeatureToggleEnabled: startupFeatureToggles.isFeatureToggleEnabled,
320+
}}
321+
>
319322
<ErrorBoundary FallbackComponent={ErrorFallback}>
320323
<ForceReloadModal reloadApplication={app.refresh} />
321324
{Config.getConfig().FEATURE.ENABLE_DEBUG && <ConfigToolbar />}

apps/webapp/src/script/page/MainContent/MainContent.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const mockDevicesHandler = {
4646
currentDeviceId: () => 'mock-device-id',
4747
} as unknown as MediaDevicesHandler;
4848

49-
function isFeatureFlagDisabledForTest(): boolean {
49+
function isFeatureToggleDisabledForTest(): boolean {
5050
return false;
5151
}
5252

@@ -79,7 +79,7 @@ describe('Preferences', () => {
7979
mainViewModel,
8080
wallClock,
8181
doesApplicationNeedForceReload: false,
82-
isFeatureFlagEnabled: isFeatureFlagDisabledForTest,
82+
isFeatureToggleEnabled: isFeatureToggleDisabledForTest,
8383
}}
8484
>
8585
<MainContent {...defaultParams} />

apps/webapp/src/script/page/RootProvider.test.tsx

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ interface WrapperProperties {
3838

3939
interface RootProviderWrapper {
4040
wrapper: (properties: WrapperProperties) => ReactNode;
41-
isFeatureFlagEnabled: jest.Mock<boolean, [StartupFeatureToggleName]>;
41+
isFeatureToggleEnabled: jest.Mock<boolean, [StartupFeatureToggleName]>;
4242
deterministicWallClock: ReturnType<typeof createDeterministicWallClock>;
4343
}
4444

@@ -50,23 +50,30 @@ function createRootProviderWrapper(
5050
const deterministicWallClock = createDeterministicWallClock({
5151
initialCurrentTimestampInMilliseconds: wallClockTimestampInMilliseconds,
5252
});
53-
function isFeatureFlagEnabledForTest(featureName: StartupFeatureToggleName): boolean {
53+
function isFeatureToggleEnabledForTest(featureName: StartupFeatureToggleName): boolean {
5454
return featureName === 'reliable-websocket-connection';
5555
}
5656

57-
const isFeatureFlagEnabled = jest.fn(isFeatureFlagEnabledForTest);
57+
const isFeatureToggleEnabled = jest.fn(isFeatureToggleEnabledForTest);
5858

5959
function wrapper(properties: WrapperProperties): ReactNode {
6060
const wrappedChildren = (
61-
<RootProvider value={{mainViewModel, wallClock: deterministicWallClock, doesApplicationNeedForceReload, isFeatureFlagEnabled}}>
61+
<RootProvider
62+
value={{
63+
mainViewModel,
64+
wallClock: deterministicWallClock,
65+
doesApplicationNeedForceReload,
66+
isFeatureToggleEnabled,
67+
}}
68+
>
6269
{properties.children}
6370
</RootProvider>
6471
);
6572

6673
return wrappedChildren;
6774
}
6875

69-
return {wrapper, deterministicWallClock, isFeatureFlagEnabled};
76+
return {wrapper, deterministicWallClock, isFeatureToggleEnabled};
7077
}
7178

7279
function getRootContextValue(): RootContextValue | null {
@@ -114,12 +121,12 @@ describe('RootProvider', () => {
114121
expect(result.current.doesApplicationNeedForceReload).toBe(true);
115122
});
116123

117-
it('provides startup feature flag helper through useApplicationContext()', function () {
118-
const {wrapper, isFeatureFlagEnabled} = createRootProviderWrapper(mainViewModel, 9_999, true);
124+
it('provides startup feature toggle helper through useApplicationContext()', function () {
125+
const {wrapper, isFeatureToggleEnabled} = createRootProviderWrapper(mainViewModel, 9_999, true);
119126

120127
const {result} = renderHook(useApplicationContext, {wrapper});
121128

122-
expect(result.current.isFeatureFlagEnabled('reliable-websocket-connection')).toBe(true);
123-
expect(isFeatureFlagEnabled).toHaveBeenCalledWith('reliable-websocket-connection');
129+
expect(result.current.isFeatureToggleEnabled('reliable-websocket-connection')).toBe(true);
130+
expect(isFeatureToggleEnabled).toHaveBeenCalledWith('reliable-websocket-connection');
124131
});
125132
});

apps/webapp/src/script/page/RootProvider.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export type RootContextValue = {
2727
readonly mainViewModel: MainViewModel;
2828
readonly wallClock: WallClock;
2929
readonly doesApplicationNeedForceReload: boolean;
30-
readonly isFeatureFlagEnabled: (featureName: StartupFeatureToggleName) => boolean;
30+
readonly isFeatureToggleEnabled: (featureName: StartupFeatureToggleName) => boolean;
3131
};
3232

3333
export const RootContext = createContext<RootContextValue | null>(null);

apps/webapp/src/script/page/components/ForceReloadModal/ForceReloadModal.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ interface ForceReloadModalTestContextValue {
3737
readonly wallClock?: DeterministicWallClock;
3838
}
3939

40-
function isFeatureFlagDisabledForTest(): boolean {
40+
function isFeatureToggleDisabledForTest(): boolean {
4141
return false;
4242
}
4343

@@ -78,7 +78,7 @@ function createForceReloadModalTestElement(
7878
<RootProvider
7979
value={{
8080
doesApplicationNeedForceReload,
81-
isFeatureFlagEnabled: isFeatureFlagDisabledForTest,
81+
isFeatureToggleEnabled: isFeatureToggleDisabledForTest,
8282
mainViewModel: createMainViewModelForTest(),
8383
wallClock,
8484
}}

0 commit comments

Comments
 (0)