react-antd-admin-panel
Version:
Modern TypeScript-first React admin panel builder with Ant Design 6
78 lines • 2.4 kB
JavaScript
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
import { useAccess } from '../hooks/useAccess';
/**
* AccessGuard - Component for conditional rendering based on access control
*
* Wraps children and only renders them if the user has the required
* role, permission, or feature access level.
*
* @example
* ```tsx
* // Role-based protection
* <Protected role="admin">
* <DeleteButton />
* </Protected>
*
* // Permission-based protection
* <Protected permission="users.delete">
* <DeleteButton />
* </Protected>
*
* // Feature with level
* <Protected feature="Users" level={3}>
* <DeleteButton />
* </Protected>
*
* // Multiple roles (any match)
* <Protected roles={['admin', 'manager']}>
* <ManagePanel />
* </Protected>
*
* // With fallback content
* <Protected role="admin" fallback={<span>Admin only</span>}>
* <AdminPanel />
* </Protected>
*
* // Multiple permissions (all required)
* <Protected permissions={['users.read', 'users.write']}>
* <EditForm />
* </Protected>
* ```
*/
export function AccessGuard({ children, fallback = null, role, roles, permission, permissions, feature, level = 1, requireAuth, }) {
const access = useAccess();
// Determine if auth is required
const needsAuth = requireAuth ?? (role !== undefined ||
roles !== undefined ||
permission !== undefined ||
permissions !== undefined ||
feature !== undefined);
// Check authentication first
if (needsAuth && !access.isAuthenticated) {
return fallback;
}
// Check single role
if (role !== undefined && !access.hasRole(role)) {
return fallback;
}
// Check multiple roles (any match)
if (roles !== undefined && !access.hasAnyRole(roles)) {
return fallback;
}
// Check single permission
if (permission !== undefined && !access.hasPermission(permission)) {
return fallback;
}
// Check multiple permissions (all required)
if (permissions !== undefined && !access.hasAllPermissions(permissions)) {
return fallback;
}
// Check feature access
if (feature !== undefined && !access.hasFeature(feature, level)) {
return fallback;
}
// All checks passed, render children
return _jsx(_Fragment, { children: children });
}
export default AccessGuard;
//# sourceMappingURL=Protected.js.map