diff --git a/src/components/views/settings/UiFeatureSettingWrapper.tsx b/src/components/views/settings/UiFeatureSettingWrapper.tsx new file mode 100644 index 00000000000..9f0d049c111 --- /dev/null +++ b/src/components/views/settings/UiFeatureSettingWrapper.tsx @@ -0,0 +1,30 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; + +import SettingsStore from '../../../settings/SettingsStore'; +import { UIFeature } from '../../../settings/UIFeature'; + +interface IProps { + uiFeature: UIFeature; +} +const UiFeatureSettingWrapper: React.FC = ({ children, uiFeature }) => { + const settingValue = SettingsStore.getValue(uiFeature); + return settingValue && children ? <>{ children } : null; +}; + +export default UiFeatureSettingWrapper; diff --git a/test/components/views/settings/UiFeatureSettingWrapper-test.tsx b/test/components/views/settings/UiFeatureSettingWrapper-test.tsx new file mode 100644 index 00000000000..5d6e2ff87ec --- /dev/null +++ b/test/components/views/settings/UiFeatureSettingWrapper-test.tsx @@ -0,0 +1,56 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import { mount } from 'enzyme'; + +import SettingsStore from '../../../../src/settings/SettingsStore'; +import UiFeatureSettingWrapper from '../../../../src/components/views/settings/UiFeatureSettingWrapper'; +import { UIFeature } from '../../../../src/settings/UIFeature'; + +jest.mock('../../../../src/settings/SettingsStore'); + +describe('', () => { + const defaultProps = { + uiFeature: UIFeature.Flair, + children:
test
, + }; + const getComponent = (props = {}) => mount(); + + beforeEach(() => { + (SettingsStore.getValue as jest.Mock).mockClear().mockReturnValue(true); + }); + + it('renders children when setting is truthy', () => { + const component = getComponent(); + + expect(component).toMatchSnapshot(); + expect(SettingsStore.getValue).toHaveBeenCalledWith(defaultProps.uiFeature); + }); + + it('returns null when setting is truthy but children are undefined', () => { + const component = getComponent({ children: undefined }); + + expect(component.html()).toBeNull(); + }); + + it('returns null when setting is falsy', () => { + (SettingsStore.getValue as jest.Mock).mockReturnValue(false); + const component = getComponent(); + + expect(component.html()).toBeNull(); + }); +}); diff --git a/test/components/views/settings/__snapshots__/UiFeatureSettingWrapper-test.tsx.snap b/test/components/views/settings/__snapshots__/UiFeatureSettingWrapper-test.tsx.snap new file mode 100644 index 00000000000..6c6c7fd1f32 --- /dev/null +++ b/test/components/views/settings/__snapshots__/UiFeatureSettingWrapper-test.tsx.snap @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` renders children when setting is truthy 1`] = ` + +
+ test +
+
+`;