UNPKG

@availity/authorize

Version:

Check user permissions to see if the current user is authorized to see your content.

124 lines (119 loc) 4.31 kB
// src/Authorize.tsx import BlockUi from "@availity/block-ui"; // src/useAuthorize.ts import { useQuery, useQueryClient } from "@tanstack/react-query"; // src/api.ts import { avUserPermissionsApi, avRegionsApi } from "@availity/api-axios"; var getRegion = async (region) => { if (region === true) { const resp = await avRegionsApi.getCurrentRegion(); return resp?.data?.regions?.[0]?.id; } return region || void 0; }; var getPermissions = async (permissions, region) => { if (!permissions) return {}; const response = await avUserPermissionsApi.getPermissions(permissions, region); return response.reduce((prev, cur) => { prev[cur.id] = cur; return prev; }, {}); }; var checkPermission = (permission, resources, organizationId, customerId) => { if (!permission) return false; let isAuthorizedForCustomerId = true; let isAuthorizedForOrganizationId = true; let isAuthorizedForResources = true; if (organizationId) { isAuthorizedForOrganizationId = permission.organizations.some(({ id: orgId }) => orgId === organizationId); } if (customerId) { isAuthorizedForCustomerId = permission.organizations.some( ({ customerId: orgCustomerId }) => orgCustomerId === customerId ); } if (resources !== void 0) { const resourceSets = Array.isArray(resources) ? resources : [resources]; isAuthorizedForResources = resourceSets.length === 0 || resourceSets.some((resourceSet) => { if (Array.isArray(resourceSet)) { return resourceSet.every( (resource) => permission.organizations.some( ({ resources: orgResources = [] }) => orgResources.some(({ id }) => `${id}` === `${resource}`) ) ); } return permission.organizations.some( ({ resources: orgResources = [] }) => orgResources.some(({ id }) => `${id}` === `${resourceSet}`) ); }); } return isAuthorizedForCustomerId && isAuthorizedForOrganizationId && isAuthorizedForResources; }; var checkPermissions = async (permissions, region, resources, organizationId, customerId) => { if (!permissions) return false; permissions = Array.isArray(permissions) ? permissions : [permissions]; const response = await getPermissions(permissions, region); const authorized = permissions.some((permissionSet) => { if (Array.isArray(permissionSet)) { return permissionSet.every( (permission) => checkPermission(response[permission], resources, organizationId, customerId) ); } return checkPermission(response[permissionSet], resources, organizationId, customerId); }); return authorized; }; // src/useAuthorize.ts var useAuthorize = (permissions, parameters = {}, options) => { const queryClient = useQueryClient(); const { organizationId, customerId, region = true, resources } = parameters; const { data: authorized = false, isLoading } = useQuery({ queryKey: ["useAuthorize", permissions, region, resources, organizationId, customerId], queryFn: async () => { const currentRegion = region ? await queryClient.fetchQuery({ queryKey: ["region"], queryFn: () => getRegion(region) }) : void 0; return checkPermissions(permissions, currentRegion, resources, organizationId, customerId); }, enabled: permissions.length > 0, ...options }); return { authorized, isLoading }; }; var useAuthorize_default = useAuthorize; // src/Authorize.tsx import { Fragment, jsx } from "react/jsx-runtime"; var Authorize = ({ permissions, resources, customerId, organizationId, region = true, loader, negate, children = null, unauthorized = null, queryOptions }) => { const { authorized, isLoading } = useAuthorize_default( permissions, { customerId, organizationId, region, resources }, queryOptions ); if (isLoading) { if (loader) return loader === true ? /* @__PURE__ */ jsx(BlockUi, { blocking: true }) : /* @__PURE__ */ jsx(Fragment, { children: loader }); return null; } if ((authorized || negate) && !(authorized && negate)) { return /* @__PURE__ */ jsx(Fragment, { children }); } return /* @__PURE__ */ jsx(Fragment, { children: unauthorized }); }; var Authorize_default = Authorize; export { Authorize_default as default, useAuthorize_default as useAuthorize };