import * as React from 'react';
import { Spinner, Box, Text, Heading } from '@gluestack-ui/themed';
import { PermissionType } from 'common';
import { IPreDefinedPermissions } from '@adminide-stack/core';
import { get } from 'lodash-es';
import { usePermissionAutoFetch } from '@adminide-stack/platform-client';
export enum WithPermissionBehaviour {
hide,
showUnAuthorized,
showAlternative,
}
export interface IWithPermissionProps {
children?: React.ReactElement;
permissionKeys: IPreDefinedPermissions[];
permissionTypes?: PermissionType[];
behaviour?: WithPermissionBehaviour;
message?: string;
alternative?: React.ReactElement;
render?: React.FunctionComponent<{ hasPermission: boolean }>;
}
export const WithPermission = ({
permissionKeys,
children,
permissionTypes = [PermissionType.Allow],
behaviour = WithPermissionBehaviour.hide,
message = "You don't have permission to access this resource, contact owner",
alternative,
render,
}: IWithPermissionProps) => {
// const { data: permissions, loading: permissionLoading } = usePermissionAutoFetch();
const { permissions, loading: permissionLoading } = usePermissionAutoFetch();
const hasPermission = React.useMemo(() => {
return permissionKeys.some((key) => permissionTypes.includes(get(permissions?.resolveConfiguration, key)));
}, [permissions, permissionTypes, permissionKeys]);
console.log('hasPermission', hasPermission);
console.log('permissions', JSON.stringify(permissions));
if (permissionLoading) {
return ;
}
if (typeof render === 'function') {
return render({ hasPermission });
}
if (hasPermission) {
return children;
}
if (behaviour === WithPermissionBehaviour.showAlternative) {
return alternative;
}
if (behaviour === WithPermissionBehaviour.showUnAuthorized) {
if (permissionLoading) {
return ;
}
return (
Missing Permission
{message}
);
}
return null;
};
WithPermission.defaultProps = {
permissionTypes: [PermissionType.Allow],
behaviour: WithPermissionBehaviour.hide,
message: "You don't have permission to access this resource, contact owner",
disabledProps: {
disabled: true,
},
};
export const WithPermissionContainer = React.memo((props: IWithPermissionProps) => );
export default WithPermissionContainer;
// export const WithPermissionContainer = (props: IWithPermissionProps) => ;