{"version":3,"file":"chunks/3fc78ccdc18050c0cc72.js","mappings":"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","sources":["webpack:///./resources/js/components/shared/language-switcher-nav.ts","webpack:///./resources/js/customer-experience/modules/atl-storage.ts"],"sourcesContent":["import * as $ from \"jquery\";\nimport axios from 'axios';\nimport Storage from '../../customer-experience/modules/atl-storage';\nimport Environment from '../../common/environment';\nimport { Segment } from '../../common/tracking/platforms';\n\nexport default class LanguageSwitcherNav {\n constructor (componentRoot, params) {\n this.componentRoot = $(componentRoot);\n this.params = { ...params };\n\n this.storage = new Storage();\n\n this.currentLocale = this.getCurrentLocale();\n this.preferredLocale = null;\n\n this.bannerDismissStorageKey = 'language-selector-banner-dismissed';\n this.preferredLocaleStorageKey = 'language-selector-preferred';\n this.activeBannerClass = 'language-selector-banner--open';\n\n this.dissmissButton = this.componentRoot.find('.language-selector-banner__close-banner');\n this.selectTrigger = this.componentRoot.find('.language-selector-banner__language-selector__trigger');\n this.preferredLocaleLink = this.componentRoot.find('.language-selector-banner__language-suggestion > a');\n this.preferredLocaleLabel = this.preferredLocaleLink.find('.preferred-locale-detected');\n\n this.init();\n }\n\n init () {\n this.fixLanguageBannerForCloudSignup();\n this.preselectFooterLanguage(this.currentLocale);\n\n if (!this.languageSelectorDismissed()) {\n this.checkLocales();\n }\n }\n\n checkLocales() {\n return this.detectBrowserLocale().then(locale => {\n this.storage.session.set(this.preferredLocaleStorageKey, locale);\n this.preferredLocale = locale;\n\n if (this.isLocaleDifferent()) {\n this.bindEvents();\n this.preselectBannerLanguage(locale);\n }\n })\n .catch(() => {\n Segment.track({\n category: 'bxp',\n action: 'language-selector.api.error',\n label: 'language-selector',\n });\n });\n\n }\n\n /**\n * This is required for WPI-1600, since gateway removes all query params\n * before proxying to Magnolia. Hence in the language switcher, Magnolia loses\n * context of which signup landing page it was in. This fix will add the browser\n * query params to Language switcher\n */\n fixLanguageBannerForCloudSignup() {\n if (window.location.pathname.includes(\"/try/cloud/signup\") || window.location.pathname.includes(\"/signup/rename/site\")) {\n this.componentRoot.find('.language-selector-banner__language-selector__options__list__item a').each(function() {\n $(this).attr(\"data-locale-url\", $(this).attr(\"data-locale-url\") + window.location.search);\n $(this).attr(\"href\", $(this).attr(\"href\") + window.location.search);\n });\n }\n\n }\n\n preselectFooterLanguage(locale) {\n const footer = $('#footer');\n const footerLanguageLabel = footer.find('.language-selector--text');\n const selectableOption = footer.find(`.language-selector option[data-lang=\"${locale}\"]`);\n\n if (selectableOption.length) {\n selectableOption.prop('selected', true);\n footerLanguageLabel.html(selectableOption.text());\n }\n }\n\n preselectBannerLanguage(preferredLocale) {\n const availableLanguagesCurrentLanguage = this.componentRoot.find(`[data-lang=\"${this.currentLocale}\"]`);\n const availableLanguagesPreferredLanguage = this.componentRoot.find(`[data-lang=\"${preferredLocale}\"]`);\n\n if (availableLanguagesCurrentLanguage.length) {\n availableLanguagesCurrentLanguage.parent().addClass('language-selector-banner__language-selector__options__list__item--selected');\n }\n\n if (availableLanguagesPreferredLanguage.length) {\n const preferredLocaleHref = availableLanguagesPreferredLanguage.data('locale-url');\n const preferredLocaleLabel = availableLanguagesPreferredLanguage.text();\n\n this.preferredLocaleLink.attr('href', preferredLocaleHref);\n this.preferredLocaleLabel.text(preferredLocaleLabel);\n\n this.showBanner();\n } else {\n Segment.track({\n category: 'bxp',\n action: `language-selector.preferredLocaleNotAvailable_${preferredLocale}`,\n label: 'language-selector',\n });\n }\n\n }\n\n languageSelectorDismissed() {\n return this.storage.local.get(this.bannerDismissStorageKey);\n }\n\n detectBrowserLocale() {\n const preferredLocale = this.getPreferredLocale();\n if (this.getPreferredLocale()) {\n return Promise.resolve(preferredLocale);\n }\n\n return axios.get(`${Environment.getWacIntegrationUrl()}/endpoint/info/lang`)\n .then(response => {\n return response.data;\n });\n }\n\n getCurrentLocale() {\n const i18nLocale = Environment.getInternationalSubdomain() || Environment.getInternationalSubdirectory();\n\n return i18nLocale ? i18nLocale : 'en';\n }\n\n getPreferredLocale() {\n const preferredLocale = this.storage.session.get(this.preferredLocaleStorageKey);\n if (preferredLocale) {\n return Promise.resolve(preferredLocale);\n }\n return null;\n }\n\n isLocaleDifferent() {\n return this.currentLocale !== this.preferredLocale;\n }\n\n bindEvents() {\n this.selectTrigger.on('click', (event) => {\n event.stopPropagation();\n this.toggleSelect();\n });\n\n this.dissmissButton.on('click', () => {\n this.dismissBanner();\n });\n\n $(document).on('click', () => {\n this.hideSelect();\n })\n }\n\n hideSelect() {\n this.componentRoot.removeClass(this.activeBannerClass);\n }\n\n toggleSelect() {\n this.componentRoot.toggleClass(this.activeBannerClass);\n }\n\n showBanner() {\n this.componentRoot.show();\n Segment.track({\n category: 'bxp',\n action: `language-selector.shown.preferredLocale_${this.preferredLocale}.currentLocale_${this.currentLocale}`,\n label: 'language-selector',\n });\n }\n\n\n dismissBanner() {\n this.storage.local.set(this.bannerDismissStorageKey, 1);\n this.componentRoot.hide();\n Segment.track({\n category: 'bxp',\n action: `language-selector.dismissed.preferredLocale_${this.preferredLocale}.currentLocale_${this.currentLocale}`,\n label: 'language-selector',\n });\n }\n}\n","import _ from 'underscore';\n\n/*\n * Abstraction library for storing data in the browser. Handles all the actual\n * browser interaction for localStorage, sessionStorage and cookies.\n */\nexport default function () {\n\n /*\n * Create a storage prefix key to use for local/session storage\n * Use a reverse of the site host. ie: atlassian.com prefix will\n * be com.atlassian.angular.storage\n */\n var prefix = window.location.hostname\n .split('.')\n .reverse()\n .join('.') + '.bxp.storage',\n\n $window = window,\n browserSupport = {},\n stringify = JSON.stringify,\n\n supports = function (storageType) {\n if (_.has(browserSupport, storageType)) {\n return browserSupport[storageType];\n }\n if (_.contains(['localStorage', 'sessionStorage'], storageType)) {\n try {\n browserSupport[storageType] = typeof $window[storageType] === 'object' &&\n typeof $window[storageType].setItem === 'function' &&\n typeof $window[storageType].getItem === 'function' &&\n typeof $window[storageType].clear === 'function';\n } catch (e) {\n browserSupport[storageType] = false;\n }\n }\n return browserSupport[storageType];\n };\n\n /*\n * Abstraction over local and session storage. If write error occurs, catch it\n * then clear the storage and disable browserSupport property for that storage\n * type so any further attempts to write to that browser storage don't work.\n * If local/session storage is unsupported, and the stringified value really small\n * then attempt to save it to a cookie as a fallback mechanism\n */\n var setItem = function (storageType, key, value) {\n var storageKey = [ prefix, key ].join('.'),\n outputString = stringify(value);\n\n if (supports(storageType)) {\n try {\n $window[storageType].setItem(storageKey, outputString);\n } catch (e) {\n browserSupport[storageType] = false;\n }\n } else if (outputString.length < 150) {\n this.cookie.set(storageKey, value);\n }\n };\n\n /*\n * Read in the value of a given key from local/session storage.\n * Fallback to cookies instituted here as well should local/session be\n * unavailable\n */\n var getItem = function (storageType, key) {\n var storageKey = [ prefix, key ].join('.');\n if (supports(storageType)) {\n return JSON.parse($window[storageType].getItem(storageKey));\n } else {\n this.cookie.get(storageKey);\n }\n };\n\n /*\n * Wipe out an item from local/session storage with cookie fallback\n */\n var removeItem = function (storageType, key) {\n var storageKey = [ prefix, key ].join('.');\n if (supports(storageType)) {\n $window[storageType].removeItem(storageKey);\n } else {\n this.cookie.remove(storageKey);\n }\n };\n\n /*\n * Clear all local/session storage data for the app\n */\n var clear = function (storageType) {\n if (supports(storageType)) {\n $window[storageType].clear();\n }\n };\n\n /*\n * In-memory cache\n */\n var SESSION_STORAGE = {};\n var LOCAL_STORAGE = {\n timestamp: getItem('localStorage', 'timestamp')\n };\n\n if (LOCAL_STORAGE.timestamp && _.isNumber(LOCAL_STORAGE.timestamp)) {\n var timestamp = new Date(LOCAL_STORAGE.timestamp),\n ageInDays = (new Date() - timestamp) / 1000 / 60 / 60 / 24;\n if (ageInDays > 30) {\n clear('localStorage');\n }\n } else {\n LOCAL_STORAGE = { timestamp: Date.parse(new Date()) };\n setItem('localStorage', 'timestamp', LOCAL_STORAGE.timestamp);\n }\n\n /*\n * Public API\n */\n return {\n local: {\n set: function (key, value) {\n // don't add null or undefined, but 0 and '' and false are okay\n if (!value && value !== 0 && value !== '' && value !== false) {\n return false;\n }\n LOCAL_STORAGE[key] = value;\n setItem('localStorage', key, value);\n },\n get: function (key) {\n LOCAL_STORAGE[key] = getItem('localStorage', key);\n return LOCAL_STORAGE[key] || null;\n },\n remove: function (key) {\n delete LOCAL_STORAGE[key];\n removeItem('localStorage', key);\n },\n clear: function () {\n LOCAL_STORAGE = {};\n clear('localStorage');\n }\n },\n session: {\n set: function (key, value) {\n // don't add null or undefined, but 0 and '' and false are okay\n if (!value && value !== 0 && value !== '' && value !== false) {\n return false;\n }\n SESSION_STORAGE[key] = value;\n setItem('sessionStorage', key, value);\n },\n get: function (key) {\n SESSION_STORAGE[key] = getItem('sessionStorage', key);\n return SESSION_STORAGE[key] || null;\n },\n remove: function (key) {\n delete SESSION_STORAGE[key];\n removeItem('sessionStorage', key);\n },\n clear: function () {\n SESSION_STORAGE = {};\n clear('sessionStorage');\n }\n },\n cookie: {\n set: function (key, value, days) {\n let date = new Date();\n date.setTime(date.getTime() + (days*24*60*60*1000));\n\n if (!days) {\n days = 30;\n }\n let expires = \"; expires=\" + date.toUTCString();\n\n document.cookie = key + \"=\" + value + expires + \"; path=/\";\n },\n get: function (key) {\n const encodedName = encodeURIComponent(key).replace(/[\\-\\.\\+\\*]/g, \"\\\\$&\");\n const regex = new RegExp(\"(?:(?:^|.*;)\\\\s*\" + encodedName + \"\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$\");\n return decodeURIComponent(document.cookie.replace(regex, \"$1\")) || null;\n },\n remove: function (key) {\n this.cookie.set(key,'',-1);\n }\n },\n support: browserSupport\n };\n}\n"],"names":["LanguageSwitcherNav","componentRoot","params","this","$","storage","Storage","currentLocale","getCurrentLocale","preferredLocale","bannerDismissStorageKey","preferredLocaleStorageKey","activeBannerClass","dissmissButton","find","selectTrigger","preferredLocaleLink","preferredLocaleLabel","init","fixLanguageBannerForCloudSignup","preselectFooterLanguage","languageSelectorDismissed","checkLocales","detectBrowserLocale","then","locale","session","set","isLocaleDifferent","bindEvents","preselectBannerLanguage","Segment","category","action","label","window","location","pathname","includes","each","attr","search","footer","footerLanguageLabel","selectableOption","length","prop","html","text","availableLanguagesCurrentLanguage","availableLanguagesPreferredLanguage","parent","addClass","preferredLocaleHref","data","showBanner","local","get","getPreferredLocale","Promise","resolve","axios","Environment","response","on","event","stopPropagation","toggleSelect","dismissBanner","document","hideSelect","removeClass","toggleClass","show","hide","prefix","hostname","split","reverse","join","$window","browserSupport","stringify","JSON","supports","storageType","_","setItem","getItem","clear","e","key","value","storageKey","outputString","cookie","parse","removeItem","remove","SESSION_STORAGE","LOCAL_STORAGE","timestamp","Date","days","date","setTime","getTime","expires","toUTCString","encodedName","encodeURIComponent","replace","regex","RegExp","decodeURIComponent","support"],"sourceRoot":""}