UNPKG

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
"use strict"; 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;