UNPKG

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
'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 };