pricing4react
Version:
A library of components that ease the integration of feature toggling driven by pricing plans into your React application's UI.
96 lines (95 loc) • 4.13 kB
JavaScript
;
exports.__esModule = true;
exports.useGenericFeature = void 0;
var jsx_runtime_1 = require("react/jsx-runtime");
var react_1 = require("react");
function useGenericFeature(options) {
var _a, _b, _c, _d;
var _e = (0, react_1.useState)(false), errored = _e[0], setErrored = _e[1];
var _f = (0, react_1.useState)(true), isLoading = _f[0], setIsLoading = _f[1];
// Index of the feature that was evaluated to true
var _g = (0, react_1.useState)(), value = _g[0], setValue = _g[1];
if (!options.on) {
throw new Error("On Expression list must be provided");
}
(0, react_1.useEffect)(function () {
if (options.on) {
setIsLoading(true);
// Get the feature value for each provided expression
var expressionPromises = options.on.map(function (on) { return on.expression.eval(); });
if (expressionPromises.length === 0) {
setIsLoading(false);
setValue(undefined);
return;
}
// Wait for all the promises to resolve
Promise.all(expressionPromises).then(function (values) {
// Log any of them that might be in error
values.forEach(function (value) {
if (value.isError) {
console.warn("Error evaluating feature", value.errorMessage);
}
});
var isErrored = values.some(function (value) { return value.isError; });
if (isErrored) {
setErrored(true);
setIsLoading(false);
return;
}
// Find the first expression that's true, and set the value to its index
var index = values.findIndex(function (value) { return value.value === true; });
if (index !== -1) {
setValue(index);
}
else {
// Since none of them are true, set the value to undefined since we'll be in the default value
setValue(undefined);
}
setIsLoading(false);
});
}
else {
setErrored(true);
setIsLoading(false);
}
}, [options.key]);
// const returnedComponent = useMemo(() => {
// let returnedComponent: React.ReactNode;
// if (errored) {
// returnedComponent = options.error ?? <></>;
// } else if (isLoading) {
// returnedComponent = options.loading ?? <></>;
// } else {
// // If we have a value, return the on expression at that index
// if (value !== undefined) {
// returnedComponent = options.on[value].on ?? <></>;
// } else {
// // Otherwise, return the default value
// returnedComponent = options.default ?? <></>;
// }
// }
// // debugger;
// return <>{returnedComponent}</>;
// }, [options.on, options.default, options.error, options.loading, value]);
var returnedComponent;
if (errored) {
returnedComponent = (_a = options.error) !== null && _a !== void 0 ? _a : (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {});
}
else if (isLoading) {
returnedComponent = (_b = options.loading) !== null && _b !== void 0 ? _b : (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {});
}
else {
// If we have a value, return the on expression at that index
if (value !== undefined) {
returnedComponent = (_c = options.on[value].on) !== null && _c !== void 0 ? _c : (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {});
}
else {
// Otherwise, return the default value
returnedComponent = (_d = options["default"]) !== null && _d !== void 0 ? _d : (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {});
}
}
// debugger;
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: returnedComponent });
// return returnedComponent;
}
exports.useGenericFeature = useGenericFeature;