{"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"}