@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
JavaScript
// 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
};