{"version":3,"file":"static/js/7276.3c8f4017.chunk.js","mappings":"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","sources":["webpack:///./src/auth/authorization.hook.ts","webpack:///./src/auth/user-info.hooks.ts","webpack:///./src/config/build-config/BuildConfigProvider.tsx","webpack:///./src/config/build-config/build-config-context.ts","webpack:///./src/config/build-config/useBuildConfig.ts","webpack:///./src/config/site-config/SiteConfigProvider.tsx","webpack:///./src/config/site-config/site-config-context.ts","webpack:///./src/config/site-config/useFullStoryConfig.ts","webpack:///./src/config/site-config/useSiteConfig.ts","webpack:///./src/config/usePageTitle.ts","webpack:///./src/config/xvantage-iframe/useIM360Origin.ts","webpack:///./src/config/xvantage-iframe/useInX4AFrame.ts","webpack:///./src/config/xvantage-iframe/usePostToX4A.ts","webpack:///./src/config/xvantage-iframe/utils.ts","webpack:///./src/query/query-consts.ts","webpack:///./src/query/utils.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { AuthState } from '@okta/okta-auth-js';\nimport jwt_decode from 'jwt-decode';\n\nfunction getAuthState() {\n  return ((window as any).ImAuthState as AuthState | null) || null;\n}\n\nfunction getToken() {\n  const authState = getAuthState();\n  return authState?.accessToken;\n}\n\n/** The header `authorization` (Bearer token) for api requests. */\nexport function getAuthorizationHeader() {\n  const token = getToken();\n  return token ? `${token.tokenType} ${token.accessToken}` : undefined;\n}\n\n// The content of the Token\nexport function useDecodedToken() {\n  const token = getToken();\n  return useMemo(() => {\n    const accessToken = token?.accessToken;\n    if (accessToken) {\n      return jwt_decode(accessToken) as TokenContent;\n    }\n  }, [token]);\n}\n\nexport function useRoles() {\n  const decodedToken = useDecodedToken();\n  return decodedToken?.role;\n}\n\nexport type Segments = {\n  resellerPersonalization: string[];\n  userAdbutler: string[];\n  userPersonalization: string[];\n};\n\nexport type TokenContent = {\n  acr: string;\n  appName: string;\n  aud: string;\n  azureAd: string;\n  cid: string;\n  email: string;\n  environment: string;\n  exp: number;\n  firstName: string;\n  iat: number;\n  imoProfile: {\n    displayUserName: string;\n    distributionChannel: string;\n    division: string;\n    emailAddress: string;\n    firstName: string;\n    impersonationMode: false;\n    lastName: string;\n    originalResellerId: string;\n    originalUserName: string;\n    resellerId: string;\n    salesOrganization: string;\n    userId: string;\n    userName: string;\n    userType: string; // 10\"\n  };\n  iss: string;\n  jti: string;\n  lastName: string;\n  login: string;\n  resellerId: string;\n  resellerProspect?: boolean;\n  role: string[];\n  scp: string[];\n  segments: Segments;\n  senderId: string;\n  siteCode: string;\n  sub: string;\n  uid: string;\n  userId: string;\n  ver: number;\n  whiteListedFeatures: string[];\n};\n","import { useOktaAuth } from '@okta/okta-react';\nimport { useDecodedToken } from './authorization.hook';\n\ntype UserInfo = {\n  email: string;\n  family_name: string;\n  given_name: string;\n  name: string;\n  preferred_username: string;\n};\n\nexport function useUserInfo() {\n  const decodedToken = useDecodedToken();\n  if (decodedToken) {\n    return {\n      email: decodedToken.email,\n      family_name: decodedToken.lastName,\n      given_name: decodedToken.firstName,\n      name: `${decodedToken.firstName} ${decodedToken.lastName}`,\n      preferred_username: decodedToken.login,\n    } as UserInfo;\n  }\n}\n\nexport function useIsAuthenticated() {\n  const oktaContext = useOktaAuth();\n  return oktaContext?.authState?.isAuthenticated === true;\n}\n\nexport function useIsTokenExpired() {\n  const tokenExpiry = useDecodedToken()?.exp;\n  return (\n    tokenExpiry !== undefined &&\n    tokenExpiry !== 0 &&\n    tokenExpiry < Math.round(Date.now() / 1000)\n  );\n}\n\nexport async function fetchIpAdrress(): Promise<string> {\n  const response = await fetch('/Site/ExternalHost/GetClientIp', {\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    method: 'GET',\n  });\n  if (response.ok) {\n    const data = await response.json();\n    return data['ClientIp'];\n  }\n  return '';\n}\n","import React, { ReactNode, useMemo } from 'react';\nimport { MFOutlet } from '@im/ui-lib/mf-utils';\nimport {\n  EnvVars,\n  buildConfigContext,\n  createBuildConfig,\n} from './build-config-context';\n\ntype Props = {\n  children: ReactNode;\n  envVars: EnvVars;\n  mfOutlets: MFOutlet[];\n};\n\nexport function BuildConfigProvider(props: Props) {\n  const { children, envVars = {}, mfOutlets } = props;\n\n  const buildConfig = useMemo(() => {\n    return createBuildConfig(envVars, mfOutlets);\n  }, [envVars, mfOutlets]);\n\n  const { Provider } = buildConfigContext;\n  return <Provider value={buildConfig}>{children}</Provider>;\n}\n","import { createContext } from 'react';\nimport { MFOutlet } from '@im/ui-lib/mf-utils';\n\nexport type EnvVars = { [k: string]: string };\n\nconst CEP_PREFIX = 'CEP__';\nconst INGRAM_PREFIX = 'INGRAM__';\n\ntype BuildEnvironment =\n  | 'development'\n  | 'production'\n  | 'productionbeta'\n  | 'productionbetax'\n  | 'staging'\n  | 'staging2'\n  | 'stagingx'\n  | 'test';\nconst buildEnvironments = [\n  'development',\n  'production',\n  'productionbeta',\n  'productionbetax',\n  'staging',\n  'staging2',\n  'stagingx',\n  'test',\n];\n\ntype RequiredKey = 'API_BASE';\ntype OptionalKey = 'DEV_PROXY_HOSTNAME' | 'API_GCP_BASE' | 'API_EU_GCP_BASE';\nconst requiredKeys = ['API_BASE'];\n\ntype RawBuildConfig = {\n  buildEnvironment: BuildEnvironment;\n} & { [rk in RequiredKey]: string } & Partial<{\n    [ok in OptionalKey]: string;\n  }> & { [k: string]: string };\n\nexport type BuildConfig = {\n  /** @deprecated */\n  mfOutlets: MFOutlet[];\n  vars: Readonly<RawBuildConfig>;\n};\n\nexport const buildConfigContext = createContext<BuildConfig | undefined>(\n  undefined\n);\n\nexport function createBuildConfig(\n  envVars: EnvVars,\n  mfOutlets: MFOutlet[]\n): BuildConfig {\n  const config: Partial<RawBuildConfig> = {};\n\n  Object.entries(envVars).forEach(([key, value]) => {\n    if (key.startsWith(CEP_PREFIX)) {\n      config[key.substring(CEP_PREFIX.length)] = value;\n    } else if (key.startsWith(INGRAM_PREFIX)) {\n      config[key.substring(INGRAM_PREFIX.length)] = value;\n    } else if (key === 'NODE_ENV') {\n      config.buildEnvironment = value as BuildEnvironment;\n    }\n  });\n\n  // Validate\n  const buildEnvironment = config.buildEnvironment || '';\n  if (!buildEnvironments.includes(buildEnvironment)) {\n    throw new Error(\n      `[BuildConfig] invalid NODE_ENV=${buildEnvironment}; Must be one of: ${JSON.stringify(\n        buildEnvironments\n      )}.`\n    );\n  }\n\n  requiredKeys.forEach((key) => {\n    if (!config[key]) {\n      throw new Error(`[BuildConfig] ${key} not set.`);\n    }\n  });\n\n  return {\n    mfOutlets,\n    // Freeze to prevent modifications.\n    vars: Object.freeze(config as RawBuildConfig),\n  };\n}\n","import { useContext } from 'react';\nimport { buildConfigContext } from './build-config-context';\n\nexport function useBuildConfig() {\n  const buildConfig = useContext(buildConfigContext);\n  if (!buildConfig) {\n    throw new Error(\n      'buildConfigContext value is undefined. Make sure you use the BuildConfigProvider before using the context.'\n    );\n  }\n  return buildConfig;\n}\n\nexport function useBuildVars() {\n  return useBuildConfig().vars;\n}\n\n/** @deprecated */\nexport function useMfOutlets() {\n  return useBuildConfig().mfOutlets;\n}\n","import React, { ReactNode, useEffect, useState } from 'react';\nimport wretch from 'wretch';\nimport { useBuildVars } from '../build-config';\nimport { SiteConfig, siteConfigContext } from './site-config-context';\nimport { getSameOriginApiBasePath } from '../../query/utils';\nimport { disableSameOriginRequests } from '../../query/query-consts';\n\nconst apiWretcher = wretch(undefined).options({\n  // https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials\n  // credentials: 'include',\n  credentials: 'same-origin', // Default\n\n  headers: {\n    accept: 'application/json',\n    'content-type': 'application/json',\n  },\n\n  // https://developer.mozilla.org/en-US/docs/Web/API/Request/mode\n  mode: 'cors',\n});\n\ntype Props = {\n  children: ReactNode;\n};\n\nexport function SiteConfigProvider(props: Props) {\n  const { children } = props;\n\n  const buildVars = useBuildVars();\n\n  // TODO: Same-origin Config API cannot be enabled per country as config call contains siteCode.\n  //   This logic should be removed once once same-origin APIs is rollouted to ALL countries.\n  const shouldUseSameOriginApis =\n    buildVars.buildEnvironment !== 'production' &&\n    buildVars.buildEnvironment !== 'productionbeta' &&\n    buildVars.buildEnvironment !== 'development' &&\n    localStorage.getItem(disableSameOriginRequests) !== 'true';\n\n  const [value, setValue] = useState<SiteConfig | undefined>(undefined);\n\n  useEffect(() => {\n    let active = true;\n\n    /**\n     * Config API response is being cached. The 'ver' query param would be used to invalidate cache if necessary\n     */\n    const queryParams: { [key: string]: string | undefined } = {\n      ver: buildVars['CONFIG_API_VERSION'],\n    };\n\n    (async () => {\n      let wretcher = apiWretcher.url(\n        `${\n          shouldUseSameOriginApis\n            ? getSameOriginApiBasePath()\n            : buildVars.API_BASE\n        }/imonline-k8s-cep/cwc/config/v1/config`\n      );\n      // TODO: When same-origin APIs is rolled out to all countries on prod, the above wretcher definition\n      //   can be replaced with the below code to enable it for all envs, all countries.\n      // let wretcher = apiWretcher.url(\n      //   `${getSameOriginApiBasePath()/imonline-k8s-cep/cwc/config/v1/config`\n      // );\n\n      if (globalThis.location.origin.indexOf('://local') > -1) {\n        /**\n         * Note: hostname query param is always needed when running locally.\n         * Even when running stage and production builds locally in express or ngnix.\n         */\n        queryParams['hostname'] = buildVars.DEV_PROXY_HOSTNAME;\n      }\n\n      wretcher = wretcher.query(queryParams);\n\n      const siteConfig = await wretcher.get().json<SiteConfig>();\n\n      if (active) {\n        setValue(siteConfig);\n      }\n    })();\n\n    return () => {\n      active = false;\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [buildVars, setValue]);\n\n  if (!value) {\n    return null;\n  }\n\n  const { Provider } = siteConfigContext;\n  return <Provider value={value}>{children}</Provider>;\n}\n","import { createContext } from 'react';\n\nexport type SiteConfig = {\n  /** OKTA issuer */\n  authServer: string;\n\n  /** OKTA clientId */\n  clientId: string;\n\n  /** Default locale like: \"en-CA\".\n   * Defaults to first locale in `Accept-Language` header that exists in `supportedLocales`.\n   * If not found; (`Accept-Language` header missing or no locale in header exist in `supportedLocales`)\n   * then returns the first locale in `supportedLocales`.\n   */\n  defaultLocale: string;\n\n  /** Server environment like: \"stage1\" */\n  environment: string;\n\n  /** fullstory enabled like: true or false */\n  fullStoryEnabled: boolean;\n\n  //** redirect to IDP web site to login */\n  idpLogin: boolean;\n\n  /** authorization code flow vs interaction code flow */\n  interactionCodeFlow: boolean;\n\n  /** Site code like: \"ca\" */\n  siteCode: string;\n\n  /** Supported locales like: [\"en-CA\",\"fr-CA\"] */\n  supportedLocales: string[];\n};\n\nexport const siteConfigContext = createContext<SiteConfig | undefined>(\n  undefined\n);\n","import { useSiteConfig } from './useSiteConfig';\nimport { init as fullStoryInit } from '@fullstory/browser';\nimport { useEffect } from 'react';\n\nexport function useFullStory() {\n  const siteConfig = useSiteConfig();\n  useEffect(() => {\n    if (siteConfig.fullStoryEnabled) {\n      fullStoryInit({\n        debug: false, //Enables FullStory debug messages\n        host: 'fullstory.com', //Host name path of fullstory\n        namespace: 'FS', //Sets the global identifier for FullStory when conflicts with FS arise\n        orgId: 'P9XEH', //Sets your FullStory Org Id\n        recordCrossDomainIFrames: true, //Capture Cross Domain IFrame conetnt\n        recordOnlyThisIFrame: true, //Tells FullStory that the IFrame is the \"root\" of the recording and should be its own session\n        script: 'edge.fullstory.com/s/fs.js', //script path\n      });\n    }\n  }, [siteConfig]);\n}\n","import { useContext } from 'react';\nimport { siteConfigContext } from './site-config-context';\n\nexport function useSiteConfig() {\n  const siteConfig = useContext(siteConfigContext);\n  if (!siteConfig) {\n    throw new Error(\n      'siteConfigContext value is undefined. Make sure you use the SiteConfigProvider before using the context.'\n    );\n  }\n  return siteConfig;\n}\n","import { useEffect, useState } from 'react';\n\nconst DEFAULT_PAGE_TITLE = 'Xvantage';\n\n/** updatePageTitle: Sets page title for the consuming View component as the input string.\n * For setting page title on iFramed pages, see:\n * https://imonline.atlassian.net/wiki/spaces/DigitalT/pages/3070820435/X4C+Page+Titles#iFramed-Pages */\nexport function usePageTitle() {\n  const [pageTitle, setPageTitle] = useState(DEFAULT_PAGE_TITLE);\n\n  const updatePageTitle = (newPageTitle: string) => {\n    if (newPageTitle && pageTitle !== newPageTitle) {\n      setPageTitle(newPageTitle);\n    }\n  };\n\n  useEffect(() => {\n    document.title = pageTitle;\n    return () => {\n      document.title = DEFAULT_PAGE_TITLE;\n    };\n  }, [pageTitle]);\n\n  return { pageTitle, updatePageTitle };\n}\n","import { useMemo } from 'react';\nimport { useBuildVars } from '../build-config';\nimport { useSearchParams } from 'react-router-dom';\n\nexport enum IM360Regions {\n  AMER = 'AMER',\n  ANZ = 'ANZ',\n  APAC = 'APAC',\n  EMEA = 'EMEA',\n}\n\nconst useIM360Origin = () => {\n  const {\n    IM360_ORIGIN_AMER,\n    IM360_ORIGIN_ANZ,\n    IM360_ORIGIN_APAC,\n    IM360_ORIGIN_EMEA,\n  } = useBuildVars();\n\n  const [queryParams] = useSearchParams();\n  const im360Region = queryParams.get('region');\n\n  const IM360_ORIGIN = useMemo(() => {\n    switch (im360Region) {\n      case IM360Regions.AMER:\n        return IM360_ORIGIN_AMER;\n      case IM360Regions.EMEA:\n        return IM360_ORIGIN_EMEA;\n      case IM360Regions.APAC:\n        return IM360_ORIGIN_APAC;\n      case IM360Regions.ANZ:\n        return IM360_ORIGIN_ANZ;\n      default:\n        return IM360_ORIGIN_EMEA;\n    }\n  }, [\n    im360Region,\n    IM360_ORIGIN_AMER,\n    IM360_ORIGIN_EMEA,\n    IM360_ORIGIN_APAC,\n    IM360_ORIGIN_ANZ,\n  ]);\n\n  return IM360_ORIGIN;\n};\n\nexport default useIM360Origin;\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router';\nimport { useLocalizationContext } from '@im/react-localization';\n\nimport { usePostToX4A } from './usePostToX4A';\nimport { useIsAuthenticated } from '../../auth/user-info.hooks';\nimport { useDecodedToken } from '../../auth/authorization.hook';\nimport { FRAME_ID, isValidOrigin } from './utils';\nimport useIM360Origin from './useIM360Origin';\n\nconst FRAME_STYLE_ID = 'x4a-frame-style';\n\ntype ObjectMap = {\n  [key: string]: any;\n};\n\n/** Use Xvantage frame: Identify if X4C is currently loaded in an X4A iframe\n * and handles configurations received from the parent application. */\nexport function useInX4AFrame() {\n  const isAuthenticated = useIsAuthenticated();\n  const decodedToken = useDecodedToken();\n  const context = useLocalizationContext();\n  const navigate = useNavigate();\n  const { postMessageToX4A } = usePostToX4A();\n\n  const isFrame = window.self !== window.top;\n  const ancestors = window.location.ancestorOrigins;\n  const IM360_Origin = useIM360Origin();\n\n  const [isInIM360Frame] = useState<boolean>(\n    isFrame && ancestors.contains(IM360_Origin)\n  );\n\n  const [isInX4AFrame, setIsInX4AFrame] = useState<boolean>(isFrame);\n\n  const listeningForPostMsg = useRef(false);\n  const x4cMounted = useRef(false);\n\n  const [hideFooter, setHideFooter] = useState<boolean>(isFrame);\n  const [hideHeader, setHideHeader] = useState<boolean>(isFrame);\n  const [hideSideNav, setHideSideNav] = useState<boolean>(isFrame);\n  const [searchParams, setSearchParams] = useState<ObjectMap>({});\n\n  const [selectedLocale, setSelectedLocale] = useState('');\n\n  const onPostMsgReceived = (event: MessageEvent) => {\n    //Messages from invalid origins should not be processed!\n    if (!isValidOrigin(event.origin)) return;\n    //Xv frame post messages should always contain xv-frame frameId\n    if (!event || event.data?.frameId !== FRAME_ID) return;\n    const {\n      action,\n      hideFooter,\n      hideHeader,\n      hideSideNav,\n      locale,\n      searchParams,\n      styles,\n    } = event.data;\n\n    if (!listeningForPostMsg.current && action === 'post-msg-ping') {\n      postMessageToX4A('post-msg-ready', { origin: window.location.origin });\n      listeningForPostMsg.current = true;\n    }\n\n    if (action === 'update-config') {\n      setHideFooter(hideFooter ?? true);\n      setHideHeader(hideHeader ?? true);\n      setHideSideNav(hideSideNav ?? true);\n\n      if (searchParams && Object.keys(searchParams)?.length > 0) {\n        setSearchParams(searchParams);\n      }\n\n      setIsInX4AFrame(true);\n\n      if (locale) {\n        if (!context.supportedLocales.includes(locale)) {\n          console.warn(\n            `Locale \"${locale}\" received from X4A frame config is not supported. Language not set. Supported locales: ${context.supportedLocales.toString()}`\n          );\n        } else {\n          setSelectedLocale(locale);\n        }\n      }\n\n      if (styles) {\n        const styleEle = document.getElementById(FRAME_STYLE_ID);\n        if (!styleEle) {\n          const ele = document.createElement('style');\n          ele.id = FRAME_STYLE_ID;\n          document.head.append(ele);\n        }\n        if (styleEle && styles !== styleEle.textContent)\n          styleEle.textContent = styles;\n      }\n    }\n\n    if (action === 'navigate-x4c-to') {\n      if (event.data?.route) {\n        navigate(event.data?.route);\n        return;\n      }\n    }\n  };\n\n  useEffect(() => {\n    if (isAuthenticated && isInX4AFrame && !x4cMounted.current) {\n      //Inform parent that X4C has mounted\n      postMessageToX4A('x4c-mounted', {\n        origin: window.location.origin,\n        x4cUser: decodedToken?.imoProfile.userName,\n      });\n      x4cMounted.current = true;\n\n      //Listener receives post messages from X4A\n      window.addEventListener('message', onPostMsgReceived);\n      return () => window.removeEventListener('message', onPostMsgReceived);\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [isAuthenticated]);\n\n  useEffect(() => {\n    const currLocale = context.locale;\n    if (selectedLocale && currLocale !== selectedLocale) {\n      context.setLocale(selectedLocale);\n    }\n  }, [context, selectedLocale]);\n\n  return useMemo(() => {\n    return {\n      isInIM360Frame,\n      isInX4AFrame,\n      xvFrameConfig: {\n        hideFooter,\n        hideHeader,\n        hideSideNav,\n        searchParams,\n      },\n    };\n  }, [\n    hideFooter,\n    hideHeader,\n    hideSideNav,\n    isInIM360Frame,\n    isInX4AFrame,\n    searchParams,\n  ]);\n}\n","import { useBuildVars } from '../build-config';\nimport useIM360Origin from './useIM360Origin';\nimport { FRAME_ID } from './utils';\n\nexport function usePostToX4A() {\n  const { X4A_ORIGIN } = useBuildVars();\n  const IM360_ORIGIN = useIM360Origin();\n  const postMessageToX4A = (\n    action: string,\n    payload?: { [key: string]: any },\n    isIM360 = false\n  ) => {\n    window.parent.postMessage(\n      {\n        action,\n        frameId: FRAME_ID,\n        ...payload,\n      },\n      isIM360 ? IM360_ORIGIN : X4A_ORIGIN\n    );\n  };\n  /** Updates the reseller context in X4A by calling impersonation API with the specified BCN. */\n  const updateImpersonatedReseller = (resellerId: string) => {\n    postMessageToX4A('impersonate-reseller', { resellerId });\n  };\n\n  /** Ends impersonation of the current reseller in X4A. */\n  const disableImpersonation = () => {\n    postMessageToX4A('disable-impersonation');\n  };\n\n  /** Re-renders the X4C iframe with the newly specified path. */\n  const updateX4CFramePath = (newPath: string, isInIM360Frame = false) => {\n    postMessageToX4A('update-frame-path', { newPath }, isInIM360Frame);\n  };\n\n  /** Navigates X4C app to the specified route or route. Open in new tab is false by default. */\n  const navigateToInX4A = (navOptions: {\n    countryCode?: string;\n    openInNewTab?: boolean;\n    url?: string;\n    x4aRoute?: string;\n  }) => {\n    postMessageToX4A('navigate-x4a-to', { navOptions });\n  };\n\n  return {\n    disableImpersonation,\n    navigateToInX4A,\n    postMessageToX4A,\n    updateImpersonatedReseller,\n    updateX4CFramePath,\n  };\n}\n","export const FRAME_ID = 'xv-frame';\n\n/** Returns true if the given string matches the https://subdomain.ingrammicro.com structure.\n * Subdomains and port number are optional, otherwise the string must match exactly. */\nexport function isValidOrigin(origin: string) {\n  const originRegEx =\n    /^(https:\\/\\/)([A-Za-z0-9-]*\\.){0,1}(ingrammicro\\.com){1}(:{1}[0-9]{0,8}){0,1}$/;\n  return originRegEx.test(origin);\n}\n","export const disableSameOriginRequests = 'disableSameOriginRequests';\n","/* eslint-disable no-console */\nimport { useCallback } from 'react';\nimport { useBuildVars } from '../config/build-config';\nimport { disableSameOriginRequests } from './query-consts';\n// import { useSiteConfig } from '../config/site-config/useSiteConfig';\n\nconst win = window as any;\n\nwin.toggleSameOriginApis = () => {\n  const isDisabled = localStorage.getItem(disableSameOriginRequests);\n  const newVal = isDisabled === 'true' ? 'false' : 'true';\n  localStorage.setItem(disableSameOriginRequests, newVal);\n  console.log(\n    `[cross origin requests] ${\n      newVal === 'true' ? 'enabled' : 'disabled'\n    } - refresh page to see changes`\n  );\n};\n\nexport const getSameOriginApiBasePath = () => {\n  return `/api`;\n};\n\n// Controls whether to use same origin APIs or not. NOTE: Config API call is\n//  out of scope of QueryClient and handled separately in SiteConfigProvider.tsx.\nexport const useSameOriginApis = () => {\n  const buildVars = useBuildVars();\n  // const { siteCode } = useSiteConfig();\n\n  const shouldUseSameOriginApis = useCallback(() => {\n    if (buildVars.buildEnvironment === 'development') return false;\n    if (localStorage.getItem(disableSameOriginRequests) === 'true')\n      return false;\n    // if (siteCode === 'us') return true;\n    return (\n      buildVars.buildEnvironment !== 'production' &&\n      buildVars.buildEnvironment !== 'productionbeta' &&\n      localStorage.getItem(disableSameOriginRequests) !== 'true'\n    );\n  }, [buildVars.buildEnvironment]);\n\n  return shouldUseSameOriginApis;\n};\n"],"names":["getToken","authState","window","ImAuthState","accessToken","getAuthorizationHeader","token","tokenType","undefined","useDecodedToken","useMemo","jwt_decode","useRoles","decodedToken","role","useUserInfo","email","family_name","lastName","given_name","firstName","name","preferred_username","login","useIsAuthenticated","oktaContext","useOktaAuth","isAuthenticated","useIsTokenExpired","tokenExpiry","exp","Math","round","Date","now","async","fetchIpAdrress","response","fetch","headers","Accept","method","ok","json","BuildConfigProvider","props","children","envVars","mfOutlets","buildConfig","createBuildConfig","Provider","buildConfigContext","React","value","CEP_PREFIX","INGRAM_PREFIX","buildEnvironments","requiredKeys","createContext","config","Object","entries","forEach","key","startsWith","substring","length","buildEnvironment","includes","Error","JSON","stringify","vars","freeze","useBuildConfig","useContext","useBuildVars","useMfOutlets","apiWretcher","wretch","options","credentials","accept","mode","SiteConfigProvider","buildVars","shouldUseSameOriginApis","localStorage","getItem","disableSameOriginRequests","setValue","useState","useEffect","active","queryParams","ver","wretcher","url","getSameOriginApiBasePath","API_BASE","globalThis","location","origin","indexOf","DEV_PROXY_HOSTNAME","query","siteConfig","get","siteConfigContext","useFullStory","useSiteConfig","fullStoryEnabled","fullStoryInit","debug","host","namespace","orgId","recordCrossDomainIFrames","recordOnlyThisIFrame","script","DEFAULT_PAGE_TITLE","usePageTitle","pageTitle","setPageTitle","document","title","updatePageTitle","newPageTitle","IM360Regions","useIM360Origin","IM360_ORIGIN_AMER","IM360_ORIGIN_ANZ","IM360_ORIGIN_APAC","IM360_ORIGIN_EMEA","useSearchParams","im360Region","AMER","EMEA","APAC","ANZ","FRAME_STYLE_ID","useInX4AFrame","context","useLocalizationContext","navigate","useNavigate","postMessageToX4A","usePostToX4A","isFrame","self","top","ancestors","ancestorOrigins","IM360_Origin","isInIM360Frame","contains","isInX4AFrame","setIsInX4AFrame","listeningForPostMsg","useRef","x4cMounted","hideFooter","setHideFooter","hideHeader","setHideHeader","hideSideNav","setHideSideNav","searchParams","setSearchParams","selectedLocale","setSelectedLocale","onPostMsgReceived","event","isValidOrigin","data","frameId","FRAME_ID","action","locale","styles","current","keys","supportedLocales","console","warn","toString","styleEle","getElementById","ele","createElement","id","head","append","textContent","route","x4cUser","imoProfile","userName","addEventListener","removeEventListener","currLocale","setLocale","xvFrameConfig","X4A_ORIGIN","IM360_ORIGIN","payload","isIM360","parent","postMessage","disableImpersonation","navigateToInX4A","navOptions","updateImpersonatedReseller","resellerId","updateX4CFramePath","newPath","test","toggleSameOriginApis","newVal","setItem","log","useSameOriginApis","useCallback"],"sourceRoot":""}