react-antd-admin-panel
Version:
Modern TypeScript-first React admin panel builder with Ant Design 6
1 lines • 4.39 kB
Source Map (JSON)
{"version":3,"file":"Protected-Cf9XjIbv.cjs","sources":["../src/access/Protected.tsx"],"sourcesContent":["import React, { ReactNode } from 'react';\r\nimport { useAccess } from '../hooks/useAccess';\r\n\r\n/**\r\n * Props for the AccessGuard component\r\n */\r\nexport interface AccessGuardProps {\r\n /** Children to render when access is granted */\r\n children: ReactNode;\r\n /** Fallback content when access is denied (optional) */\r\n fallback?: ReactNode;\r\n /** Single role to check */\r\n role?: string;\r\n /** Multiple roles to check (user needs any one) */\r\n roles?: string[];\r\n /** Single permission to check */\r\n permission?: string;\r\n /** Multiple permissions to check (user needs all) */\r\n permissions?: string[];\r\n /** Feature name for feature-based access */\r\n feature?: string;\r\n /** Required access level for feature (default: 1) */\r\n level?: number;\r\n /** Whether user must be authenticated (default: true when using any check) */\r\n requireAuth?: boolean;\r\n}\r\n\r\n/**\r\n * AccessGuard - Component for conditional rendering based on access control\r\n * \r\n * Wraps children and only renders them if the user has the required\r\n * role, permission, or feature access level.\r\n * \r\n * @example\r\n * ```tsx\r\n * // Role-based protection\r\n * <Protected role=\"admin\">\r\n * <DeleteButton />\r\n * </Protected>\r\n * \r\n * // Permission-based protection\r\n * <Protected permission=\"users.delete\">\r\n * <DeleteButton />\r\n * </Protected>\r\n * \r\n * // Feature with level\r\n * <Protected feature=\"Users\" level={3}>\r\n * <DeleteButton />\r\n * </Protected>\r\n * \r\n * // Multiple roles (any match)\r\n * <Protected roles={['admin', 'manager']}>\r\n * <ManagePanel />\r\n * </Protected>\r\n * \r\n * // With fallback content\r\n * <Protected role=\"admin\" fallback={<span>Admin only</span>}>\r\n * <AdminPanel />\r\n * </Protected>\r\n * \r\n * // Multiple permissions (all required)\r\n * <Protected permissions={['users.read', 'users.write']}>\r\n * <EditForm />\r\n * </Protected>\r\n * ```\r\n */\r\nexport function AccessGuard({\r\n children,\r\n fallback = null,\r\n role,\r\n roles,\r\n permission,\r\n permissions,\r\n feature,\r\n level = 1,\r\n requireAuth,\r\n}: AccessGuardProps): React.ReactElement | null {\r\n const access = useAccess();\r\n\r\n // Determine if auth is required\r\n const needsAuth = requireAuth ?? (\r\n role !== undefined ||\r\n roles !== undefined ||\r\n permission !== undefined ||\r\n permissions !== undefined ||\r\n feature !== undefined\r\n );\r\n\r\n // Check authentication first\r\n if (needsAuth && !access.isAuthenticated) {\r\n return fallback as React.ReactElement | null;\r\n }\r\n\r\n // Check single role\r\n if (role !== undefined && !access.hasRole(role)) {\r\n return fallback as React.ReactElement | null;\r\n }\r\n\r\n // Check multiple roles (any match)\r\n if (roles !== undefined && !access.hasAnyRole(roles)) {\r\n return fallback as React.ReactElement | null;\r\n }\r\n\r\n // Check single permission\r\n if (permission !== undefined && !access.hasPermission(permission)) {\r\n return fallback as React.ReactElement | null;\r\n }\r\n\r\n // Check multiple permissions (all required)\r\n if (permissions !== undefined && !access.hasAllPermissions(permissions)) {\r\n return fallback as React.ReactElement | null;\r\n }\r\n\r\n // Check feature access\r\n if (feature !== undefined && !access.hasFeature(feature, level)) {\r\n return fallback as React.ReactElement | null;\r\n }\r\n\r\n // All checks passed, render children\r\n return <>{children}</>;\r\n}\r\n\r\nexport default AccessGuard;"],"names":["useAccess"],"mappings":";;;AAkEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AACF,GAAgD;AAC9C,QAAM,SAASA,UAAAA,UAAA;AAGf,QAAM,YAAY,gBAChB,SAAS,UACT,UAAU,UACV,eAAe,UACf,gBAAgB,UAChB,YAAY;AAId,MAAI,aAAa,CAAC,OAAO,iBAAiB;AACxC,WAAO;AAAA,EACT;AAGA,MAAI,SAAS,UAAa,CAAC,OAAO,QAAQ,IAAI,GAAG;AAC/C,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,UAAa,CAAC,OAAO,WAAW,KAAK,GAAG;AACpD,WAAO;AAAA,EACT;AAGA,MAAI,eAAe,UAAa,CAAC,OAAO,cAAc,UAAU,GAAG;AACjE,WAAO;AAAA,EACT;AAGA,MAAI,gBAAgB,UAAa,CAAC,OAAO,kBAAkB,WAAW,GAAG;AACvE,WAAO;AAAA,EACT;AAGA,MAAI,YAAY,UAAa,CAAC,OAAO,WAAW,SAAS,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AAGA,+DAAU,UAAS;AACrB;;"}