{"version":3,"file":"382.chunk.js","mappings":"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","sources":["webpack://orinovageskincareadvisor/./src/containers/ApiProvider.tsx","webpack://orinovageskincareadvisor/./src/containers/ErrorBoundary.ts","webpack://orinovageskincareadvisor/./src/containers/I18nContainer.tsx","webpack://orinovageskincareadvisor/./src/containers/NovageSkincareAdvisor.tsx","webpack://orinovageskincareadvisor/./src/App.tsx","webpack://orinovageskincareadvisor/./src/AppRender.tsx","webpack://orinovageskincareadvisor/./src/contexts/configurationContext.ts","webpack://orinovageskincareadvisor/./src/hooks/useLocale.ts","webpack://orinovageskincareadvisor/./src/hooks/useLocalizationQuery.ts","webpack://orinovageskincareadvisor/./src/hooks/useOnHrefClick.ts","webpack://orinovageskincareadvisor/./src/hooks/useRedirectToPdp.ts","webpack://orinovageskincareadvisor/./src/hooks/useSessionStorage.ts","webpack://orinovageskincareadvisor/./src/hooks/useRevieveAdvisor.ts","webpack://orinovageskincareadvisor/./src/hooks/useRevieveScript.ts","webpack://orinovageskincareadvisor/./src/api/constants.ts","webpack://orinovageskincareadvisor/./src/hooks/useGetNovageSkincareConfiguration.ts","webpack://orinovageskincareadvisor/./src/api/getNovageSkincareConfiguration.ts","webpack://orinovageskincareadvisor/./src/hooks/useLogError.ts","webpack://orinovageskincareadvisor/./src/hooks/useOpenQueryParam.ts","webpack://orinovageskincareadvisor/./src/models/ApiError.ts","webpack://orinovageskincareadvisor/./src/models/TranslationKeys.ts","webpack://orinovageskincareadvisor/./src/utils/fetchTranslations.ts","webpack://orinovageskincareadvisor/./src/utils/getSafeUrl.ts","webpack://orinovageskincareadvisor/./src/utils/openQueryParam.ts","webpack://orinovageskincareadvisor/./src/utils/isValidProperty.ts","webpack://orinovageskincareadvisor/./src/utils/parseSpaConfig.ts","webpack://orinovageskincareadvisor/./src/utils/cookies.ts","webpack://orinovageskincareadvisor/./src/utils/revieve.ts"],"sourcesContent":["import { SWRConfig } from '@ori/fetching';\nimport type { FC, PropsWithChildren } from 'react';\n\nimport { swrConfig } from '~/constants';\n\nexport const ApiProvider: FC = ({ children }) => (\n {children}\n);\n","import type { ErrorInfo } from 'react';\nimport { Component } from 'react';\n\ninterface ErrorBoundaryProps {\n children: JSX.Element;\n}\n\ninterface ErrorBoundaryState {\n error?: Error;\n}\n\nexport class ErrorBoundary extends Component {\n override readonly state: ErrorBoundaryState = {};\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n // eslint-disable-next-line class-methods-use-this -- no use for `this`\n override componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n // eslint-disable-next-line no-console -- log error to console\n console.error({ error, errorInfo });\n }\n\n override render() {\n const { children } = this.props;\n const { error } = this.state;\n\n return error ? null : children;\n }\n}\n","import i18next from 'i18next';\nimport type { FC, PropsWithChildren } from 'react';\nimport { useEffect } from 'react';\nimport { I18nextProvider, initReactI18next } from 'react-i18next';\n\nimport { defaultTranslations } from '../constants';\nimport { useLocalizationQuery } from '~/hooks';\nimport type { TranslationKey } from '~/models';\n\nconst DEFAULT_LANGUAGE_KEY = 'default';\nconst DEFAULT_NAMESPACE = 'translations';\n\nconst i18nextInstance = i18next\n .createInstance({\n keySeparator: '::',\n lng: DEFAULT_LANGUAGE_KEY,\n defaultNS: DEFAULT_NAMESPACE,\n resources: {\n [DEFAULT_LANGUAGE_KEY]: {\n [DEFAULT_NAMESPACE]: defaultTranslations,\n },\n },\n interpolation: {\n escapeValue: false, // react already safes from xss\n prefix: '{',\n suffix: '}',\n },\n react: {\n bindI18n: 'added removed languageChanged',\n bindI18nStore: 'added removed',\n },\n })\n .use(initReactI18next);\n\ni18nextInstance.init();\n\nexport const I18nContainer: FC<\n PropsWithChildren<{\n preloadedTranslations?: Record;\n }>\n> = ({ children, preloadedTranslations }) => {\n const { data: localizationData } = useLocalizationQuery({\n isPaused: () => !!preloadedTranslations,\n suspense: !preloadedTranslations,\n });\n useEffect(() => {\n // If translations package has changed we will change provided package in i18next too\n i18nextInstance.addResourceBundle(\n DEFAULT_LANGUAGE_KEY,\n DEFAULT_NAMESPACE,\n localizationData ?? preloadedTranslations ?? {},\n false,\n true,\n );\n }, [localizationData, preloadedTranslations]);\n\n return {children};\n};\n","import useTestId from '@ori/testid-generator';\nimport type { FunctionComponent } from 'react';\nimport { lazy, Suspense } from 'react';\n\nimport type { RevieveProps } from '../components';\nimport { APP_NAME } from '../constants';\nimport { useConfiguration } from '../contexts';\nimport { useGetNovageSkincareConfiguration } from '../hooks/useGetNovageSkincareConfiguration';\nimport { useOpenQueryParam } from '../hooks/useOpenQueryParam';\n\nconst Revieve = lazy>(async () =>\n import('../components/Revieve').then((module) => ({ default: module.Revieve })),\n);\n\nexport const NovageSkincareAdvisor = () => {\n const novageSkincareConfiguration = useGetNovageSkincareConfiguration();\n const openQueryParam = useOpenQueryParam();\n const { currentLanguage } = useConfiguration();\n const { getTestId } = useTestId();\n\n return (\n
\n \n {novageSkincareConfiguration === undefined ? null : (\n \n )}\n \n
\n );\n};\n","import { ThemeProvider } from '@ori-ui/mui';\nimport { TestIdProvider } from '@ori/testid-generator';\nimport { Suspense } from 'react';\nimport type { FC } from 'react';\n\nimport { APP_TEAM_NAME, APP_NAME } from './constants';\nimport { ApiProvider, ErrorBoundary, NovageSkincareAdvisor, I18nContainer } from './containers';\nimport { ConfigurationProvider } from './contexts';\nimport type { AppConfiguration } from './models';\n\ninterface AppProps {\n configuration: AppConfiguration;\n}\n\nexport const App: FC = ({ configuration }) => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n);\n","import { version as ReactVersion } from 'react';\n\nimport { App } from './App';\nimport { parseSpaConfig } from './utils';\nimport type { AppConfiguration } from '~/models';\n\nexport const render = async (rootElement: HTMLElement): Promise => {\n if (!rootElement.dataset.config) {\n return false;\n }\n const config = parseSpaConfig(rootElement.dataset.config, [\n 'currentLanguage',\n 'customerId',\n 'staticApiUrl',\n 'tenant',\n ]);\n const configuration: AppConfiguration = {\n currentLanguage:\n typeof __CURRENT_LANGUAGE__ === 'string' ? __CURRENT_LANGUAGE__ : config.currentLanguage,\n customerId: config.customerId,\n staticApiUrl: config.staticApiUrl,\n tenant: typeof __TENANT__ === 'string' ? __TENANT__ : config.tenant,\n };\n if (ReactVersion.startsWith('18')) {\n const { createRoot } = await import('react-dom/client');\n createRoot(rootElement).render();\n } else {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console -- log error to console\n console.error('react-dom/client cannot be imported using legacy render');\n }\n const { render: reactDomRender } = await import('react-dom');\n reactDomRender(, rootElement);\n }\n\n return true;\n};\n","import { useContext, createContext } from 'react';\n\nimport { NOT_LOGGED_IN_USER_ID } from '~/constants';\nimport type { AppConfiguration } from '~/models';\n\nexport const configurationContextDefaultValues: AppConfiguration = {\n currentLanguage: '',\n customerId: NOT_LOGGED_IN_USER_ID,\n staticApiUrl: '',\n tenant: '',\n};\n\nexport const configurationContext = createContext(\n configurationContextDefaultValues,\n);\n\nexport const ConfigurationProvider = configurationContext.Provider;\n\nexport const useConfiguration = () => useContext(configurationContext);\n","import { useConfiguration } from '../contexts';\n\nexport const useLocale = () => {\n const { currentLanguage } = useConfiguration();\n const [locale] = currentLanguage.split('-');\n\n return locale;\n};\n","import type { SWRConfiguration } from '@ori/fetching';\nimport { useSWR } from '@ori/fetching';\n\nimport { useConfiguration } from '~/contexts';\nimport { fetchTranslations } from '~/utils';\n\nexport type ResultData = Awaited>;\n\nexport function useLocalizationQuery(config?: SWRConfiguration) {\n const { currentLanguage, tenant, staticApiUrl } = useConfiguration();\n\n return useSWR([currentLanguage, tenant, staticApiUrl], fetchTranslations, {\n revalidateIfStale: false,\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n ...config,\n });\n}\n","import { useEffect } from 'react';\n\nconst shouldOpen = (href: string, target: EventTarget | null) =>\n target instanceof HTMLAnchorElement && target.hash === href;\n\nexport interface UseOnHrefClickProps {\n href: string;\n onClick: () => void;\n}\n\nexport const useOnHrefClick = ({ href, onClick }: UseOnHrefClickProps) =>\n useEffect(() => {\n const onOpen = (event: MouseEvent) => {\n if (shouldOpen(href, event.target)) {\n event.preventDefault();\n onClick();\n }\n };\n document.addEventListener('click', onOpen);\n\n return () => document.removeEventListener('click', onOpen);\n }, [href, onClick]);\n","import { useCallback, useEffect, useRef } from 'react';\nimport type { RevieveProduct } from 'revieve';\n\nconst origin = '&origin=revieve';\n\nconst getPdpUrl = ({ id, url }: RevieveProduct) => {\n if (url) {\n return `${url}${origin}`;\n }\n\n return `${window.location.origin}/products/product?code=${id}${origin}`;\n};\n\nexport const useRedirectToPdp = () => {\n const timeout = useRef();\n useEffect(() => () => clearTimeout(timeout.current));\n\n return useCallback((product: RevieveProduct, delay = 0) => {\n const redirect = () => window.location.assign(getPdpUrl(product));\n timeout.current = setTimeout(redirect, delay);\n }, []);\n};\n","import { useCallback, useMemo } from 'react';\nimport type { RevieveProduct } from 'revieve';\n\nimport type { NovageSkincareConfiguration } from '../models';\nimport { getRevieveUserId } from '../utils';\n\nexport interface UseSessionStorageProps {\n novageSkincareConfiguration: NovageSkincareConfiguration;\n}\n\nconst getProductKey = () => `persist:${getRevieveUserId()}:product`;\n\nexport const useSessionStorage = ({\n novageSkincareConfiguration: { env, partnerId },\n}: UseSessionStorageProps) => {\n const advisorKey = `persist:${partnerId}-${env}`;\n const clear = useCallback(() => {\n window.sessionStorage.removeItem(advisorKey);\n window.sessionStorage.removeItem(getProductKey());\n }, [advisorKey]);\n const restoreProduct = useCallback(() => {\n const product = window.sessionStorage.getItem(getProductKey());\n\n return product ? (JSON.parse(product) as RevieveProduct) : undefined;\n }, []);\n const storeProduct = useCallback(\n (product: RevieveProduct) =>\n window.sessionStorage.setItem(getProductKey(), JSON.stringify(product)),\n [],\n );\n\n return useMemo(\n () => ({ clear, restoreProduct, storeProduct }),\n [clear, restoreProduct, storeProduct],\n );\n};\n","import { useCallback, useMemo } from 'react';\nimport type { RevieveInitConfig } from 'revieve';\n\nimport type { NovageSkincareConfiguration } from '../models';\nimport { hideRevieve, initRevieve, showRevieve, unmountRevieve } from '../utils';\nimport { useSessionStorage } from './useSessionStorage';\n\nexport interface UseRevieveAdvisorProps {\n novageSkincareConfiguration: NovageSkincareConfiguration;\n}\n\nexport const useRevieveAdvisor = ({ novageSkincareConfiguration }: UseRevieveAdvisorProps) => {\n const { clear } = useSessionStorage({ novageSkincareConfiguration });\n const reset = useCallback(\n (config: RevieveInitConfig) => {\n unmountRevieve();\n clear();\n initRevieve(config);\n },\n [clear],\n );\n\n return useMemo(() => ({ close: hideRevieve, open: showRevieve, reset }), [reset]);\n};\n","import { useCallback, useEffect } from 'react';\nimport type { RevieveInitConfig } from 'revieve';\n\nimport { initRevieve, unmountRevieve } from '../utils';\n\nconst SCRIPT_ID = 'revieve-plugin-loader';\n\nconst SCRIPT_URL =\n 'https://d38knilzwtuys1.cloudfront.net/revieve-plugin-v4/revieve-plugin-loader.js';\n\nconst getScriptTag = (onLoad: () => void) => {\n let script = document.getElementById(SCRIPT_ID) as HTMLScriptElement | null;\n if (script === null) {\n script = document.createElement('script');\n script.async = true;\n script.charset = 'utf8';\n script.id = SCRIPT_ID;\n script.src = SCRIPT_URL;\n script.type = 'text/javascript';\n script.addEventListener('load', onLoad);\n }\n\n return script;\n};\n\nconst insertScriptTag = (script: HTMLScriptElement) => {\n const scripts = document.getElementsByTagName('script');\n const firstScript = scripts.item(0);\n if (!firstScript?.parentNode?.contains(script)) {\n firstScript?.parentNode?.insertBefore(script, firstScript);\n }\n};\n\nexport interface UseRevieveScriptProps {\n initConfig: RevieveInitConfig;\n onInit?: () => void;\n}\n\nexport const useRevieveScript = ({ initConfig, onInit }: UseRevieveScriptProps) => {\n const onLoad = useCallback(() => initRevieve(initConfig, onInit), [initConfig, onInit]);\n useEffect(() => {\n const script = getScriptTag(onLoad);\n insertScriptTag(script);\n\n return () => {\n unmountRevieve();\n script.removeEventListener('load', onLoad);\n script.remove();\n };\n }, [onLoad]);\n};\n","import { APP_NAME } from '../constants';\n\nconst APPLICATION = 'x-client-application';\nconst CONTENT_TYPE = 'Content-Type';\n\nexport const HEADERS = {\n [APPLICATION]: APP_NAME,\n [CONTENT_TYPE]: 'application/json',\n};\n","import { useSWR } from '@ori/fetching';\n\nimport { getNovageSkincareConfiguration } from '../api';\nimport { useConfiguration } from '../contexts';\nimport type { NovageSkincareConfiguration } from '../models';\nimport { useLogError } from './useLogError';\n\nexport const useGetNovageSkincareConfiguration = () => {\n const configuration = useConfiguration();\n const { data, error } = useSWR(\n [configuration.currentLanguage, configuration.staticApiUrl, configuration.tenant],\n async (currentLanguage: string, staticApiUrl: string, tenant: string) =>\n getNovageSkincareConfiguration({ currentLanguage, staticApiUrl, tenant }),\n );\n useLogError(error);\n\n return data;\n};\n","import { axios } from '@ori/axios';\n\nimport type { NovageSkincareConfiguration } from '../models';\nimport { ApiError } from '../models';\nimport { HEADERS } from './constants';\nimport type {\n GetNovageSkincareConfigurationProps,\n GetNovageSkincareConfigurationResponse,\n} from './types';\n\nexport const getNovageSkincareConfiguration = async ({\n currentLanguage,\n staticApiUrl,\n tenant,\n}: GetNovageSkincareConfigurationProps): Promise => {\n const url = new URL(staticApiUrl);\n url.pathname = `/tenants/${tenant}/applications/advisor/novAgeSkincareConfiguration`;\n try {\n const { data } = await axios.get(url.toString(), {\n headers: HEADERS,\n params: { lang: currentLanguage },\n });\n\n return { env: data.Environment, partnerId: data.PartnerId };\n } catch (error) {\n if (axios.isAxiosError(error)) {\n throw new ApiError(error.message, error);\n }\n throw error;\n }\n};\n","import { useEffect } from 'react';\n\nexport const useLogError = (error?: unknown) =>\n useEffect(() => {\n if (error instanceof Error) {\n // eslint-disable-next-line no-console -- log error to console\n console.error(error);\n }\n }, [error]);\n","import { useEffect, useState } from 'react';\n\nimport { OPEN_QUERY_PARAM_VALID_VALUES } from '../constants';\nimport { getOpenQueryParam } from '../utils';\n\nexport const useOpenQueryParam = () => {\n const [param, setParam] = useState();\n useEffect(() => {\n const queryParam = getOpenQueryParam() ?? '';\n if (OPEN_QUERY_PARAM_VALID_VALUES.includes(queryParam)) {\n setParam(queryParam);\n }\n }, []);\n\n return param;\n};\n","import type { AxiosError } from '@ori/axios';\n\nexport class ApiError extends Error {\n data: AxiosError;\n\n constructor(message: string, data: AxiosError) {\n super(message);\n this.name = 'ApiError';\n this.data = data;\n }\n}\n","// DO NOT EDIT MANUALLY!\n// This file is generated, edit `resources/Localizations.json` and run `npm run generate-translation-keys` to update.\n\nexport enum TranslationKeys {\n FindingProduct = 'FindingProduct',\n GetNewRecommendation = 'GetNewRecommendation',\n Recommendation = 'Recommendation',\n SeeRecommendedProduct = 'SeeRecommendedProduct',\n}\n","import { axios } from '@ori/axios';\nimport { getHeaders } from '@ori/presentation-http';\n\nimport { TRANSLATIONS_ENDPOINT } from '../constants';\nimport { getSafeUrl } from './getSafeUrl';\n\ninterface LocalizationResponse {\n DefaultLanguage: string;\n Translations: {\n [locale: string]: Record;\n };\n}\n\nexport const fetchTranslations = async (language: string, tenant: string, staticApiUrl: string) => {\n const url = getSafeUrl(TRANSLATIONS_ENDPOINT.replace('{tenant}', tenant), staticApiUrl);\n const {\n data: { Translations: translations = {} },\n } = await axios.get>(url.toString(), {\n headers: getHeaders({ currentLanguage: language, tenant }),\n validateStatus: (status) => status >= 200 && status < 500,\n });\n\n return translations[language] ?? {};\n};\n","/**\n * Utility function which wraps javascript URL object. It preserves entire url (including pathname) of origin¨\n */\nexport const getSafeUrl = (path: string, origin: string) => {\n const originUrl = new URL(origin.endsWith('/') ? origin : `${origin}/`);\n const newPathname = `${originUrl.pathname}${path.slice(1)}`;\n\n return new URL(newPathname, originUrl.origin);\n};\n","import { getCurrentUrl, replaceCurrentUrl } from '@ori/presentation-utils';\n\nimport { OPEN_QUERY_PARAM, OPEN_QUERY_PARAM_ONCE } from '../constants';\n\nexport const getOpenQueryParam = () => {\n const url = getCurrentUrl();\n\n return url.searchParams.get(OPEN_QUERY_PARAM);\n};\n\nexport const removeOpenQueryParam = () => {\n if (getOpenQueryParam()) {\n const url = getCurrentUrl();\n url.searchParams.delete(OPEN_QUERY_PARAM);\n replaceCurrentUrl(url);\n }\n};\n\nexport const setOpenQueryParam = () => {\n const url = getCurrentUrl();\n url.searchParams.set(OPEN_QUERY_PARAM, OPEN_QUERY_PARAM_ONCE);\n if (url.searchParams.get(OPEN_QUERY_PARAM) !== getOpenQueryParam()) {\n replaceCurrentUrl(url);\n }\n};\n","/**\n * Checks if defined project property is not null or is not empty\n */\nexport function isValidProperty(obj: Record, property: keyof typeof obj) {\n if (property in obj) {\n return obj[property] != null && obj[property] !== '';\n }\n\n return false;\n}\n","import { isValidProperty } from './isValidProperty';\nimport { configurationContextDefaultValues } from '~/contexts';\nimport type { AppDataConfiguration } from '~/models';\n\n/**\n * Takes a string and parses it as JSON. Throws error if resulting config does not have required keys\n * @param config config in JSON value\n * @param requiredProperties required properties from defined AppDataConfig type\n * @returns Type-safe parsed config value\n */\nexport function parseSpaConfig(\n config: string,\n requiredProperties: T[] = [],\n) {\n if (!config) {\n throw new Error('No config provided!');\n }\n\n const parsedConfig = JSON.parse(config) as Partial &\n Required>;\n\n requiredProperties.forEach((prop) => {\n if (!isValidProperty(parsedConfig, String(prop))) {\n throw new Error(`Missing ${String(prop)} config property!`);\n }\n });\n\n return {\n // We should set default values to stay true to typings\n customerId: configurationContextDefaultValues.customerId,\n ...parsedConfig,\n };\n}\n","const createNameRegExp = (name: string) => new RegExp(`(^| )${name}=([^;]+)`);\n\nexport const getCookie = (name: string) => {\n const match = document.cookie.match(createNameRegExp(name));\n\n return (match ?? [])[2];\n};\n","import type { Revieve, RevieveUserId } from 'revieve';\n\nimport {\n ONE_TRUST_GROUP_PERFORMANCE,\n OPTANON_CONSENT_COOKIE,\n REVIEVE_USER_ID_COOKIE,\n} from '../constants';\nimport { getCookie } from './cookies';\n\nexport const getRevieveUserId = (): RevieveUserId | undefined => getCookie(REVIEVE_USER_ID_COOKIE);\n\nexport const hideRevieve = () => window.Revieve?.API.hide();\n\nexport const initRevieve: Revieve['Init'] = (config, callback) =>\n // eslint-disable-next-line new-cap -- 3rd party naming\n window.Revieve?.Init(config, callback);\n\nexport const isAnalyticsConsentGranted = (): boolean => {\n if (!getCookie(OPTANON_CONSENT_COOKIE)) {\n return true;\n }\n\n return new RegExp(`groups=[^;]*${ONE_TRUST_GROUP_PERFORMANCE}%3A1`).test(\n getCookie(OPTANON_CONSENT_COOKIE) ?? '',\n );\n};\n\nexport const showRevieve = () => window.Revieve?.API.show();\n\nexport const unmountRevieve = () => window.Revieve?.API.unmount();\n"],"names":["ApiProvider","children","value","swrConfig","ErrorBoundary","error","errorInfo","console","this","props","state","Component","DEFAULT_LANGUAGE_KEY","DEFAULT_NAMESPACE","i18nextInstance","i18next","keySeparator","lng","defaultNS","resources","defaultTranslations","interpolation","escapeValue","prefix","suffix","react","bindI18n","bindI18nStore","use","initReactI18next","init","I18nContainer","preloadedTranslations","localizationData","useLocalizationQuery","isPaused","suspense","data","useEffect","addResourceBundle","i18n","Revieve","lazy","async","then","module","default","NovageSkincareAdvisor","novageSkincareConfiguration","useGetNovageSkincareConfiguration","openQueryParam","useOpenQueryParam","currentLanguage","useConfiguration","getTestId","useTestId","APP_NAME","Suspense","fallback","undefined","App","configuration","TestIdProvider","team","APP_TEAM_NAME","project","ThemeProvider","enableCacheProvider","cacheKey","render","rootElement","dataset","config","parseSpaConfig","__CURRENT_LANGUAGE__","customerId","staticApiUrl","tenant","__TENANT__","ReactVersion","createRoot","reactDomRender","configurationContextDefaultValues","NOT_LOGGED_IN_USER_ID","configurationContext","createContext","ConfigurationProvider","Provider","useContext","useLocale","split","useSWR","fetchTranslations","revalidateIfStale","revalidateOnFocus","revalidateOnReconnect","useOnHrefClick","href","onClick","onOpen","event","target","HTMLAnchorElement","hash","shouldOpen","preventDefault","document","addEventListener","removeEventListener","origin","getPdpUrl","id","url","window","location","useRedirectToPdp","timeout","useRef","clearTimeout","current","useCallback","product","delay","redirect","assign","setTimeout","getProductKey","getRevieveUserId","useSessionStorage","env","partnerId","advisorKey","clear","sessionStorage","removeItem","restoreProduct","getItem","JSON","parse","storeProduct","setItem","stringify","useMemo","useRevieveAdvisor","reset","unmountRevieve","initRevieve","close","hideRevieve","open","showRevieve","SCRIPT_ID","useRevieveScript","initConfig","onInit","onLoad","script","getElementById","createElement","charset","src","type","getScriptTag","firstScript","getElementsByTagName","item","parentNode","contains","insertBefore","insertScriptTag","remove","HEADERS","URL","pathname","axios","toString","headers","params","lang","Environment","PartnerId","ApiError","message","getNovageSkincareConfiguration","useLogError","Error","useState","param","setParam","queryParam","getOpenQueryParam","OPEN_QUERY_PARAM_VALID_VALUES","TranslationKeys","name","language","path","originUrl","newPathname","TRANSLATIONS_ENDPOINT","endsWith","slice","getHeaders","validateStatus","status","Translations","getCurrentUrl","searchParams","get","OPEN_QUERY_PARAM","removeOpenQueryParam","delete","replaceCurrentUrl","setOpenQueryParam","set","OPEN_QUERY_PARAM_ONCE","isValidProperty","obj","property","requiredProperties","parsedConfig","forEach","prop","String","getCookie","match","cookie","RegExp","createNameRegExp","REVIEVE_USER_ID_COOKIE","API","hide","callback","Init","isAnalyticsConsentGranted","OPTANON_CONSENT_COOKIE","ONE_TRUST_GROUP_PERFORMANCE","test","show","unmount"],"sourceRoot":""}