permix
Version:
Permix is a lightweight, framework-agnostic, type-safe permissions management library for JavaScript applications on the client and server sides.
110 lines (103 loc) • 2.66 kB
JavaScript
'use client';
import * as React from 'react';
import { v as validatePermix, b as checkWithRules, g as getRules } from '../shared/permix.Q-O041RP.mjs';
import { hydrate } from '../core/index.mjs';
const Context = /*#__PURE__*/React.createContext(null);
function usePermixContext() {
const context = React.useContext(Context);
if (!context) {
throw new Error('[Permix]: Looks like you forgot to wrap your app with <PermixProvider>');
}
return context;
}
/**
* Hook that provides the Permix reactive methods to your React components.
*
* @link https://permix.letstri.dev/docs/integrations/react
*/
function usePermix(permix) {
validatePermix(permix);
const {
permix: permixContext,
isReady,
rules
} = usePermixContext();
validatePermix(permixContext);
const check = React.useCallback((...args) => {
return checkWithRules(rules ?? getRules(permixContext), ...args);
}, [permixContext, rules]);
return {
check,
isReady
};
}
/**
* Provider that provides the Permix context to your React components.
*
* @link https://permix.letstri.dev/docs/integrations/react
*/
function PermixProvider({
children,
permix
}) {
validatePermix(permix);
const [context, setContext] = React.useState(() => ({
permix,
isReady: permix.isReady(),
rules: getRules(permix)
}));
React.useEffect(() => {
const setup = permix.hook('setup', () => setContext(c => ({
...c,
rules: getRules(permix)
})));
const ready = permix.hook('ready', () => setContext(c => ({
...c,
isReady: permix.isReady()
})));
return () => {
setup();
ready();
};
}, [permix]);
return (
/*#__PURE__*/
// eslint-disable-next-line react/no-context-provider
React.createElement(Context.Provider, {
value: context
}, children)
);
}
function PermixHydrate({
children,
state
}) {
const {
permix
} = usePermixContext();
validatePermix(permix);
React.useMemo(() => hydrate(permix, state), [permix, state]);
return children;
}
// eslint-disable-next-line react-refresh/only-export-components
function createComponents(permix) {
function Check({
children,
entity,
action,
data,
otherwise = null,
reverse = false
}) {
const {
check
} = usePermix(permix);
const hasPermission = check(entity, action, data);
return /*#__PURE__*/React.createElement(React.Fragment, null, reverse ? hasPermission ? otherwise : children : hasPermission ? children : otherwise);
}
Check.displayName = 'Check';
return {
Check
};
}
export { PermixHydrate, PermixProvider, createComponents, usePermix };