@ttoss/react-feature-flags
Version:
React Feature Flags
105 lines (99 loc) • 2.98 kB
JavaScript
/** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
Object.defineProperty(exports, Symbol.toStringTag, {
value: 'Module'
});
//#region \0rolldown/runtime.js
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
key = keys[i];
if (!__hasOwnProp.call(to, key) && key !== except) {
__defProp(to, key, {
get: (k => from[k]).bind(null, key),
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
}
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
value: mod,
enumerable: true
}) : target, mod));
//#endregion
let react = require("react");
let react$1 = __toESM(react, 1);
react = __toESM(react);
let react_error_boundary = require("react-error-boundary");
let react_jsx_runtime = require("react/jsx-runtime");
//#region src/FeatureFlagsProvider.tsx
var FeatureFlagsContext = react.createContext({
features: [],
setFeatures: () => {}
});
var FeatureFlagsProvider = ({
children,
loadFeatures
}) => {
const [features, setFeatures] = react.useState([]);
react.useEffect(() => {
loadFeatures?.().then(features => {
return setFeatures(features);
});
}, [loadFeatures]);
return /* @__PURE__ */(0, react_jsx_runtime.jsx)(FeatureFlagsContext.Provider, {
value: {
features,
setFeatures
},
children
});
};
//#endregion
//#region src/useFeatureFlag.ts
var useFeatureFlag = name => {
const {
features
} = react$1.useContext(FeatureFlagsContext);
return features.includes(name);
};
//#endregion
//#region src/FeatureFlag.tsx
var FeatureFlag = ({
name,
children,
fallback = null,
errorFallback = null
}) => {
if (!useFeatureFlag(name)) return fallback;
return /* @__PURE__ */(0, react_jsx_runtime.jsx)(react_error_boundary.ErrorBoundary, {
fallback: errorFallback,
children
});
};
//#endregion
//#region src/useUpdateFeatures.ts
/**
* If you want to update the feature flags on React environment
* (after the initial render and providers), you can use this hook.
*/
var useUpdateFeatures = () => {
const {
setFeatures
} = react$1.useContext(FeatureFlagsContext);
return {
updateFeatures: setFeatures
};
};
//#endregion
exports.FeatureFlag = FeatureFlag;
exports.FeatureFlagsProvider = FeatureFlagsProvider;
exports.useFeatureFlag = useFeatureFlag;
exports.useUpdateFeatures = useUpdateFeatures;