UNPKG

permission-js-react

Version:

React component for permission-js which makes it easy to add permissions in any React application

1 lines 3.88 kB
{"version":3,"file":"index.es.mjs","sources":["../src/utils/typedMemo.ts","../src/PermissionFactory.tsx"],"sourcesContent":["import { memo } from \"react\";\r\n\r\nexport const typedMemo: <Component extends React.FC<any>>(\r\n component: Component,\r\n compare?: (\r\n prev: React.ComponentPropsWithoutRef<Component>,\r\n newProps: React.ComponentPropsWithoutRef<Component>\r\n ) => boolean\r\n) => Component = memo;\r\n","import { factoryPermission, BaseActions, BaseConditions, CheckPermissions } from 'permission-js-core'\r\nimport { createContext, PropsWithChildren, useCallback, useContext, useMemo, useState } from 'react'\r\n\r\nimport { PermissionProviderProps, ReturnFactoryPermission } from './types'\r\nimport { typedMemo } from './utils/typedMemo'\r\n\r\nexport function factoryReactPermission<S extends string, A extends BaseActions<S>, C extends BaseConditions<S>>() {\r\n const Context = createContext<ReturnFactoryPermission<S, A, C> | null>(null)\r\n\r\n const PermissionProvider = ({ children }: PermissionProviderProps<S, A, C>) => {\r\n const [contextValue] = useState(() => factoryPermission<S, A, C>())\r\n\r\n const currentChidlren = typeof children === 'function' ? children(contextValue.update) : children\r\n\r\n return <Context.Provider value={contextValue}>{currentChidlren}</Context.Provider>\r\n }\r\n\r\n const usePermission = () => {\r\n const context = useContext(Context)\r\n if (!context) throw new Error('Use subscribing check without PermissionProvider')\r\n\r\n const { subscribe, update } = context\r\n const [, setSignal] = useState(false)\r\n\r\n const subscribedCheck = useMemo(() => subscribe(), [subscribe])\r\n\r\n const trigger = useCallback(() => {\r\n setSignal(state => !state)\r\n }, [])\r\n\r\n const can = useCallback(\r\n <Subjects extends S, Action extends A[Subjects]>(args: CheckPermissions<Subjects, Action, C>) => {\r\n return subscribedCheck({ ...args, signal: trigger })\r\n },\r\n [subscribedCheck, trigger],\r\n )\r\n\r\n return { can, update }\r\n }\r\n\r\n const Can = typedMemo(\r\n <Subjects extends S, Action extends A[Subjects]>({\r\n children,\r\n element = null,\r\n ...args\r\n }: PropsWithChildren<\r\n CheckPermissions<Subjects, Action, C> & {\r\n element?: React.ReactNode\r\n }\r\n >): React.ReactNode => {\r\n const { can } = usePermission()\r\n\r\n const arrArgs = Object.values(args)\r\n const result = useMemo(() => can(args), [...arrArgs, can])\r\n\r\n if (result) {\r\n return children\r\n }\r\n\r\n return element\r\n },\r\n )\r\n\r\n return {\r\n usePermission,\r\n Can,\r\n PermissionProvider,\r\n }\r\n}\r\n"],"names":["typedMemo","memo","factoryReactPermission","Context","createContext","usePermission","context","useContext","Error","subscribe","update","setSignal","useState","subscribedCheck","useMemo","trigger","useCallback","state","can","args","signal","Can","children","element","arrArgs","Object","values","PermissionProvider","contextValue","factoryPermission","currentChidlren","_jsx","Provider","value"],"mappings":"2MAEO,MAAMA,EAMIC,WCFDC,IACd,MAAMC,EAAUC,EAAuD,MAUjEC,EAAgB,KACpB,MAAMC,EAAUC,EAAWJ,GAC3B,IAAKG,EAAS,MAAM,IAAIE,MAAM,oDAE9B,MAAMC,UAAEA,EAASC,OAAEA,GAAWJ,IACrBK,GAAaC,GAAS,GAEzBC,EAAkBC,GAAQ,IAAML,KAAa,CAACA,IAE9CM,EAAUC,GAAY,KAC1BL,GAAUM,IAAUA,GAAM,GACzB,IASH,MAAO,CAAEC,IAPGF,GACuCG,GACxCN,EAAgB,IAAKM,EAAMC,OAAQL,KAE5C,CAACF,EAAiBE,IAGNL,SAAQ,EAGlBW,EAAMrB,GACV,EACEsB,WACAC,UAAU,QACPJ,MAMH,MAAMD,IAAEA,GAAQb,IAEVmB,EAAUC,OAAOC,OAAOP,GAG9B,OAFeL,GAAQ,IAAMI,EAAIC,IAAO,IAAIK,EAASN,IAG5CI,EAGFC,CAAO,IAIlB,MAAO,CACLlB,gBACAgB,MACAM,mBAzDyB,EAAGL,eAC5B,MAAOM,GAAgBhB,GAAS,IAAMiB,MAEhCC,EAAsC,mBAAbR,EAA0BA,EAASM,EAAalB,QAAUY,EAEzF,OAAOS,EAAC5B,EAAQ6B,SAAQ,CAACC,MAAOL,EAAYN,SAAGQ,GAAmC,EAsDtF"}