@arnosaine/is
Version:
Feature Flags, Roles and Permissions-based rendering, A/B Testing, Experimental Features, and more in React.
64 lines • 2.33 kB
JavaScript
import { curry } from "lodash-es";
import { useMatches, useRouteLoaderData } from "react-router";
export * from "./utils.js";
export function __create(useValues, defaultConditions, options = {}) {
const { method = "some" } = options;
// Curried comparison function
const is = curry((values, conditions) => Object.entries({
...defaultConditions,
...conditions,
})
.filter(([, condition]) => typeof condition !== "undefined")
.every(([name, condition]) => {
const value = values[name];
if (Array.isArray(value)) {
if (Array.isArray(condition)) {
return condition[method]((cond) => value.includes(cond));
}
return value.includes(condition);
}
if (Array.isArray(condition)) {
return condition.includes(value);
}
if (typeof value === "boolean") {
return value === Boolean(condition);
}
else {
return value === condition;
}
}));
// Hook
const useIs = (conditions) => is(useValues(), conditions);
// Component
const Is = ({ children = null, fallback = null, ...conditions }) => useIs(conditions) ? children : fallback;
return { Is, useIs, is };
}
export function create(useValues, defaultConditions, options = {}) {
const { Is, useIs } = __create(useValues, defaultConditions, options);
return [Is, useIs];
}
export function createFromLoader(loadValues, defaultConditions, options = {}) {
const { prop = "__is_values" } = options;
// The hook and the component get values from the root loader
const useValues = () => {
const root = useMatches()[0];
const { routeId = root?.id ?? "root" } = options;
const routeLoaderData = useRouteLoaderData(routeId);
return (
// Deprecated
routeLoaderData?.__is ??
//
routeLoaderData?.[prop] ??
{});
};
const { Is, useIs, is } = __create(useValues, defaultConditions, options);
async function loadIs(args) {
const values = await loadValues(args);
return Object.assign(is(values), {
__values: values, // Deprecated
[prop]: values,
});
}
return [Is, useIs, loadIs];
}
//# sourceMappingURL=main.js.map