blob: 5e0df1448f600f17188180310c47dc9e65209539 [file] [log] [blame]
svishnevd3886bb2018-01-08 15:21:46 +02001/*!
2 * Copyright © 2016-2017 European Support Limited
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
13 * or implied. See the License for the specific language governing
14 * permissions and limitations under the License.
15 */
16
17
18 /**
19 * Feature toggling decorator
20 * usage:
21 *
22 * @featureToggle('FeatureName')
23 * class Example extends React.Component {
24 * render() {
25 * return (<div>test feature</div>);
26 * }
27 * }
28 *
29 * OR
30 *
31 * const TestFeature = () => (<div>test feature</div>)
32 * export default featureToggle('FeatureName')(TestFeature)
33 *
34 */
35
36import React from 'react';
37import PropTypes from 'prop-types';
38import {connect} from 'react-redux';
39
svishnev091edfd2018-03-19 12:15:19 +020040export const FeatureComponent = (props) => {
41 const {features = [], featureName, InnerComponent, ...otherProps} = props;
42 const AComp = InnerComponent.AComp ? InnerComponent.AComp : InnerComponent;
43
44 return !!features.find(el => el.name === featureName && el.active) ?
45 <AComp {...otherProps}/>
46 : InnerComponent.BComp ? <InnerComponent.BComp {...otherProps}/> : null;
svishnevd3886bb2018-01-08 15:21:46 +020047};
48
49FeatureComponent.propTypes = {
50 features: PropTypes.array,
51 featureName: PropTypes.string.isRequired
52};
53
54
55export default function featureToggle(featureName) {
56 return (InnerComponent) => {
57 return connect(({features}) => {return {features, featureName, InnerComponent};})(FeatureComponent);
58 };
59}
60