UNPKG

react-antd-admin-panel

Version:

Modern TypeScript-first React admin panel builder with Ant Design 6

1 lines 7.8 kB
{"version":3,"file":"useAccess-Bu6PpWEB.cjs","sources":["../src/hooks/useAccess.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\r\nimport { useUser } from '../main/MainContext';\r\n\r\n/**\r\n * Feature-based access check configuration\r\n */\r\nexport interface FeatureAccess {\r\n /** Feature name/identifier */\r\n feature: string;\r\n /** Required access level (higher = more permissions) */\r\n level?: number;\r\n}\r\n\r\n/**\r\n * Access check configuration - can be feature-based or role-based\r\n */\r\nexport type AccessCheck = \r\n | FeatureAccess\r\n | { role: string }\r\n | { roles: string[] }\r\n | { permission: string }\r\n | { permissions: string[] };\r\n\r\n/**\r\n * Return type for the useAccess hook\r\n */\r\nexport interface UseAccessResult {\r\n /** Check if user can access based on configuration */\r\n canAccess: (check: AccessCheck) => boolean;\r\n /** Check if user has a specific role */\r\n hasRole: (role: string) => boolean;\r\n /** Check if user has any of the specified roles */\r\n hasAnyRole: (roles: string[]) => boolean;\r\n /** Check if user has a specific permission */\r\n hasPermission: (permission: string) => boolean;\r\n /** Check if user has all specified permissions */\r\n hasAllPermissions: (permissions: string[]) => boolean;\r\n /** Check if user has any of the specified permissions */\r\n hasAnyPermission: (permissions: string[]) => boolean;\r\n /** Check if user has access to a feature with optional level */\r\n hasFeature: (feature: string, level?: number) => boolean;\r\n /** Whether user is authenticated */\r\n isAuthenticated: boolean;\r\n /** Current user's role */\r\n currentRole: string | undefined;\r\n}\r\n\r\n/**\r\n * useAccess - React hook for permission and access control checks\r\n * \r\n * Provides functions to check user roles, permissions, and feature access.\r\n * Integrates with the UserState from Main context.\r\n * \r\n * @returns Hook result with access check functions\r\n * \r\n * @example\r\n * ```tsx\r\n * // Basic role check\r\n * const { hasRole, isAuthenticated } = useAccess();\r\n * if (!isAuthenticated) return <LoginPage />;\r\n * if (hasRole('admin')) return <AdminPanel />;\r\n * \r\n * // Permission check\r\n * const { hasPermission } = useAccess();\r\n * const canEdit = hasPermission('users.edit');\r\n * \r\n * // Feature-based access\r\n * const { canAccess } = useAccess();\r\n * if (canAccess({ feature: 'Users', level: 3 })) {\r\n * // Show delete button\r\n * }\r\n * \r\n * // Multiple roles\r\n * const { hasAnyRole } = useAccess();\r\n * if (hasAnyRole(['admin', 'manager'])) {\r\n * // Show management features\r\n * }\r\n * \r\n * // Combined check\r\n * const { canAccess } = useAccess();\r\n * <button disabled={!canAccess({ role: 'admin' })}>\r\n * Admin Action\r\n * </button>\r\n * ```\r\n */\r\nexport function useAccess(): UseAccessResult {\r\n const user = useUser();\r\n\r\n /**\r\n * Check if user has a specific role\r\n */\r\n const hasRole = useCallback((role: string): boolean => {\r\n return user?.role === role;\r\n }, [user?.role]);\r\n\r\n /**\r\n * Check if user has any of the specified roles\r\n */\r\n const hasAnyRole = useCallback((roles: string[]): boolean => {\r\n if (!user?.role) return false;\r\n return roles.includes(user.role);\r\n }, [user?.role]);\r\n\r\n /**\r\n * Check if user has a specific permission\r\n */\r\n const hasPermission = useCallback((permission: string): boolean => {\r\n return user?.permissions?.includes(permission) ?? false;\r\n }, [user?.permissions]);\r\n\r\n /**\r\n * Check if user has all specified permissions\r\n */\r\n const hasAllPermissions = useCallback((permissions: string[]): boolean => {\r\n if (!user?.permissions) return false;\r\n return permissions.every(p => user.permissions!.includes(p));\r\n }, [user?.permissions]);\r\n\r\n /**\r\n * Check if user has any of the specified permissions\r\n */\r\n const hasAnyPermission = useCallback((permissions: string[]): boolean => {\r\n if (!user?.permissions) return false;\r\n return permissions.some(p => user.permissions!.includes(p));\r\n }, [user?.permissions]);\r\n\r\n /**\r\n * Check if user has access to a feature with optional level\r\n * \r\n * Features are stored in user.features as Record<string, number>\r\n * where the number represents the access level\r\n */\r\n const hasFeature = useCallback((feature: string, level: number = 1): boolean => {\r\n if (!user?.features) return false;\r\n const userLevel = user.features[feature];\r\n if (userLevel === undefined) return false;\r\n return userLevel >= level;\r\n }, [user?.features]);\r\n\r\n /**\r\n * Unified access check supporting multiple check types\r\n */\r\n const canAccess = useCallback((check: AccessCheck): boolean => {\r\n // Not authenticated = no access\r\n if (!user) return false;\r\n\r\n // Feature-based check\r\n if ('feature' in check) {\r\n return hasFeature(check.feature, check.level);\r\n }\r\n\r\n // Single role check\r\n if ('role' in check) {\r\n return hasRole(check.role);\r\n }\r\n\r\n // Multiple roles check (any)\r\n if ('roles' in check) {\r\n return hasAnyRole(check.roles);\r\n }\r\n\r\n // Single permission check\r\n if ('permission' in check) {\r\n return hasPermission(check.permission);\r\n }\r\n\r\n // Multiple permissions check (all)\r\n if ('permissions' in check) {\r\n return hasAllPermissions(check.permissions);\r\n }\r\n\r\n return false;\r\n }, [user, hasFeature, hasRole, hasAnyRole, hasPermission, hasAllPermissions]);\r\n\r\n /**\r\n * Whether user is authenticated\r\n */\r\n const isAuthenticated = useMemo(() => user !== null, [user]);\r\n\r\n /**\r\n * Current user's role\r\n */\r\n const currentRole = useMemo(() => user?.role, [user?.role]);\r\n\r\n return {\r\n canAccess,\r\n hasRole,\r\n hasAnyRole,\r\n hasPermission,\r\n hasAllPermissions,\r\n hasAnyPermission,\r\n hasFeature,\r\n isAuthenticated,\r\n currentRole,\r\n };\r\n}\r\n"],"names":["useUser","useCallback","useMemo"],"mappings":";;;AAqFO,SAAS,YAA6B;AAC3C,QAAM,OAAOA,YAAAA,QAAA;AAKb,QAAM,UAAUC,kBAAY,CAAC,SAA0B;AACrD,YAAO,6BAAM,UAAS;AAAA,EACxB,GAAG,CAAC,6BAAM,IAAI,CAAC;AAKf,QAAM,aAAaA,kBAAY,CAAC,UAA6B;AAC3D,QAAI,EAAC,6BAAM,MAAM,QAAO;AACxB,WAAO,MAAM,SAAS,KAAK,IAAI;AAAA,EACjC,GAAG,CAAC,6BAAM,IAAI,CAAC;AAKf,QAAM,gBAAgBA,kBAAY,CAAC,eAAgC;;AACjE,aAAO,kCAAM,gBAAN,mBAAmB,SAAS,gBAAe;AAAA,EACpD,GAAG,CAAC,6BAAM,WAAW,CAAC;AAKtB,QAAM,oBAAoBA,kBAAY,CAAC,gBAAmC;AACxE,QAAI,EAAC,6BAAM,aAAa,QAAO;AAC/B,WAAO,YAAY,MAAM,CAAA,MAAK,KAAK,YAAa,SAAS,CAAC,CAAC;AAAA,EAC7D,GAAG,CAAC,6BAAM,WAAW,CAAC;AAKtB,QAAM,mBAAmBA,kBAAY,CAAC,gBAAmC;AACvE,QAAI,EAAC,6BAAM,aAAa,QAAO;AAC/B,WAAO,YAAY,KAAK,CAAA,MAAK,KAAK,YAAa,SAAS,CAAC,CAAC;AAAA,EAC5D,GAAG,CAAC,6BAAM,WAAW,CAAC;AAQtB,QAAM,aAAaA,MAAAA,YAAY,CAAC,SAAiB,QAAgB,MAAe;AAC9E,QAAI,EAAC,6BAAM,UAAU,QAAO;AAC5B,UAAM,YAAY,KAAK,SAAS,OAAO;AACvC,QAAI,cAAc,OAAW,QAAO;AACpC,WAAO,aAAa;AAAA,EACtB,GAAG,CAAC,6BAAM,QAAQ,CAAC;AAKnB,QAAM,YAAYA,kBAAY,CAAC,UAAgC;AAE7D,QAAI,CAAC,KAAM,QAAO;AAGlB,QAAI,aAAa,OAAO;AACtB,aAAO,WAAW,MAAM,SAAS,MAAM,KAAK;AAAA,IAC9C;AAGA,QAAI,UAAU,OAAO;AACnB,aAAO,QAAQ,MAAM,IAAI;AAAA,IAC3B;AAGA,QAAI,WAAW,OAAO;AACpB,aAAO,WAAW,MAAM,KAAK;AAAA,IAC/B;AAGA,QAAI,gBAAgB,OAAO;AACzB,aAAO,cAAc,MAAM,UAAU;AAAA,IACvC;AAGA,QAAI,iBAAiB,OAAO;AAC1B,aAAO,kBAAkB,MAAM,WAAW;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,YAAY,SAAS,YAAY,eAAe,iBAAiB,CAAC;AAK5E,QAAM,kBAAkBC,MAAAA,QAAQ,MAAM,SAAS,MAAM,CAAC,IAAI,CAAC;AAK3D,QAAM,cAAcA,MAAAA,QAAQ,MAAM,6BAAM,MAAM,CAAC,6BAAM,IAAI,CAAC;AAE1D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;"}