@xo-union/tk-component-header-nav
Version:
42 lines • 1.45 kB
JavaScript
import _Object$assign from "@babel/runtime-corejs3/core-js/object/assign";
import React from "react";
import PropTypes from "prop-types";
import useRunningExperiments from "./useRunningExperiments.js";
const Context = /*#__PURE__*/React.createContext();
export const provideExperiments = Component => {
const Wrapped = _ref => {
let {
experiments,
...props
} = _ref;
const experimentsRef = React.useRef(experiments); // Make sure value never changes
let finalExperiments;
if (experimentsRef.current || experimentsRef.current === false) {
finalExperiments = experimentsRef.current;
} else {
// eslint-disable-next-line react-hooks/rules-of-hooks
finalExperiments = useRunningExperiments();
}
return /*#__PURE__*/React.createElement(Context.Provider, {
value: finalExperiments
}, /*#__PURE__*/React.createElement(Component, props));
};
process.env.NODE_ENV !== "production" ? Wrapped.propTypes = {
experiments: PropTypes.shape()
} : void 0;
_Object$assign(Wrapped, Component);
return Wrapped;
};
export const useVariantName = key => {
const experiments = React.useContext(Context);
if (experiments === false) {
return null;
}
if (!experiments) {
throw new Error('Experiments not provided');
}
if (!Object.prototype.hasOwnProperty.call(experiments, key)) {
throw new Error(`Experiment: ${key}. Is not defined`);
}
return experiments[key];
};