Skip to content

Commit 25dbfc3

Browse files
committed
[frontend] Introduce FeatureFlagged utility component
1 parent 88cc0fd commit 25dbfc3

2 files changed

Lines changed: 63 additions & 0 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { describe, it, expect, vi, afterEach } from 'vitest';
2+
import { screen } from '@testing-library/react';
3+
import FeatureFlagged from './FeatureFlagged';
4+
import testRender from '../utils/tests/test-render';
5+
import useHelper from '../utils/hooks/useHelper';
6+
import type { ModuleHelper } from '../utils/platformModulesHelper';
7+
8+
vi.mock('../utils/hooks/useHelper');
9+
10+
describe('FeatureFlagged', () => {
11+
afterEach(() => {
12+
vi.resetAllMocks();
13+
});
14+
15+
it('renders Enabled when one of the flags is enabled', () => {
16+
vi.mocked(useHelper).mockReturnValue({
17+
isFeatureEnable: (flag: string) => flag === 'SOME_FLAG',
18+
} as unknown as ModuleHelper);
19+
testRender(
20+
<FeatureFlagged
21+
flags={['SOME_FLAG', 'SOME_OTHER_FLAG']}
22+
Enabled="Enabled"
23+
Disabled="Disabled"
24+
/>,
25+
);
26+
expect(screen.getByText('Enabled')).toBeInTheDocument();
27+
});
28+
29+
it('renders Disabled when none of the flags are enabled', () => {
30+
vi.mocked(useHelper).mockReturnValue({
31+
isFeatureEnable: () => false,
32+
} as unknown as ModuleHelper);
33+
testRender(
34+
<FeatureFlagged
35+
flags={['SOME_FLAG', 'SOME_OTHER_FLAG']}
36+
Enabled="Enabled"
37+
Disabled="Disabled"
38+
/>,
39+
);
40+
expect(screen.getByText('Disabled')).toBeInTheDocument();
41+
});
42+
});
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { ReactNode } from 'react';
2+
import useHelper from '../utils/hooks/useHelper';
3+
4+
interface FeatureFlaggedProps {
5+
flags: string[];
6+
Enabled: ReactNode;
7+
Disabled: ReactNode;
8+
}
9+
10+
/**
11+
* Utility component to switch between two components based on the value
12+
* of feature flags. If at least one othe given `flags` is enabled then
13+
* the `Enabled` component is rendered, otherwise it's the `Disabled` component.
14+
*/
15+
const FeatureFlagged = ({ flags, Enabled, Disabled }: FeatureFlaggedProps) => {
16+
const { isFeatureEnable } = useHelper();
17+
const areSomeFeaturesEnabled = flags.some(isFeatureEnable);
18+
return areSomeFeaturesEnabled ? Enabled : Disabled;
19+
};
20+
21+
export default FeatureFlagged;

0 commit comments

Comments
 (0)