{ "version": 3, "sources": ["../../src/modern/features/init/index.js", "../../src/modern/utils/tracking.js", "../../src/modern/utils/config.js", "../../src/modern/utils/apiRequester.js", "../../../../../../owl-nest/common/api-client/src/compat/requester.ts", "../../src/modern/features/init/l10n.js", "../../src/modern/features/init/currency.js", "../../src/modern/utils/currency.js", "../../src/modern/features/init/user.js", "../../src/modern/features/init/location.js", "../../src/modern/utils/cookie.js", "../../src/modern/features/init/language.js", "../../src/modern/features/init/services.js"], "sourcesContent": ["import { setTranslations } from '@ulule/localize'\n\nimport * as consent from '@owl-nest/consent'\nimport * as logger from '@owl-nest/logger'\nimport { addTrackingListeners, sendTrackingEvent } from '$utils/tracking'\nimport config from '$utils/config'\nimport { configure as initApiRequester } from '$utils/apiRequester'\nimport { initL10nConstants } from './l10n.js'\nimport { replayLastAction } from './services.js'\n\nconst localeLoadedEvent = new CustomEvent('js:locale:loaded', {})\n\nasync function fetchLocaleFile() {\n return fetch(window.UFE.localeFile)\n .then((response) => {\n if (response.ok) {\n return response.json()\n } else {\n throw new Error(response.statusText)\n }\n })\n .then((json) => {\n if (json) {\n console.info(`Locale ${window.UFE.locale} has been correctly loaded`)\n setTranslations(json)\n window.dispatchEvent(localeLoadedEvent)\n }\n })\n .catch((error) => {\n console.error(`Locale ${window.UFE.locale} cannot be loaded (error: ${error})`)\n setTranslations({})\n window.dispatchEvent(localeLoadedEvent)\n })\n}\n\n;(function () {\n logger.init({\n dsn: window.UFE.sentry_public_dsn,\n environment: window.UFE.environment,\n user: {\n country: window.UFE.country,\n currency: window.CURRENCIES && window.CURRENCIES.CURRENT,\n email: window.UFE.user && window.UFE.user.email,\n id: window.UFE.user && window.UFE.user.id,\n locale: window.UFE.locale,\n },\n })\n\n if (!window.UFE.iframe) {\n // HACK: listen `load` event to be able to target all nodes even those append by React\n window.addEventListener('load', () => {\n addTrackingListeners()\n })\n\n document.addEventListener('DOMContentLoaded', async () => {\n // Initialize config utils\n config.set(window.UFE)\n\n // Configuration of API Requester\n if (window.UFE.api) {\n initApiRequester(window.UFE.api)\n }\n\n replayLastAction()\n\n // Add event listeners to specific nodes\n addTrackingListeners()\n\n // Wait until locale file is loaded\n await fetchLocaleFile()\n\n // Get current currentLanguage, currentCurrency, currentLocation\n const { currentLanguage, currentCurrency, currentLocation } = await initL10nConstants()\n const currentCountryCode =\n currentLocation && currentLocation.country_code ? currentLocation.country_code : window.UFE.defaultCountry\n\n // if jQuery is embedded in HTML, we should trigger the event\n if (window.$ !== undefined) {\n $(window).trigger('location:loaded', currentLocation)\n }\n\n // Dynamic import renderComponents to avoid importing header on widget\n import('./render-components.js').then(({ renderCommonComponents }) => {\n // Render all React common components\n renderCommonComponents(currentLanguage, currentCountryCode, currentCurrency)\n })\n\n // Send specific event for Ulule Analytics Pro\n if (window.BRANDS_ON_PAGE && window.BRANDS_ON_PAGE.length > 0) {\n sendTrackingEvent('Brand visibility', 'Brands on page', {\n event: 'BRANDevent',\n eventLabel: window.BRANDS_ON_PAGE.join(','),\n nonInteractionEvent: true,\n })\n }\n\n consent.whenGivenFor(consent.Vendor.ZENDESK, {\n do: () => window.zE && window.zE('webWidget', 'updateSettings', { analytics: true, cookies: true }),\n otherwise: () => window.zE && window.zE('webWidget', 'updateSettings', { analytics: false, cookies: false }),\n })\n })\n } else {\n fetchLocaleFile().then(() => {\n const locationLoadedEvent = new CustomEvent('js:location:loaded')\n window.dispatchEvent(locationLoadedEvent)\n })\n }\n})()\n", "import { safePusher } from '@owl-nest/shadow/src/ga/safePush.ts'\n\nexport const sendTrackingEvent = (eventCategory = '', eventAction = '', eventData = {}) => {\n if (eventCategory && eventAction) {\n dataLayer.push({\n event: 'GAevent',\n eventAction,\n eventCategory,\n nonInteractionEvent: undefined,\n ...eventData,\n })\n }\n}\n\nexport const sendSocialTrackingEvent = (socialNetwork = '', socialAction = '', eventData = {}) => {\n if (socialNetwork && socialAction) {\n dataLayer.push({\n event: 'socialInt',\n ...eventData,\n })\n }\n}\n\nexport const addTrackingListeners = () => {\n const projectProposalButtons = document.querySelectorAll('[data-gtm-click=project-proposal]')\n for (let i = 0; i < projectProposalButtons.length; i++) {\n projectProposalButtons[i].addEventListener('click', (event) => {\n sendTrackingEvent('Project proposal', 'click')\n })\n }\n}\n\nexport const formTracker = (trackedFields) => {\n const [stateVariables, errorVariables] = Object.entries(trackedFields).reduce(\n (acc, [_, { value, error }]) => {\n acc[0][value] = 'empty'\n acc[1][error] = 'none'\n return acc\n },\n [{}, {}]\n )\n dataLayer.push(stateVariables)\n dataLayer.push(errorVariables)\n\n const state = {}\n\n const setState = (field, value) => {\n if (state[field] === value) return\n\n state[field] = value\n dataLayer.push({ event: 'GAevent', eventCategory: 'project_form', [trackedFields[field].value]: value })\n }\n\n const setters = Object.keys(trackedFields).reduce((acc, key) => {\n acc[key] = {\n setValue: (value) => setState(key, value),\n markFilled: () => setState(key, 'filled'),\n markEmpty: () => setState(key, 'empty'),\n }\n\n return acc\n }, {})\n\n const onError = (errors) => {\n const messages = {}\n for (const [field, message] of Object.entries(errors)) {\n if (message && trackedFields[field]) {\n const { error } = trackedFields[field]\n messages[error] = message\n }\n }\n if (Object.keys(messages).length !== 0) {\n dataLayer.push({\n event: 'projectFormError',\n ...messages,\n })\n }\n }\n\n const pushGA = ({ category, label, action }, callback) => {\n const event = {\n event: 'GAevent',\n eventAction: action,\n eventCallback: callback,\n eventCategory: category,\n eventLabel: label,\n }\n if (callback && !event.eventTimeout) {\n event.eventTimeout = 500\n }\n\n safePusher(window.UFE.gtmKey)(event)\n }\n\n const onSubmit = (category, label, callback) => {\n pushGA({ category, label, action: 'submit' }, callback)\n }\n\n return { ...setters, onError, onSubmit, pushGA }\n}\n", "class Config {\n set(key, data) {\n if (typeof key === 'string') {\n this[key] = data\n }\n\n if (Object.prototype.toString.call(key) === '[object Object]') {\n Object.assign(this, key)\n }\n }\n\n get(key) {\n return this[key] || ''\n }\n}\n\nexport default new Config()\n", "import { request, requestWithAccessToken } from '@owl-nest/api-client/compat.ts'\n\nconst pool = {}\n\nconst connector = (options) => {\n const getUrl = (url = '') => {\n return options.url + url\n }\n\n const getHeaders = () => {\n return options.headers\n }\n\n const get = (url = '', options = {}) => {\n const { withAccessToken, headers } = options\n\n const fn = withAccessToken ? requestWithAccessToken : request\n\n return fn(getUrl(url), {\n headers: {\n ...getHeaders(),\n ...headers,\n },\n })\n }\n\n const post = (url = '', options = {}) => {\n const { withAccessToken, body, headers, type = 'json' } = options\n\n const fn = withAccessToken ? requestWithAccessToken : request\n\n return fn(getUrl(url), {\n method: 'post',\n body,\n type,\n headers: {\n ...getHeaders(),\n ...headers,\n },\n })\n }\n\n const patch = (url = '', data = {}, options = {}) => {\n const { headers, type = 'json', withAccessToken } = options\n\n const fn = withAccessToken ? requestWithAccessToken : request\n\n return fn(getUrl(url), {\n method: 'PATCH',\n body: data.body,\n type,\n headers: {\n ...getHeaders(),\n ...headers,\n },\n })\n }\n\n const _delete = (url = '', data = {}) => {\n return requestWithAccessToken(getUrl(url), {\n method: 'DELETE',\n body: data,\n headers: getHeaders(),\n })\n }\n\n const upload = (url = '', options = {}) => {\n const { withAccessToken, body } = options\n\n const fn = withAccessToken ? requestWithAccessToken : request\n\n return fn(getUrl(url), {\n method: 'post',\n type: 'formData',\n body,\n headers: getHeaders(),\n })\n }\n\n const me = (extraFields) => {\n if (extraFields && extraFields.length) {\n return requestWithAccessToken(getUrl(`/me?extra_fields=${extraFields}`), {\n headers: getHeaders(),\n })\n }\n return requestWithAccessToken(getUrl('/me'), { headers: getHeaders() })\n }\n\n return {\n get: get,\n post: post,\n patch: patch,\n upload: upload,\n delete: _delete,\n me,\n }\n}\n\nexport const configure = (options) => {\n Object.keys(options).forEach((apiName) => {\n pool[apiName] = connector(options[apiName])\n })\n}\n\nexport const api = (apiName) => {\n return pool[apiName]\n}\n", "import { request as baseRequest, RequestOptions } from '../legacy/index.ts'\n\nexport type LegacyRequestParams = {\n headers?: Record<string, string>\n body?: any\n type?: string\n method?: string\n mode?: string\n credentials?: string\n} & { [s: string]: any }\n\nasync function requestCompat<BODY>(url: string, params: LegacyRequestParams, withToken: boolean): Promise<BODY> {\n const defaultParams = {\n type: 'json',\n method: 'GET',\n mode: 'cors',\n credentials: 'same-origin',\n }\n const options = { ...defaultParams, ...params, withToken } as any as RequestOptions\n\n try {\n const response = await baseRequest<BODY>(url, options)\n return response.doThrow().body\n } catch (error: any) {\n if ('body' in error) {\n // error from left.doThrow (response.ok === false)\n throw { statusCode: error.statusCode, url: error.url, error: error.body }\n }\n if ('response' in error) {\n // body parsing error\n throw { statusCode: error.response.status, url: error.response.url }\n }\n // some other error\n throw error\n }\n}\n\nexport async function request<BODY>(url: string, params: LegacyRequestParams): Promise<BODY> {\n return requestCompat(url, params, false)\n}\n\nexport async function requestWithAccessToken<BODY>(url: string, params: LegacyRequestParams): Promise<BODY> {\n return requestCompat(url, params, true)\n}\n", "import { getCurrentCurrency, initCurrencyHelper } from './currency.js'\nimport { getCurrentLocation, notify, setCurrentLocation } from './location.js'\nimport { getCurrentLanguage } from './language.js'\n\nconst DEFAULT_LOCATION = {\n country: 'FR'\n}\n\nexport const initL10nConstants = async () => {\n const currentLanguage = getCurrentLanguage()\n\n let currentLocation = DEFAULT_LOCATION\n try {\n currentLocation = await getCurrentLocation()\n } catch (error) {\n console.error(error)\n }\n\n setCurrentLocation(currentLocation)\n\n if (window.User) {\n window.User.location = currentLocation\n }\n\n if (!window.CURRENCIES) {\n return { currentLanguage, currentLocation }\n }\n\n let currentCurrency\n try {\n currentCurrency = await getCurrentCurrency()\n } catch (error) {\n console.error(error)\n }\n\n if (currentCurrency) {\n initCurrencyHelper(currentLanguage, currentCurrency)\n window.CURRENCIES.CURRENT = currentCurrency\n }\n notify(currentLocation)\n\n return { currentLanguage, currentCurrency, currentLocation }\n}\n", "import Currency from '$utils/currency'\nimport { isAuthenticated } from './user.js'\nimport { getCurrentLocation } from './location.js'\nimport * as cookie from '$utils/cookie'\n\nexport const getCurrentCurrency = async () => {\n let selectedCurrency = getSelectedCurrency()\n if (selectedCurrency) {\n return selectedCurrency\n }\n\n if (!isAuthenticated()) {\n selectedCurrency = cookie.get(getCurrencyCookieName())\n if (selectedCurrency) {\n return selectedCurrency\n }\n }\n\n let currentLocation\n\n try {\n currentLocation = await getCurrentLocation()\n } catch (error) {\n console.error(error)\n }\n\n const currentCountryCode =\n currentLocation && currentLocation.country_code ? currentLocation.country_code : window.UFE.defaultCountry\n\n return window.CURRENCIES.COUNTRIES[currentCountryCode]\n}\n\nexport const getSelectedCurrency = () => {\n return window.CURRENCIES.SELECTED\n}\n\nexport const getCurrencyCookieName = () => {\n return window.UFE.cookies.currency\n}\n\nexport const initCurrencyHelper = (lang, currency) => {\n new Currency(\n {\n lang: lang,\n currency: currency\n },\n {\n regex: /(<span class=\"amount-trigram\">\\s?\\w+<\\/span>)/,\n formatTrigram: function(trigram, separator) {\n return '<span class=\"amount-trigram\">' + separator + trigram + '</span>'\n },\n formatValue: function(val) {\n return '<span class=\"amount-text\">' + val + '</span>'\n },\n currencies: window.CURRENCIES.SYMBOLS,\n rates: window.CURRENCIES.RATES\n }\n )\n}\n", "import accounting from 'accounting'\n\n/**\n * @param { string } lang\n * @param { string } currency the currency destination\n * @param { object } settings\n */\nclass Currency {\n constructor(options, settings) {\n if (!options || !settings) {\n throw new Error('Missing parameters')\n }\n\n const { lang, currency } = options\n\n this.settings = Object.assign(this.settings, settings)\n\n const currencies = this.settings.currencies\n\n if (!currencies || !currencies[currency]) return\n\n this.lang = lang\n this.currency = currency\n\n this.render()\n this.afterRender()\n }\n\n settings = {\n langs: {\n fr: {\n template: 'symbolFirstFullSpace',\n decimal: ',',\n thousand: ' ',\n },\n en: {\n template: 'noSpace',\n decimal: '.',\n thousand: ',',\n },\n it: {\n template: 'symbolFirstFullSpace',\n decimal: ',',\n thousand: '.',\n },\n nl: {\n template: 'symbolFirstSpace',\n decimal: ',',\n thousand: '.',\n },\n de: {\n template: 'valueFirstFullSpace',\n decimal: ',',\n thousand: '.',\n },\n es: {\n template: 'valueFirstFullSpace',\n decimal: ',',\n thousand: '.',\n },\n ca: {\n template: 'valueFirstFullSpace',\n decimal: ',',\n thousand: '.',\n },\n pt: {\n template: 'noSpace',\n decimal: ',',\n thousand: '.',\n },\n },\n }\n\n templates = {\n //'%s %v %t' // FR\n symbolFirstFullSpace(val, currency, withTrigram, trigramPosition) {\n const { symbol, separator, trigram } = currency\n const html = `${this.settings.formatValue(val)} ${symbol} ${\n withTrigram && trigram ? this.settings.formatTrigram(trigram, separator) : ''\n }`\n\n return this.postTemplate(trigram, trigramPosition, html)\n },\n\n // template: '%s$t%v' // EN - IT\n noSpace(val, currency, withTrigram, trigramPosition) {\n const { symbol, separator, trigram } = currency\n const html = `${symbol}${\n withTrigram && trigram ? this.settings.formatTrigram(trigram, separator) : ''\n }${this.settings.formatValue(val)}`\n\n return this.postTemplate(trigram, trigramPosition, html)\n },\n\n // template: '%v %s %t' // DE - ES\n valueFirstFullSpace(val, currency, withTrigram, trigramPosition) {\n const { symbol, separator, trigram } = currency\n const html = `${this.settings.formatValue(val)} ${symbol}${\n withTrigram && trigram ? this.settings.formatTrigram(trigram, separator) : ''\n }`\n\n return this.postTemplate(trigram, trigramPosition, html)\n },\n\n // template: '%s %t%v' // NL\n symbolFirstSpace(val, currency, withTrigram, trigramPosition) {\n const { symbol, separator, trigram } = currency\n const html = `${symbol} ${this.settings.formatValue(val)}${\n withTrigram && trigram ? this.settings.formatTrigram(trigram, separator) : ''\n }`\n\n return this.postTemplate(trigram, trigramPosition, html)\n },\n }\n\n /**\n * @param { string } trigram\n * @param { string } trigramPosition\n * @param { any } html\n * @param { boolean } noSpace used for the special cases (it, nl, en, pt)\n * @returns\n */\n postTemplate(trigram, trigramPosition, html) {\n if (!trigram || !trigramPosition) return html\n\n // const reg = /(<[\\w\\s\\S]+>)/;\n const reg = this.settings.regex\n const match = reg.exec(html)\n\n if (!match) return html\n\n html = html.replace(match[0], '')\n\n if ('after' == trigramPosition) {\n html = `${html} ${match[0]}`\n }\n\n if ('before' == trigramPosition) {\n html = `${match[0]} ${html}`\n }\n\n return html\n }\n\n /**\n * @param { number } amount\n * @param { string } baseCurrency\n * @returns\n */\n\n getConversion(amount = '', baseCurrency) {\n amount = amount.replace(/,/g, '.')\n\n if (baseCurrency == this.currency) return amount\n\n const rate = this.settings.rates[this.currency]\n //convert in baseCurrency\n const inBaseCurrency = amount / this.settings.rates[baseCurrency]\n //convert in currency\n return inBaseCurrency * rate\n }\n\n render() {\n const langOpts = this.settings.langs[this.lang] || this.settings.langs['en']\n const currencyInfos = this.settings.currencies[this.currency]\n const template = this.templates[langOpts.template].bind(this)\n\n this.settings = Object.assign(this.settings, accounting.settings.number, langOpts)\n\n const currencyNodes = Array.prototype.slice.call(document.querySelectorAll('.js-currency'))\n\n currencyNodes.forEach((node) => {\n const baseCurrency = node.getAttribute('data-currency')\n\n if (baseCurrency == this.currency) return\n const newCheckout = node.getAttribute('data-newcheckout')\n if (newCheckout) return\n const val = this.getConversion(node.getAttribute('data-value'), baseCurrency)\n const withTrigram = node.getAttribute('data-trigram')\n const trigramPosition = node.getAttribute('data-trigram-position')\n const precision = node.getAttribute('data-precision') || 0\n\n accounting.settings.number.precision = precision\n\n const result = template(accounting.formatNumber(val), currencyInfos, withTrigram, trigramPosition)\n\n node.innerHTML = result\n })\n }\n\n afterRender() {\n var event = new CustomEvent('currency:afterRender')\n window.dispatchEvent(event)\n }\n}\n\nexport default Currency\n\nwindow.Currency = Currency\n", "export const isAuthenticated = () => {\n return window.UFE.user.is_authenticated\n}\n", "const GEO_API_URL = 'https://geo.ulule.com/json/'\nconst DEFAULT_LOCATION = {\n country: 'FR'\n}\n\nconst parseData = json => {\n return json\n}\n\nexport const notify = json => {\n const locationLoadedEvent = new CustomEvent('js:location:loaded', { detail: json })\n window.dispatchEvent(locationLoadedEvent)\n\n return json\n}\n\nconst fetchLocation = () => {\n return fetch(GEO_API_URL)\n .then(res => res.json())\n .then(json => parseData(json))\n}\n\nexport const setCurrentLocation = data => {\n return (window.CURRENT_LOCATION = data)\n}\n\nexport const getCurrentLocation = async () => {\n let locationData = window.CURRENT_LOCATION\n\n if (locationData) {\n return locationData\n }\n\n try {\n locationData = await fetchLocation()\n } catch (error) {\n console.error('Oops, there is an error', error)\n throw error\n }\n\n return locationData\n}\n", "export const getDocumentCookie = () => {\n return document.cookie\n}\n\nexport const setDocumentCookie = cookie => {\n document.cookie = cookie\n}\n\nexport const get = name => {\n const cookie = getDocumentCookie()\n const re = new RegExp(`${name}=(.[^;]+)?`)\n const match = cookie.match(re)\n return match && match.length && match[1]\n}\n\nexport const set = (name = '', value = '', options = {}) => {\n const params = [`${name}=${value}`]\n\n if (options.expires) {\n params.push(`expires=${options.expires}`)\n }\n\n if (options.path) {\n params.push(`path=${options.path}`)\n }\n\n if (options.domain) {\n params.push(`domain=${options.domain}`)\n }\n\n setDocumentCookie(params.join(';'))\n}\n\nexport const remove = name => {\n document.cookie = `${name}=path=/expires=Thu, 01-Jan-70 00:00:01 GMT;`\n}\n", "export const setCurrentLanguage = value => {\n window.UFE.locale = value\n}\n\nexport const getCurrentLanguage = () => {\n return window.UFE.locale\n}\n\nexport const getDefaultLanguage = () => window.UFE && window.UFE.defaultLocale\n", "import { api } from '$utils/apiRequester'\n\n/**\n * id : project id\n * action : like or unlike\n */\nexport const updateUserRole = (id = '', action = '', projectUrl) => {\n const endpoint = `/projects/${id}/${action}`\n\n return api('ulule')\n .post(endpoint, {\n withAccessToken: true,\n body: {},\n })\n .then((resp) => {\n return new Promise((resolve) => {\n resolve({ success: true, action })\n })\n })\n .catch((error) => {\n saveAction(id, action)\n throw error\n })\n}\n\nexport const getChannels = (lang, country) => {\n const endpoint = `/channels?limit=6&${lang ? `lang=${lang}&` : ''}${country ? `country=${country}` : ''}`\n\n return api('ulule')\n .get(endpoint)\n .then((resp) => {\n return new Promise((resolve) => {\n resolve({ success: true, ...resp })\n })\n })\n .catch((error) => {\n throw error\n })\n}\n\nexport const saveAction = (id, action) => {\n sessionStorage.setItem('lastAction', JSON.stringify({ id, action }))\n}\n\nexport const replayLastAction = () => {\n const entry = sessionStorage.getItem('lastAction')\n if (entry) {\n sessionStorage.removeItem('lastAction')\n const { id, action } = JSON.parse(entry)\n return updateUserRole(id, action)\n }\n}\n"], "mappings": "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", "names": ["init_define_process_env", "init_sentry_release_injection_stub", "import_localize", "init_define_process_env", "init_sentry_release_injection_stub", "sendTrackingEvent", "eventCategory", "eventAction", "eventData", "__spreadValues", "addTrackingListeners", "projectProposalButtons", "i", "event", "sendTrackingEvent", "init_define_process_env", "init_sentry_release_injection_stub", "Config", "key", "data", "config_default", "init_define_process_env", "init_sentry_release_injection_stub", "init_define_process_env", "init_sentry_release_injection_stub", "requestCompat", "url", "params", "withToken", "options", "__spreadProps", "__spreadValues", "request", "error", "requestWithAccessToken", "pool", "connector", "options", "getUrl", "url", "getHeaders", "withAccessToken", "headers", "requestWithAccessToken", "request", "__spreadValues", "body", "type", "data", "extraFields", "configure", "apiName", "api", "init_define_process_env", "init_sentry_release_injection_stub", "init_define_process_env", "init_sentry_release_injection_stub", "init_define_process_env", "init_sentry_release_injection_stub", "import_accounting", "Currency", "options", "settings", "__publicField", "val", "currency", "withTrigram", "trigramPosition", "symbol", "separator", "trigram", "html", "lang", "currencies", "match", "amount", "baseCurrency", "rate", "langOpts", "currencyInfos", "template", "accounting", "node", "precision", "result", "event", "currency_default", "init_define_process_env", "init_sentry_release_injection_stub", "isAuthenticated", "init_define_process_env", "init_sentry_release_injection_stub", "GEO_API_URL", "parseData", "json", "notify", "locationLoadedEvent", "fetchLocation", "GEO_API_URL", "res", "setCurrentLocation", "data", "getCurrentLocation", "locationData", "error", "init_define_process_env", "init_sentry_release_injection_stub", "getDocumentCookie", "setDocumentCookie", "cookie", "get", "name", "re", "match", "set", "value", "options", "params", "getCurrentCurrency", "selectedCurrency", "getSelectedCurrency", "isAuthenticated", "get", "getCurrencyCookieName", "currentLocation", "getCurrentLocation", "error", "currentCountryCode", "initCurrencyHelper", "lang", "currency", "currency_default", "trigram", "separator", "val", "init_define_process_env", "init_sentry_release_injection_stub", "getCurrentLanguage", "getDefaultLanguage", "DEFAULT_LOCATION", "initL10nConstants", "currentLanguage", "getCurrentLanguage", "currentLocation", "getCurrentLocation", "error", "setCurrentLocation", "currentCurrency", "getCurrentCurrency", "initCurrencyHelper", "notify", "init_define_process_env", "init_sentry_release_injection_stub", "updateUserRole", "id", "action", "projectUrl", "endpoint", "api", "resp", "resolve", "error", "saveAction", "saveAction", "id", "action", "replayLastAction", "entry", "updateUserRole", "localeLoadedEvent", "fetchLocaleFile", "response", "json", "error", "init", "locationLoadedEvent", "addTrackingListeners", "config_default", "configure", "replayLastAction", "currentLanguage", "currentCurrency", "currentLocation", "initL10nConstants", "currentCountryCode", "renderCommonComponents", "sendTrackingEvent", "whenGivenFor"] }