{"version":3,"file":"RequirePermission.mjs","sources":["../../../../src/lib/auth/authGuards/RequirePermission.tsx"],"sourcesContent":["import React, { memo, type ReactNode } from 'react';\nimport { Navigate } from 'react-router-dom';\nimport { useAuth } from '../useAuth';\nimport { routes } from '@/lib/routing/routes';\nimport { AuthGuardLoading } from './AuthGuardLoading';\nimport type { Permission } from '../types';\n\ninterface RequirePermissionProps {\n  children: ReactNode;\n  /** Single permission required */\n  permission?: Permission;\n  /** All of these permissions required */\n  permissions?: Permission[];\n  /** Any of these permissions required */\n  anyPermission?: Permission[];\n  /** Redirect path if permission check fails */\n  redirectTo?: string;\n  /** Component to show if access denied (not shown during loading) */\n  fallback?: ReactNode;\n}\n\n/**\n * Guard component that requires specific permissions.\n * Redirects if user doesn't have the required permissions.\n *\n * @example\n * ```tsx\n * // Single permission\n * <RequirePermission permission=\"users:write\">\n *   <UserEditor />\n * </RequirePermission>\n *\n * // All permissions required\n * <RequirePermission permissions={['reports:read', 'analytics:view']}>\n *   <AnalyticsDashboard />\n * </RequirePermission>\n *\n * // Any permission (OR logic)\n * <RequirePermission anyPermission={['admin:full', 'settings:manage']}>\n *   <SettingsPage />\n * </RequirePermission>\n *\n * // With access denied fallback\n * <RequirePermission permission=\"billing:manage\" fallback={<UpgradePrompt />}>\n *   <BillingSettings />\n * </RequirePermission>\n * ```\n */\nexport const RequirePermission = memo(\n  ({\n    children,\n    permission,\n    permissions,\n    anyPermission,\n    redirectTo = routes.dashboard,\n    fallback,\n  }: RequirePermissionProps) => {\n    const { isAuthenticated, isLoading, hasPermission, hasAnyPermission } = useAuth();\n\n    if (isLoading) {\n      return <AuthGuardLoading ariaLabel=\"Verifying permission authorization...\" />;\n    }\n\n    if (!isAuthenticated) {\n      return <Navigate to={routes.login} replace />;\n    }\n\n    // Check single permission\n    if (permission !== undefined && permission !== null && !hasPermission(permission)) {\n      if (fallback !== undefined && fallback !== null) return <>{fallback}</>;\n      return <Navigate to={redirectTo} replace />;\n    }\n\n    // Check all permissions required\n    if (permissions !== undefined && permissions !== null && !permissions.every(hasPermission)) {\n      if (fallback !== undefined && fallback !== null) return <>{fallback}</>;\n      return <Navigate to={redirectTo} replace />;\n    }\n\n    // Check any permission required\n    if (anyPermission !== undefined && anyPermission !== null && !hasAnyPermission(anyPermission)) {\n      if (fallback !== undefined && fallback !== null) return <>{fallback}</>;\n      return <Navigate to={redirectTo} replace />;\n    }\n\n    return <>{children}</>;\n  }\n);\n\n/**\n * HOC version of RequirePermission\n */\n// @refresh reset\n// eslint-disable-next-line react-refresh/only-export-components\nexport function withRequirePermission<P extends object>(\n  Component: React.ComponentType<P>,\n  permissionConfig: {\n    permission?: Permission;\n    permissions?: Permission[];\n    anyPermission?: Permission[];\n    redirectTo?: string;\n  }\n): React.ComponentType<P> {\n  return function WithRequirePermission(props: P): React.ReactElement {\n    return (\n      <RequirePermission {...permissionConfig}>\n        <Component {...props} />\n      </RequirePermission>\n    );\n  };\n}\n"],"names":["RequirePermission","memo","children","permission","permissions","anyPermission","redirectTo","routes","fallback","isAuthenticated","isLoading","hasPermission","hasAnyPermission","useAuth","jsx","AuthGuardLoading","Navigate","withRequirePermission","Component","permissionConfig","props"],"mappings":";;;;;;AAgDO,MAAMA,IAAoBC;AAAA,EAC/B,CAAC;AAAA,IACC,UAAAC;AAAA,IACA,YAAAC;AAAA,IACA,aAAAC;AAAA,IACA,eAAAC;AAAA,IACA,YAAAC,IAAaC,EAAO;AAAA,IACpB,UAAAC;AAAA,EAAA,MAC4B;AAC5B,UAAM,EAAE,iBAAAC,GAAiB,WAAAC,GAAW,eAAAC,GAAe,kBAAAC,EAAA,IAAqBC,EAAA;AAExE,WAAIH,IACK,gBAAAI,EAACC,GAAA,EAAiB,WAAU,wCAAA,CAAwC,IAGxEN,IAK2BN,KAAe,QAAQ,CAACQ,EAAcR,CAAU,IAChDK,KAAa,8BAAgB,UAAAA,GAAS,IAC7D,gBAAAM,EAACE,GAAA,EAAS,IAAIV,GAAY,SAAO,IAAC,IAIVF,KAAgB,QAAQ,CAACA,EAAY,MAAMO,CAAa,IACzDH,KAAa,8BAAgB,UAAAA,GAAS,IAC7D,gBAAAM,EAACE,GAAA,EAAS,IAAIV,GAAY,SAAO,IAAC,IAIRD,KAAkB,QAAQ,CAACO,EAAiBP,CAAa,IAC5DG,KAAa,8BAAgB,UAAAA,GAAS,IAC7D,gBAAAM,EAACE,GAAA,EAAS,IAAIV,GAAY,SAAO,IAAC,2BAGjC,UAAAJ,GAAS,sBArBTc,GAAA,EAAS,IAAIT,EAAO,OAAO,SAAO,IAAC;AAAA,EAsB/C;AACF;AAOO,SAASU,EACdC,GACAC,GAMwB;AACxB,SAAO,SAA+BC,GAA8B;AAClE,WACE,gBAAAN,EAACd,KAAmB,GAAGmB,GACrB,4BAACD,GAAA,EAAW,GAAGE,GAAO,EAAA,CACxB;AAAA,EAEJ;AACF;"}