saleor-dashboard/src/components/RequirePermissions.tsx

62 lines
1.5 KiB
TypeScript
Raw Normal View History

// @ts-strict-ignore
import { useUserPermissions } from "@dashboard/auth/hooks/useUserPermissions";
import { PermissionEnum, UserPermissionFragment } from "@dashboard/graphql";
import React from "react";
2019-10-08 14:19:14 +00:00
const findPerm = (permList, perm) =>
permList.find(userPerm => userPerm.code === perm);
2019-10-08 14:19:14 +00:00
export function hasPermissions(
Use graphql-codegen (#1874) * Use generated hooks in apps * Remove unused files * Use proper types in apps * Use generated hooks in attributes * Use generated hooks in auth module * Use generated hooks in categories * Use generated hooks in channels * Use generated types in collections * Remove legacy types from background tasks * Use generated hooks in customers * Use generated hooks in discounts * Use generated hook in file upload * Use generated types in gift cards * Use generated types in home * Use generated hooks in navigation * Use generated hooks in orders * Use generated hooks in pages * Use generated hooks in page types * Use generated hooks in permission groups * Use generated hooks in plugins * Use generated hooks in products * Use fragment to mark product variants * Improve code a bit * Use generated hooks in page types * Use generated types in searches * Use generated hooks in shipping * Use generated hooks in site settings * Use generated hooks in staff members * Use generated hooks in taxes * Place all gql generated files in one directory * Use generated hooks in translations * Use global types from new generated module * Use generated hooks in warehouses * Use generated hooks in webhooks * Use generated fragment types * Unclutter types * Remove hoc components * Split hooks and types * Fetch introspection file * Delete obsolete schema file * Fix rebase artifacts * Fix autoreplace * Fix auth provider tests * Fix urls * Remove leftover types * Fix rebase artifacts
2022-03-09 08:56:55 +00:00
userPermissions: UserPermissionFragment[],
requiredPermissions: PermissionEnum[],
2019-10-08 14:19:14 +00:00
): boolean {
return requiredPermissions.reduce(
(acc, perm) => acc && !!findPerm(userPermissions, perm),
true,
2019-10-08 14:19:14 +00:00
);
}
export function hasOneOfPermissions(
userPermissions: UserPermissionFragment[],
givenPermissions: PermissionEnum[],
): boolean {
return givenPermissions.some(perm => !!findPerm(userPermissions, perm));
}
2019-10-08 14:19:14 +00:00
export interface RequirePermissionsProps {
children: React.ReactNode | React.ReactNodeArray;
requiredPermissions?: PermissionEnum[];
oneOfPermissions?: PermissionEnum[];
2019-10-08 14:19:14 +00:00
}
const RequirePermissions: React.FC<RequirePermissionsProps> = ({
children,
requiredPermissions,
oneOfPermissions,
}) => {
const userPermissions = useUserPermissions();
if (!userPermissions) {
return null;
}
if (
requiredPermissions &&
hasPermissions(userPermissions, requiredPermissions)
) {
return <>{children}</>;
}
if (
oneOfPermissions &&
hasOneOfPermissions(userPermissions, oneOfPermissions)
) {
return <>{children}</>;
}
return null;
};
2019-10-08 14:19:14 +00:00
RequirePermissions.displayName = "RequirePermissions";
export default RequirePermissions;