{"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;;"}