{"version":3,"sources":["../call-control-sdk/lib/components/SDKAccessDenied.tsx","../call-control-sdk/lib/components/SDKPermissionGuard.tsx"],"sourcesContent":["import React from \"react\";\r\nimport { Box, Paper, Typography, useTheme } from \"@mui/material\";\r\nimport { alpha } from \"@mui/material/styles\";\r\nimport LockOutlinedIcon from \"@mui/icons-material/LockOutlined\";\r\n\r\ninterface SDKAccessDeniedProps {\r\n  message?: string;\r\n}\r\n\r\nexport const SDKAccessDenied: React.FC<SDKAccessDeniedProps> = ({\r\n  message = \"You don't have the necessary permissions to view this content.\",\r\n}) => {\r\n  const theme = useTheme();\r\n\r\n  return (\r\n    <Box\r\n      sx={{\r\n        p: 4,\r\n        display: \"flex\",\r\n        flexDirection: \"column\",\r\n        alignItems: \"center\",\r\n        justifyContent: \"center\",\r\n        width: \"100%\",\r\n        height: \"100%\",\r\n        minHeight: 250,\r\n      }}\r\n    >\r\n      <Paper\r\n        elevation={0}\r\n        sx={{\r\n          p: 4,\r\n          display: \"flex\",\r\n          flexDirection: \"column\",\r\n          alignItems: \"center\",\r\n          bgcolor: alpha(theme.palette.error.main, 0.05),\r\n          borderRadius: 3,\r\n          border: \"1px dashed\",\r\n          borderColor: alpha(theme.palette.error.main, 0.3),\r\n          maxWidth: 420,\r\n          textAlign: \"center\",\r\n        }}\r\n      >\r\n        <Box\r\n          sx={{\r\n            bgcolor: alpha(theme.palette.error.main, 0.1),\r\n            color: \"error.main\",\r\n            borderRadius: \"50%\",\r\n            p: 2,\r\n            display: \"flex\",\r\n            mb: 2,\r\n          }}\r\n        >\r\n          <LockOutlinedIcon sx={{ fontSize: 32 }} />\r\n        </Box>\r\n        <Typography variant=\"h6\" color=\"text.primary\" gutterBottom fontWeight=\"600\" sx={{ mb: 1 }}>\r\n          Access Denied\r\n        </Typography>\r\n        <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 0 }}>\r\n          {message}\r\n        </Typography>\r\n      </Paper>\r\n    </Box>\r\n  );\r\n};\r\n","import React from \"react\";\r\nimport { useSDKPermissions } from \"../hooks/useSDKPermissions\";\r\nimport { SDKAccessDenied } from \"./SDKAccessDenied\";\r\n\r\ninterface SDKPermissionGuardProps {\r\n  children?: React.ReactNode;\r\n  /** Single permission code (e.g. \"calls:inbound\") */\r\n  permission?: string;\r\n  /** Multiple permission codes — ANY match grants access by default */\r\n  permissions?: string[];\r\n  /** When true, ALL permissions must be granted */\r\n  requireAll?: boolean;\r\n  /** One or more menu feature codes — ANY match grants access by default */\r\n  menuFeature?: string | string[];\r\n  /** When true, ALL menu features must be enabled */\r\n  requireAllMenus?: boolean;\r\n  /**\r\n   * Permission codes that grant access on their own, short-circuiting BOTH the\r\n   * menu-entitlement and permission gates above (which are otherwise ANDed).\r\n   *\r\n   * Used for the role access codes (\"agent_access:access\",\r\n   * \"supervisor_access:access\"): they mark a login whose landing page this is, and\r\n   * such a login does not necessarily also carry the page's report permission or\r\n   * menu entitlement — without this it would be redirected onto Access Denied.\r\n   */\r\n  accessOverride?: string | string[];\r\n  /** Custom fallback rendered when access is denied */\r\n  fallback?: React.ReactNode;\r\n  /** Show the default Access Denied UI when denied. Defaults to true. */\r\n  showFallback?: boolean;\r\n  /** Callback fired when the guard denies access */\r\n  onDenied?: () => void;\r\n}\r\n\r\nexport const SDKPermissionGuard: React.FC<SDKPermissionGuardProps> = ({\r\n  children,\r\n  permission,\r\n  permissions,\r\n  requireAll = false,\r\n  menuFeature,\r\n  requireAllMenus = false,\r\n  accessOverride,\r\n  fallback,\r\n  showFallback = true,\r\n  onDenied,\r\n}) => {\r\n  const { isLoaded, hasPermission, hasAnyPermission, hasAllPermissions, hasMenuFeature } =\r\n    useSDKPermissions();\r\n\r\n  if (!isLoaded) {\r\n    return (\r\n      <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", minHeight: 400 }}>\r\n        <div style={{ width: 32, height: 32, border: \"2px solid #1A5F6C\", borderTopColor: \"transparent\", borderRadius: \"50%\", animation: \"spin 1s linear infinite\" }} />\r\n      </div>\r\n    );\r\n  }\r\n\r\n  const isAllowed = checkAccess({\r\n    permission,\r\n    permissions,\r\n    requireAll,\r\n    menuFeature,\r\n    requireAllMenus,\r\n    accessOverride,\r\n    hasPermission,\r\n    hasAnyPermission,\r\n    hasAllPermissions,\r\n    hasMenuFeature,\r\n  });\r\n\r\n  if (!isAllowed) {\r\n    onDenied?.();\r\n    if (fallback !== undefined) return <>{fallback}</>;\r\n    if (showFallback) return <SDKAccessDenied />;\r\n    return null;\r\n  }\r\n\r\n  return <>{children}</>;\r\n};\r\n\r\nfunction checkAccess({\r\n  permission,\r\n  permissions,\r\n  requireAll,\r\n  menuFeature,\r\n  requireAllMenus,\r\n  accessOverride,\r\n  hasPermission,\r\n  hasAnyPermission,\r\n  hasAllPermissions,\r\n  hasMenuFeature,\r\n}: {\r\n  permission?: string;\r\n  permissions?: string[];\r\n  requireAll: boolean;\r\n  menuFeature?: string | string[];\r\n  requireAllMenus: boolean;\r\n  accessOverride?: string | string[];\r\n  hasPermission: (p: string) => boolean;\r\n  hasAnyPermission: (p: string[]) => boolean;\r\n  hasAllPermissions: (p: string[]) => boolean;\r\n  hasMenuFeature: (c: string) => boolean;\r\n}): boolean {\r\n  const menuCodes = menuFeature\r\n    ? Array.isArray(menuFeature) ? menuFeature : [menuFeature]\r\n    : [];\r\n\r\n  const hasNoGuards =\r\n    !permission &&\r\n    (!permissions || permissions.length === 0) &&\r\n    menuCodes.length === 0;\r\n\r\n  if (hasNoGuards) return true;\r\n\r\n  // Checked before the gates below: holding one of these codes is sufficient by\r\n  // itself, so a role access code cannot be blocked by a missing report\r\n  // permission or menu entitlement.\r\n  const overrideCodes = accessOverride\r\n    ? Array.isArray(accessOverride) ? accessOverride : [accessOverride]\r\n    : [];\r\n  if (overrideCodes.length > 0 && hasAnyPermission(overrideCodes)) return true;\r\n\r\n  if (menuCodes.length > 0) {\r\n    const menuGranted = requireAllMenus\r\n      ? menuCodes.every((c) => hasMenuFeature(c))\r\n      : menuCodes.some((c) => hasMenuFeature(c));\r\n    if (!menuGranted) return false;\r\n  }\r\n\r\n  if (permission && !hasPermission(permission)) return false;\r\n\r\n  if (permissions && permissions.length > 0) {\r\n    const granted = requireAll ? hasAllPermissions(permissions) : hasAnyPermission(permissions);\r\n    if (!granted) return false;\r\n  }\r\n\r\n  return true;\r\n}\r\n"],"mappings":"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","names":["jsx"]}