{"version":3,"file":"main-dLuLc6yP.js","sources":["../../Assets/Scripts/utils/trackingUtils.ts","../../Assets/Scripts/components/accordion/index.ts","../../Assets/Scripts/components/crossSaveToggle/index.ts","../../Assets/Scripts/components/confirmDialog/index.ts","../../Assets/Scripts/utils/numberUtils.ts","../../Assets/Scripts/utils/dateUtils.ts","../../Assets/Scripts/components/drops/index.ts","../../Assets/Scripts/components/entitlements/service/fetchEntitlements.ts","../../Assets/Scripts/components/entitlements/index.ts","../../Assets/Scripts/components/inViewport/index.ts","../../Assets/Scripts/components/itemHistoryModal/index.ts","../../Assets/Scripts/components/lazyLoadBackground/index.ts","../../Assets/Scripts/components/reveal/index.ts","../../Assets/Scripts/utils/keyCode.ts","../../Assets/Scripts/components/toggleGroupNav/index.ts","../../Assets/Scripts/components/toggleNav/index.ts","../../Assets/Scripts/components/trackClick/index.ts","../../Assets/Scripts/components/autosizeAccounts/index.ts","../../Assets/Scripts/index.ts"],"sourcesContent":["export const trackEvent = (\r\n category: string,\r\n action: string,\r\n label: string | null\r\n) => {\r\n if (!window.gtag || !category || !action) {\r\n return;\r\n }\r\n\r\n window.gtag(\"event\", action, {\r\n event_category: category,\r\n event_label: label,\r\n });\r\n};\r\n","import { trackEvent } from \"../../utils/trackingUtils\";\r\n\r\nconst ACCORDION_CLASS = \"js-accordion\";\r\nconst ACCORDION_SELECTOR = `.${ACCORDION_CLASS}`;\r\nconst ACCORDION_TOGGLE_SELECTOR = \".js-accordion-toggle\";\r\nconst CSS_TOGGLED = \"accordion--toggled\";\r\n\r\n/**\r\n * Initialises accordions.\r\n */\r\n\r\nconst accordion = () => {\r\n const hide = ($el: HTMLElement) => {\r\n $el.classList.remove(CSS_TOGGLED);\r\n $el.setAttribute(\"aria-expanded\", \"false\");\r\n };\r\n\r\n const show = ($el: HTMLElement, ignoreTracking: boolean) => {\r\n $el.classList.add(CSS_TOGGLED);\r\n $el.setAttribute(\"aria-expanded\", \"true\");\r\n $el.focus();\r\n\r\n if (!ignoreTracking && $el.children.length > 0) {\r\n trackEvent(\"faq\", \"expand\", $el.children[0].textContent);\r\n }\r\n };\r\n\r\n const toggleVisibility = (e: MouseEvent) => {\r\n if (e) {\r\n e.stopImmediatePropagation();\r\n e.preventDefault();\r\n }\r\n\r\n const $clicked = e.currentTarget as HTMLElement;\r\n const target = $clicked.dataset.target as string;\r\n const $target = document.querySelector(target) as HTMLElement;\r\n\r\n $clicked.blur();\r\n\r\n if ($target.classList.contains(CSS_TOGGLED)) {\r\n hide($target);\r\n return;\r\n }\r\n\r\n show($target, false);\r\n };\r\n\r\n if (!document.querySelectorAll(ACCORDION_TOGGLE_SELECTOR).length) {\r\n return;\r\n }\r\n\r\n document.querySelectorAll(ACCORDION_SELECTOR).forEach(($el: Element) => {\r\n const $htmlElement = $el as HTMLElement;\r\n\r\n $htmlElement.classList.remove(CSS_TOGGLED);\r\n $htmlElement.setAttribute(\"aria-expanded\", \"false\");\r\n });\r\n\r\n show(document.querySelectorAll(ACCORDION_SELECTOR)[0] as HTMLElement, true);\r\n\r\n document\r\n .querySelectorAll(ACCORDION_TOGGLE_SELECTOR)\r\n .forEach(($el: Element) => {\r\n const $htmlElement = $el as HTMLElement;\r\n\r\n $htmlElement.addEventListener(\"click\", toggleVisibility);\r\n });\r\n\r\n const locationHashChanged = () => {\r\n const $hash = document.querySelector(window.location.hash) as HTMLElement;\r\n if ($hash !== null && $hash.classList.contains(ACCORDION_CLASS)) {\r\n show($hash, true);\r\n }\r\n };\r\n\r\n // If the window loads with an # that corresponds to an accordion item, open it by default\r\n if (window.location.hash) {\r\n locationHashChanged();\r\n }\r\n\r\n // If a # link is clicked that corresponds to an accordion item, open it\r\n window.onhashchange = locationHashChanged;\r\n};\r\n\r\nexport default accordion;\r\n","/**\r\n * Handles toggling for cross save for a platform.\r\n */\r\n\r\nconst CONFIG = {\r\n toggleUpdateErrorMessage:\r\n 'Unfortunately there was an error updating whether cross-save is enabled.',\r\n requestDelay: 500,\r\n};\r\n\r\nconst CSS = {\r\n hidden: 'hidden',\r\n};\r\n\r\nconst SELECTORS = {\r\n antiForgeryTokenInput: 'input[name=\"__RequestVerificationToken\"]',\r\n error: '.js-cross-save-error',\r\n input: '.js-cross-save-toggle-input',\r\n root: '.js-cross-save-toggle',\r\n};\r\n\r\ninterface IToggleDom {\r\n $antiForgeryTokenInput: HTMLInputElement | null;\r\n $error: HTMLElement | null;\r\n $input: HTMLInputElement | null;\r\n}\r\n\r\nconst instance = ($el: HTMLElement) => {\r\n const options = {\r\n platform: $el.getAttribute('data-platform') || '',\r\n };\r\n\r\n const dom: IToggleDom = {\r\n $antiForgeryTokenInput: $el.querySelector(SELECTORS.antiForgeryTokenInput),\r\n $error: document.querySelector(SELECTORS.error),\r\n $input: $el.querySelector(SELECTORS.input),\r\n };\r\n\r\n const state = {\r\n requestDelayTimeout: 0,\r\n };\r\n\r\n if (!options.platform || !dom.$input || !dom.$antiForgeryTokenInput) {\r\n return;\r\n }\r\n\r\n const handleInputChange = () => {\r\n hideError();\r\n\r\n if (state.requestDelayTimeout) {\r\n window.clearTimeout(state.requestDelayTimeout);\r\n }\r\n\r\n state.requestDelayTimeout = window.setTimeout(\r\n sendToggleRequest,\r\n CONFIG.requestDelay\r\n );\r\n };\r\n\r\n const hideError = () => {\r\n if (!dom.$error) {\r\n return;\r\n }\r\n\r\n dom.$error.classList.add(CSS.hidden);\r\n dom.$error.innerHTML = '';\r\n };\r\n\r\n const sendToggleRequest = () => {\r\n const formData = new FormData();\r\n formData.append('isEnabled', dom.$input?.checked ? 'true' : 'false');\r\n formData.append(\r\n '__RequestVerificationToken',\r\n dom.$antiForgeryTokenInput?.value ?? ''\r\n );\r\n\r\n fetch(`/cross-save/${options.platform}`, {\r\n method: 'POST',\r\n body: formData,\r\n })\r\n .then((response) => {\r\n if (!response.ok) {\r\n throw new Error();\r\n }\r\n })\r\n .catch(() => {\r\n showError(CONFIG.toggleUpdateErrorMessage);\r\n });\r\n };\r\n\r\n const showError = (message: string) => {\r\n if (!dom.$error) {\r\n return;\r\n }\r\n\r\n dom.$error.innerHTML = message;\r\n dom.$error?.classList.remove(CSS.hidden);\r\n };\r\n\r\n dom.$input.addEventListener('change', handleInputChange);\r\n};\r\n\r\nexport default () => {\r\n document.querySelectorAll(SELECTORS.root).forEach(($el: Element) => {\r\n instance($el as HTMLElement);\r\n });\r\n};\r\n","/**\r\n * Handles showing a confirm dialog when performing a destructive action that requires confirmation (such as unlinking, reconnecting or removing an account).\r\n */\r\n\r\nconst SELECTORS = {\r\n confirmDialog: '.js-confirm-dialog',\r\n confirmDialogTitle: '.js-confirm-dialog-title',\r\n confirmDialogContent: '.js-confirm-dialog-content',\r\n confirmBtn: '.js-confirm-dialog-confirm-button',\r\n cancelBtn: '.js-confirm-dialog-cancel-button',\r\n destructiveActions: '.js-confirm-dialog-confirmation-target',\r\n primaryAccount: '.js-primary-account',\r\n accountMigrationAction: '.js-confirm-dialog-confirmation-target[data-action=\"link\"]'\r\n};\r\n\r\nconst dom = {\r\n $confirmDialog: document.querySelector(SELECTORS.confirmDialog),\r\n $confirmDialogTitle: document.querySelector(SELECTORS.confirmDialogTitle),\r\n $confirmDialogContent: document.querySelector(SELECTORS.confirmDialogContent),\r\n $confirmBtn: document.querySelector(SELECTORS.confirmBtn),\r\n $cancelBtn: document.querySelector(SELECTORS.cancelBtn),\r\n $destructiveActions: document.querySelectorAll(SELECTORS.destructiveActions),\r\n $accountMigrationAction: document.querySelector(SELECTORS.accountMigrationAction)\r\n}\r\n\r\nconst instance = ($el: HTMLElement) => {\r\n $el.addEventListener('click', handleButtonClick);\r\n}\r\n\r\nconst handleButtonClick = (e: MouseEvent) => {\r\n e.preventDefault();\r\n if (!(e.target instanceof HTMLElement)) {\r\n return;\r\n }\r\n if (!dom.$confirmDialogContent || !dom.$confirmDialogTitle) {\r\n return;\r\n }\r\n\r\n const categoryToPlatform = new Map([\r\n ['xbox', 'Xbox'],\r\n ['psn', 'Sony'],\r\n ['steam', 'Steam'],\r\n ['gog', 'GOG'],\r\n ['nintendo', 'Nintendo'],\r\n ['twitch', 'Twitch'],]);\r\n\r\n // If the click is taking event on a Form, then use the form as the target element, otherwise use the clicked element (to support both anchor and form elements))\r\n const $el = e.target.closest('form') ? e.target.closest('form') : e.target;\r\n\r\n const $clickBeingConfirmed = $el!.cloneNode(true);\r\n const action = $el!.getAttribute('data-action');\r\n const platform = categoryToPlatform.get($el!.getAttribute('data-category') ?? '');\r\n const username = $el!.getAttribute('data-migration-username');\r\n const isDestructiveMigration = $el!.getAttribute('data-migration-only-platform')?.toLowerCase() === 'true';\r\n\r\n let confirmDialogTitle = '';\r\n let confirmDialogContent = '';\r\n let confirmDialogButtonText = '';\r\n\r\n if (action === 'remove') {\r\n confirmDialogTitle = 'Disconnect All Accounts';\r\n confirmDialogContent = 'Disconnecting all your connected accounts will permanently erase your \"Hello User ID\", and any save data you have stored on the Hello Games servers.
Are you sure you want to continue and erase your cross-platform data?';\r\n confirmDialogButtonText = 'ERASE DATA';\r\n }\r\n\r\n if (action === 'unlink') {\r\n confirmDialogTitle = 'Disconnect Account';\r\n confirmDialogContent = `Are you sure you want to disconnect your ${platform} account?`;\r\n confirmDialogButtonText = 'DISCONNECT'\r\n }\r\n\r\n if (action === 'link') {\r\n confirmDialogTitle = 'Reconnect Account';\r\n confirmDialogButtonText = `RECONNECT`;\r\n\r\n // If the user decides to cancel the reconnect dialog, we want the connect button to behave as normal and allow them to connect to a new account\r\n // (rather than trigger the warning dialog again in order to re-attempt the same account migration)\r\n $el?.removeEventListener('click', handleButtonClick);\r\n\r\n confirmDialogContent = `Warning: Your ${platform} account ${username} is already connected to another \"Hello User ID\".
\r\n If you would like to move this account to your current Hello User ID, please click the ${confirmDialogButtonText} button below.

`;\r\n\r\n if (isDestructiveMigration) {\r\n confirmDialogContent += `Note that the other Hello User ID, and any saves uploaded to its cross-platform storage, will be permanently deleted if you do this.

\r\n Are you sure you want to continue?`;\r\n }\r\n else {\r\n confirmDialogContent += `Note that your ${platform} account ${username} will no longer have access to the cross-platform storage associated with the other Hello User ID if you do this.

\r\n Are you sure you want to continue?`;\r\n }\r\n }\r\n\r\n dom.$confirmDialogTitle.innerText = confirmDialogTitle;\r\n dom.$confirmDialogContent.innerHTML = confirmDialogContent;\r\n\r\n // If we're confirming an anchor element click (a GET), then place the anchor element within the confirm button\r\n if ($clickBeingConfirmed instanceof HTMLAnchorElement) {\r\n $clickBeingConfirmed.innerText = confirmDialogButtonText;\r\n // make sure styles from the element being confirmed aren't carried over to the confirm dialog\r\n $clickBeingConfirmed.setAttribute(\"class\", \"\");\r\n dom.$confirmBtn?.replaceChildren($clickBeingConfirmed);\r\n // If we're confirming a form element click (a POST), then just submit the form when the confirm button is clicked\r\n } else if ($clickBeingConfirmed instanceof HTMLFormElement) {\r\n dom.$confirmBtn!.innerHTML = confirmDialogButtonText;\r\n dom.$confirmBtn?.addEventListener('click', () => {\r\n const formElement = $el as HTMLFormElement;\r\n if (action === \"link\") {\r\n // update the form action to point to the migration endpoint\r\n formElement.action = formElement.action.toLowerCase().replace('/signin/', '/migrate/');\r\n }\r\n formElement.submit()\r\n });\r\n }\r\n\r\n dom.$confirmDialog?.showModal();\r\n};\r\n\r\nexport default () => {\r\n if (dom.$confirmDialog === null) {\r\n return;\r\n }\r\n dom.$cancelBtn?.addEventListener('click', () => dom.$confirmDialog?.close());\r\n dom.$destructiveActions.forEach(($el: Element) => {\r\n if ($el instanceof HTMLElement) {\r\n instance($el);\r\n }\r\n });\r\n\r\n // If there is an account migration action present on page load, automatically activate the warning dialog associated with it\r\n if (dom.$accountMigrationAction) {\r\n (dom.$accountMigrationAction as HTMLElement).click();\r\n }\r\n};\r\n","export const getOrdinal = (value: number): string => {\r\n const s = [\"th\", \"st\", \"nd\", \"rd\"];\r\n const v = value % 100;\r\n return value + (s[(v - 20) % 10] || s[v] || s[0]);\r\n};\r\n\r\nexport const leadingZero = (\r\n unit: number,\r\n ignoreZero: boolean = false\r\n): string => {\r\n if (ignoreZero && unit === 0) {\r\n return \"0\";\r\n }\r\n\r\n return unit < 10 ? `0${unit}` : unit.toString();\r\n};\r\n","import { getOrdinal, leadingZero } from \"./numberUtils\";\r\n\r\nconst days = [\r\n \"Sunday\",\r\n \"Monday\",\r\n \"Tuesday\",\r\n \"Wednesday\",\r\n \"Thursday\",\r\n \"Friday\",\r\n \"Saturday\",\r\n];\r\n\r\nconst months = [\r\n \"January\",\r\n \"February\",\r\n \"March\",\r\n \"April\",\r\n \"May\",\r\n \"June\",\r\n \"July\",\r\n \"August\",\r\n \"September\",\r\n \"October\",\r\n \"November\",\r\n \"December\",\r\n];\r\n\r\nconst timeZoneAbbreviated = (date: Date) => {\r\n const dateMatches = date.toString().match(/\\((.+)\\)/);\r\n\r\n if (!dateMatches) {\r\n return;\r\n }\r\n\r\n const tz = dateMatches[1] || \"\";\r\n\r\n // In Chrome, new Date().toString() is\r\n // \"Thu Aug 06 2020 16:21:38 GMT+0530 (India Standard Time)\"\r\n\r\n // In Safari, new Date().toString() is\r\n // \"Thu Aug 06 2020 16:24:03 GMT+0530 (IST)\"\r\n\r\n if (tz.includes(\" \")) {\r\n return tz\r\n .split(\" \")\r\n .map(([first]) => first)\r\n .join(\"\");\r\n } else {\r\n return tz;\r\n }\r\n};\r\n\r\nexport const displayDate = (\r\n date: Date,\r\n ignoreTime: boolean = false\r\n): string => {\r\n return `${days[date.getDay()]} ${getOrdinal(date.getDate())} ${\r\n months[date.getMonth()]\r\n }${\r\n ignoreTime\r\n ? \"\"\r\n : ` at ${leadingZero(date.getHours())}:${leadingZero(\r\n date.getMinutes()\r\n )} (${timeZoneAbbreviated(date)})`\r\n }`;\r\n};\r\n\r\nexport const displayShortDate = (\r\n date: Date,\r\n): string => {\r\n return `${date.getDate()} ${\r\n months[date.getMonth()]} ${date.getFullYear()}`;\r\n};\r\n\r\nexport const getTimeUntil = (difference: number) => {\r\n const seconds = difference / 1000;\r\n\r\n if (difference < 0) {\r\n return {\r\n hours: 0,\r\n minutes: 0,\r\n seconds: 0,\r\n milliseconds: 0,\r\n };\r\n }\r\n\r\n return {\r\n hours: Math.floor((seconds / 60 / 60) % 24),\r\n minutes: Math.floor((seconds / 60) % 60),\r\n seconds: Math.floor(seconds % 60),\r\n milliseconds: Math.round((seconds - Math.floor(seconds)) * 1000),\r\n };\r\n};\r\n","/**\r\n * Manage state of drops collection.\r\n */\r\n\r\nimport { displayDate, getTimeUntil } from \"../../utils/dateUtils\";\r\nimport { leadingZero } from \"../../utils/numberUtils\";\r\n\r\nconst SELECTORS = {\r\n countdown: \".js-drops-countdown\",\r\n drop: \".js-drop\",\r\n dropStatus: \".js-drop-status\",\r\n root: \".js-drops\",\r\n status: \".js-drops-status\",\r\n};\r\n\r\nconst COPY = {\r\n active: \"Available on all No Man’s Sky drops enabled streams\",\r\n inactive: \"The following items were available on\",\r\n};\r\n\r\nconst CSS = {\r\n archived: \"drop--archived\",\r\n};\r\n\r\nconst activeContent = (emphasis: string) => {\r\n return `${COPY.active} until ${emphasis}`;\r\n};\r\n\r\nconst inactiveContent = (content: string) => {\r\n return `${COPY.inactive} ${content} and are no longer available`;\r\n};\r\n\r\nconst pendingContent = (emphasis: string) => {\r\n return `${COPY.active} on ${emphasis}`;\r\n};\r\n\r\nconst instance = ($el: HTMLElement) => {\r\n if (!$el.getAttribute(\"data-end\") || !$el.getAttribute(\"data-start\")) {\r\n return;\r\n }\r\n\r\n const options = {\r\n end: new Date(parseInt($el.getAttribute(\"data-end\") || \"\", 10)),\r\n start: new Date(parseInt($el.getAttribute(\"data-start\") || \"\", 10)),\r\n };\r\n\r\n const dom = {\r\n $countdown: document.querySelector(SELECTORS.countdown),\r\n $drops: $el.querySelectorAll(SELECTORS.drop),\r\n $dropStatus: $el.querySelectorAll(SELECTORS.dropStatus),\r\n $status: $el.querySelector(SELECTORS.status),\r\n };\r\n\r\n let timerInterval: number = 0;\r\n\r\n if (!dom.$status) {\r\n return;\r\n }\r\n\r\n const updateState = () => {\r\n const now = new Date().getTime();\r\n const isActive =\r\n options.start.getTime() < now && options.end.getTime() > now;\r\n const hasEnded = now > options.end.getTime();\r\n\r\n // update individual drop status\r\n if (dom.$dropStatus) {\r\n dom.$dropStatus.forEach(($dropStatus) => {\r\n if ($dropStatus.innerHTML !== (isActive ? \"Online now\" : \"\")) {\r\n $dropStatus.innerHTML = isActive ? \"Online now\" : \"\";\r\n }\r\n });\r\n }\r\n\r\n if (!dom.$status) {\r\n return;\r\n }\r\n\r\n if (!isActive) {\r\n dom.$status.innerHTML = hasEnded\r\n ? inactiveContent(displayDate(options.start, true))\r\n : pendingContent(displayDate(options.start));\r\n\r\n if (hasEnded && dom.$drops) {\r\n dom.$drops.forEach(($drop) => {\r\n $drop.classList.add(CSS.archived);\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n dom.$status.innerHTML = activeContent(displayDate(options.end));\r\n timerInterval = window.setInterval(updateTimer, 10);\r\n };\r\n\r\n const updateTimer = () => {\r\n const now = new Date().getTime();\r\n const endTime = options.end.getTime();\r\n const until = getTimeUntil(endTime - now);\r\n\r\n if (dom.$countdown) {\r\n dom.$countdown.innerHTML = `${leadingZero(until.hours)}:${leadingZero(\r\n until.minutes\r\n )}:${leadingZero(until.seconds)}.${leadingZero(until.milliseconds).substr(\r\n 0,\r\n 2\r\n )}`;\r\n }\r\n\r\n if (now > endTime) {\r\n window.location.reload();\r\n clearInterval(timerInterval);\r\n }\r\n };\r\n\r\n updateState();\r\n};\r\n\r\nexport default () => {\r\n document.querySelectorAll(SELECTORS.root).forEach(($el: Element) => {\r\n instance($el as HTMLElement);\r\n });\r\n};\r\n","import { IEntitlement } from \"../dto/entitlement\";\r\n\r\nexport default function (): Promise {\r\n return fetch(`/twitch/entitlements${window.location.search}`)\r\n .then((response) => response.json())\r\n .catch(() => []);\r\n}\r\n","/**\r\n * Manages displaying which drops the user is entitled to.\r\n */\r\n\r\nimport { displayShortDate } from \"../../utils/dateUtils\";\r\nimport { IEntitlement } from \"./dto/entitlement\";\r\nimport fetchEntitlements from \"./service/fetchEntitlements\";\r\n\r\nconst CSS = {\r\n dropUnlocked: \"drop__unlocked\",\r\n tableCell: \"table__cell\",\r\n tableCellDate: \"table__cell--date\",\r\n tableRow: \"table__row\",\r\n};\r\n\r\nconst SELECTORS = {\r\n drop: \".js-drop\",\r\n dropRequirement: \".js-drop-requirement\",\r\n dropStatus: \".js-drop-status\",\r\n entitlementsTable: \".js-entitlements-table\",\r\n root: \".js-entitlements\",\r\n};\r\n\r\nconst TEXT = {\r\n unlocked: \"Success! Item unlocked\",\r\n empty: `

No items unlocked

Nothing here yet! Watch No Man's Sky streams on Twitch when drops are enabled in order to earn rewards.

No Man's Sky on Twitch`,\r\n};\r\n\r\nconst instance = ($el: HTMLElement) => {\r\n if ($el.getAttribute(\"data-entitlements\") !== \"true\") {\r\n return;\r\n }\r\n\r\n const updateDom = (entitlements: IEntitlement[]) => {\r\n updateDrops(entitlements);\r\n updateEntitlements(entitlements);\r\n };\r\n\r\n const updateDrops = (entitlements: IEntitlement[]) => {\r\n entitlements.map((entitlement: IEntitlement) => {\r\n const $drop = document.querySelector(\r\n `${SELECTORS.drop}[data-ids*=\"${entitlement.benefitId}\"]`\r\n );\r\n\r\n if (!$drop || $drop.querySelector(\".js-drop-unlocked\")) {\r\n return;\r\n }\r\n\r\n $drop.querySelector(SELECTORS.dropRequirement)?.remove();\r\n $drop.querySelector(SELECTORS.dropStatus)?.remove();\r\n\r\n const $unlockStatus = document.createElement(\"div\");\r\n $unlockStatus.innerHTML = `
Check
${TEXT.unlocked}
`;\r\n $unlockStatus.classList.add(CSS.dropUnlocked);\r\n $drop.appendChild($unlockStatus);\r\n });\r\n };\r\n\r\n const updateEntitlements = (entitlements: IEntitlement[]) => {\r\n const $entitlementsTable = document.querySelector(\r\n SELECTORS.entitlementsTable\r\n );\r\n\r\n if (!$entitlementsTable) {\r\n return;\r\n }\r\n\r\n if (!entitlements.length) {\r\n $entitlementsTable.outerHTML = TEXT.empty;\r\n return;\r\n }\r\n\r\n entitlements.map((entitlement: IEntitlement) => {\r\n const $row = document.createElement(\"li\");\r\n $row.classList.add(CSS.tableRow);\r\n\r\n const $cellName = document.createElement(\"div\");\r\n $cellName.classList.add(CSS.tableCell);\r\n $cellName.innerHTML = entitlement.name;\r\n $row.appendChild($cellName);\r\n\r\n const $cellTimestamp = document.createElement(\"div\");\r\n $cellTimestamp.classList.add(CSS.tableCell);\r\n $cellTimestamp.classList.add(CSS.tableCellDate);\r\n $cellTimestamp.innerHTML = displayShortDate(\r\n new Date(entitlement.timestamp)\r\n );\r\n $row.appendChild($cellTimestamp);\r\n\r\n $entitlementsTable.appendChild($row);\r\n });\r\n };\r\n\r\n fetchEntitlements().then(updateDom);\r\n};\r\n\r\nexport default () => {\r\n document.querySelectorAll(SELECTORS.root).forEach(($el: Element) => {\r\n instance($el as HTMLElement);\r\n });\r\n};\r\n","/**\r\n * Applies special classes to relevant items when they're scrolled into view.\r\n * This can be used to apply animation or other CSS behaviour\r\n * that should occur when an element becomes visible\r\n */\r\nconst inViewport = () => {\r\n const CLASS = 'in-viewport';\r\n const SELECTOR = '.js-in-viewport';\r\n const attributes = {\r\n REPEAT: 'data-repeat',\r\n };\r\n\r\n if (typeof IntersectionObserver === 'undefined') {\r\n document.querySelectorAll(SELECTOR).forEach(($el: Element) => {\r\n $el.classList.add(CLASS);\r\n });\r\n\r\n return;\r\n }\r\n\r\n const checkEntry = (entry: IntersectionObserverEntry) => {\r\n const $entry = entry.target as HTMLHtmlElement;\r\n\r\n if (entry.isIntersecting) {\r\n $entry.classList.add(CLASS);\r\n\r\n if (!isRepeat($entry)) {\r\n observer.unobserve($entry);\r\n }\r\n\r\n return;\r\n }\r\n\r\n $entry.classList.remove(CLASS);\r\n };\r\n\r\n const callback = (entries: IntersectionObserverEntry[]) => {\r\n entries.forEach(checkEntry);\r\n };\r\n\r\n const isRepeat = ($el: HTMLHtmlElement) => {\r\n return $el.getAttribute(attributes.REPEAT) === 'true';\r\n };\r\n\r\n const observer = new IntersectionObserver(callback, {\r\n rootMargin: '0px',\r\n threshold: 0,\r\n });\r\n\r\n document.querySelectorAll(SELECTOR).forEach(($el: Element) => {\r\n observer.observe($el as HTMLElement);\r\n });\r\n};\r\n\r\nexport default inViewport;\r\n","/**\r\n * Shows a modal that displays item history\r\n * Based on: https://github.com/scottaohara/accessible_itemHistoryModal_window\r\n */\r\n\r\nconst SELECTORS = {\r\n show: \".js-show-item-history\",\r\n close: \".js-close-item-history\",\r\n modal: \".js-item-history\",\r\n content: \".js-item-history-content\",\r\n};\r\n\r\nconst bodyClass = \"modal-open\";\r\n\r\nconst itemHistoryModal = () => {\r\n const $itemHistoryModal = document.querySelector(\r\n SELECTORS.modal\r\n ) as HTMLElement;\r\n\r\n if ($itemHistoryModal === null) {\r\n return;\r\n }\r\n\r\n const $itemHistoryModalContent = $itemHistoryModal.querySelector(\r\n SELECTORS.content\r\n ) as HTMLElement;\r\n\r\n if ($itemHistoryModalContent === null) {\r\n return;\r\n }\r\n\r\n const allNodes = document.querySelectorAll(\"*\");\r\n\r\n let modalOpen = false;\r\n let lastFocus: HTMLElement;\r\n let i: number;\r\n\r\n const modalShow = () => {\r\n lastFocus = document.activeElement as HTMLElement;\r\n $itemHistoryModal.setAttribute(\"aria-hidden\", \"false\");\r\n modalOpen = true;\r\n $itemHistoryModalContent.setAttribute(\"tabindex\", \"0\");\r\n $itemHistoryModalContent.focus();\r\n document.body.classList.add(bodyClass);\r\n };\r\n\r\n const modalClose = () => {\r\n if (modalOpen) {\r\n $itemHistoryModal.setAttribute(\"aria-hidden\", \"true\");\r\n\r\n if ($itemHistoryModalContent !== null) {\r\n $itemHistoryModalContent.setAttribute(\"tabindex\", \"-1\");\r\n }\r\n\r\n modalOpen = false;\r\n document.body.classList.remove(bodyClass);\r\n lastFocus.focus();\r\n }\r\n };\r\n\r\n // Restrict focus to the itemHistoryModal window when it's open.\r\n // Tabbing will just loop through the whole itemHistoryModal.\r\n // Shift + Tab will allow backup to the top of the itemHistoryModal,\r\n // and then stop.\r\n const focusRestrict = (event: FocusEvent) => {\r\n if (\r\n modalOpen &&\r\n $itemHistoryModalContent !== null &&\r\n !$itemHistoryModalContent.contains(event.target as HTMLElement)\r\n ) {\r\n event.stopPropagation();\r\n $itemHistoryModalContent.focus();\r\n }\r\n };\r\n\r\n // Restrict tab focus on elements only inside itemHistoryModal window\r\n for (i = 0; i < allNodes.length; i++) {\r\n const item = allNodes.item(i) as HTMLElement;\r\n item.addEventListener(\"focus\", focusRestrict);\r\n }\r\n\r\n document.querySelectorAll(SELECTORS.show).forEach(($el: Element) => {\r\n $el.addEventListener(\"click\", modalShow);\r\n });\r\n\r\n $itemHistoryModal\r\n .querySelectorAll(SELECTORS.close)\r\n .forEach(($el: Element) => {\r\n $el.addEventListener(\"click\", modalClose);\r\n });\r\n};\r\n\r\nexport default itemHistoryModal;\r\n","/**\r\n * Lazy loads background imagery (specified through data attribute)\r\n */\r\n\r\n/*\r\n * 1. How far below (or above) the viewport that assets will be loaded in.\r\n * It's better for 'performance feel' if things load when they're close rather than only starting when they become visible\r\n */\r\n\r\nconst WITHIN_DISTANCE = \"200px\"; /* 1 */\r\n\r\nconst lazyLoadBackground = () => {\r\n const CLASS = \"background-loaded\";\r\n const SELECTOR = \".js-lazy-load-background\";\r\n\r\n if (typeof IntersectionObserver === \"undefined\") {\r\n document.querySelectorAll(SELECTOR).forEach(($el: Element) => {\r\n const $htmlElement = $el as HTMLElement;\r\n const background = $htmlElement.dataset.background as string;\r\n $htmlElement.style.backgroundImage = `url('${background}')`;\r\n $htmlElement.classList.add(CLASS);\r\n });\r\n\r\n return;\r\n }\r\n\r\n const checkEntry = (entry: IntersectionObserverEntry) => {\r\n const $entry = entry.target as HTMLHtmlElement;\r\n\r\n if (entry.isIntersecting) {\r\n const background = $entry.dataset.background as string;\r\n $entry.style.backgroundImage = `url('${background}')`;\r\n $entry.classList.add(CLASS);\r\n\r\n return;\r\n }\r\n\r\n $entry.classList.remove(CLASS);\r\n };\r\n\r\n const callback = (entries: IntersectionObserverEntry[]) => {\r\n entries.forEach(checkEntry);\r\n };\r\n\r\n const observer = new IntersectionObserver(callback, {\r\n rootMargin: `${WITHIN_DISTANCE} 0px`,\r\n threshold: 0,\r\n });\r\n\r\n document.querySelectorAll(SELECTOR).forEach(($el: Element) => {\r\n observer.observe($el as HTMLElement);\r\n });\r\n};\r\n\r\nexport default lazyLoadBackground;\r\n","/**\r\n * Displays content that has initially been hidden to the user.\r\n */\r\n\r\nimport { trackEvent } from \"../../utils/trackingUtils\";\r\n\r\nconst CSS = {\r\n hiddenJs: \"hidden-js\",\r\n hiddenVisually: \"visually-hidden\",\r\n};\r\n\r\nconst SELECTORS = {\r\n content: \".js-reveal-content\",\r\n root: \".js-reveal\",\r\n trigger: \".js-reveal-trigger-btn\",\r\n};\r\n\r\nconst instance = ($el: HTMLElement) => {\r\n const $triggerBtn = $el.querySelector(SELECTORS.trigger);\r\n const $content = $el.querySelector(SELECTORS.content);\r\n\r\n if (!$triggerBtn || !$content) {\r\n return;\r\n }\r\n\r\n const show = () => {\r\n $content.classList.remove(CSS.hiddenJs);\r\n\r\n $triggerBtn.classList.add(CSS.hiddenVisually);\r\n $triggerBtn.setAttribute(\"aria-expanded\", \"true\");\r\n\r\n trackEvent(\r\n $el.getAttribute(\"data-category\") || \"\",\r\n $el.getAttribute(\"data-action\") || \"\",\r\n null\r\n );\r\n };\r\n\r\n $triggerBtn.addEventListener(\"click\", show);\r\n};\r\n\r\nexport default () => {\r\n document.querySelectorAll(SELECTORS.root).forEach(($el: Element) => {\r\n instance($el as HTMLElement);\r\n });\r\n};\r\n","export const KEY_UP = 38;\r\nexport const KEY_DOWN = 40;\r\nexport const SPACE = 32;\r\n","import { KEY_DOWN, KEY_UP, SPACE } from '../../utils/keyCode';\r\n\r\n/**\r\n * Initialises the toggle nav button that's responsible for showing/hiding\r\n * the main menu (likely on smaller devices).\r\n */\r\nconst toggleGroupNav = () => {\r\n const CSS_VISIBLE = 'is-group-nav-visible';\r\n const SELECTOR = '.js-group-nav-button';\r\n\r\n const validHideKeyCodes = [KEY_UP];\r\n const validShowKeyCodes = [KEY_DOWN, SPACE];\r\n\r\n const $html = document.querySelector('html') as HTMLHtmlElement;\r\n\r\n const checkKeyboardShortcutForToggle = (e: KeyboardEvent) => {\r\n if (validShowKeyCodes.indexOf(e.keyCode) >= 0) {\r\n show();\r\n return;\r\n }\r\n\r\n if (validHideKeyCodes.indexOf(e.keyCode) >= 0) {\r\n hide();\r\n return;\r\n }\r\n };\r\n\r\n const hide = ($el: Element | null = null) => {\r\n $html.classList.remove(CSS_VISIBLE);\r\n\r\n if ($el) {\r\n $el.setAttribute('aria-expanded', 'false');\r\n }\r\n };\r\n\r\n const show = ($el: Element | null | undefined = null) => {\r\n $html.classList.add(CSS_VISIBLE);\r\n\r\n if ($el) {\r\n $el.setAttribute('aria-expanded', 'true');\r\n }\r\n };\r\n\r\n const toggleVisibility = (e: MouseEvent) => {\r\n if (e) {\r\n e.stopImmediatePropagation();\r\n e.preventDefault();\r\n }\r\n\r\n const $target = (e.currentTarget as Element) || null;\r\n\r\n if ($html.classList.contains(CSS_VISIBLE)) {\r\n hide($target);\r\n return;\r\n }\r\n\r\n show($target);\r\n };\r\n\r\n document.querySelectorAll(SELECTOR).forEach(($el: Element) => {\r\n const $htmlElement = $el as HTMLElement;\r\n\r\n $htmlElement.addEventListener('click', toggleVisibility);\r\n $htmlElement.addEventListener(\r\n 'keydown',\r\n checkKeyboardShortcutForToggle\r\n );\r\n });\r\n};\r\n\r\nexport default toggleGroupNav;\r\n","import { KEY_DOWN, KEY_UP, SPACE } from '../../utils/keyCode';\r\n\r\n/**\r\n * Initialises the toggle nav button that's responsible for showing/hiding\r\n * the main menu (likely on smaller devices).\r\n */\r\nconst toggleNav = () => {\r\n const CSS_VISIBLE = 'is-nav-visible';\r\n const SELECTOR = '.js-nav-button';\r\n\r\n const validHideKeyCodes = [KEY_UP];\r\n const validShowKeyCodes = [KEY_DOWN, SPACE];\r\n\r\n const $html = document.querySelector('html') as HTMLHtmlElement;\r\n\r\n const checkKeyboardShortcutForToggle = (e: KeyboardEvent) => {\r\n if (validShowKeyCodes.indexOf(e.keyCode) >= 0) {\r\n show();\r\n return;\r\n }\r\n\r\n if (validHideKeyCodes.indexOf(e.keyCode) >= 0) {\r\n hide();\r\n return;\r\n }\r\n };\r\n\r\n const hide = ($el: Element | null = null) => {\r\n $html.classList.remove(CSS_VISIBLE);\r\n\r\n if ($el) {\r\n $el.setAttribute('aria-expanded', 'false');\r\n }\r\n };\r\n\r\n const show = ($el: Element | null | undefined = null) => {\r\n $html.classList.add(CSS_VISIBLE);\r\n\r\n if ($el) {\r\n $el.setAttribute('aria-expanded', 'true');\r\n }\r\n };\r\n\r\n const toggleVisibility = (e: MouseEvent) => {\r\n if (e) {\r\n e.stopImmediatePropagation();\r\n e.preventDefault();\r\n }\r\n\r\n const $target = (e.currentTarget as Element) || null;\r\n\r\n if ($html.classList.contains(CSS_VISIBLE)) {\r\n hide($target);\r\n return;\r\n }\r\n\r\n show($target);\r\n };\r\n\r\n document.querySelectorAll(SELECTOR).forEach(($el: Element) => {\r\n const $htmlElement = $el as HTMLElement;\r\n\r\n $htmlElement.addEventListener('click', toggleVisibility);\r\n $htmlElement.addEventListener(\r\n 'keydown',\r\n checkKeyboardShortcutForToggle\r\n );\r\n });\r\n};\r\n\r\nexport default toggleNav;\r\n","/**\r\n * Displays content that has initially been hidden to the user.\r\n */\r\n\r\nimport { trackEvent } from \"../../utils/trackingUtils\";\r\n\r\nconst SELECTORS = {\r\n root: \".js-track-click\",\r\n};\r\n\r\nconst instance = ($el: HTMLElement) => {\r\n const content = {\r\n action: $el.getAttribute(\"data-action\") || \"\",\r\n category: $el.getAttribute(\"data-category\") || \"\",\r\n label: $el.getAttribute(\"data-label\") || \"\",\r\n };\r\n\r\n const track = () => {\r\n trackEvent(content.category, content.action, content.label);\r\n };\r\n\r\n $el.addEventListener(\"click\", track);\r\n};\r\n\r\nexport default () => {\r\n document.querySelectorAll(SELECTORS.root).forEach(($el: Element) => {\r\n instance($el as HTMLElement);\r\n });\r\n};\r\n","/**\r\n * Automatically size account items to the width of the largest item.\r\n */\r\n\r\nconst SELECTORS = {\r\n root: \".btn-group--horizontal\",\r\n item: \".account-group, .btn-group__form\"\r\n};\r\n\r\nconst instance = ($el: HTMLElement) => {\r\n const items = $el.querySelectorAll(SELECTORS.item);\r\n let maxWidth = 0;\r\n\r\n items.forEach(($item: Element) => {\r\n const $htmlElement = $item as HTMLElement;\r\n const itemWidth = $htmlElement.offsetWidth;\r\n if (itemWidth > maxWidth) {\r\n maxWidth = itemWidth;\r\n }\r\n });\r\n\r\n items.forEach(($item: Element) => {\r\n const $htmlElement = $item as HTMLElement;\r\n $htmlElement.style.width = `${maxWidth}px`;\r\n });\r\n};\r\n\r\nexport default () => {\r\n document.querySelectorAll(SELECTORS.root).forEach(($el: Element) => {\r\n instance($el as HTMLElement);\r\n });\r\n};\r\n","import accordion from './components/accordion';\r\nimport crossSaveToggle from './components/crossSaveToggle';\r\nimport confirmDialog from './components/confirmDialog';\r\nimport drops from './components/drops';\r\nimport entitlements from './components/entitlements';\r\nimport inViewport from './components/inViewport';\r\nimport itemHistoryModal from './components/itemHistoryModal';\r\nimport lazyLoadBackground from './components/lazyLoadBackground';\r\nimport reveal from './components/reveal';\r\nimport toggleGroupNav from './components/toggleGroupNav';\r\nimport toggleNav from './components/toggleNav';\r\nimport trackClick from './components/trackClick';\r\nimport autosizeAccounts from './components/autosizeAccounts';\r\n\r\ndeclare global {\r\n interface Window {\r\n dataLayer: any[];\r\n gtag: (...args: any[]) => void;\r\n }\r\n}\r\n\r\n/**\r\n * Called once the page is loaded and handles initialising\r\n * the different components.\r\n */\r\nconst init = () => {\r\n accordion();\r\n confirmDialog();\r\n crossSaveToggle();\r\n drops();\r\n entitlements();\r\n inViewport();\r\n itemHistoryModal();\r\n lazyLoadBackground();\r\n reveal();\r\n toggleGroupNav();\r\n toggleNav();\r\n trackClick();\r\n autosizeAccounts();\r\n};\r\n\r\nconst canInit = () => {\r\n const regReady = (window as any).attachEvent ? /d$|^c/ : /d$|^c|^i/;\r\n return regReady.test(document.readyState || '');\r\n};\r\n\r\nlet timer: number;\r\n\r\nconst checkCanInit = () => {\r\n if (canInit()) {\r\n if (timer) {\r\n clearTimeout(timer);\r\n }\r\n\r\n init();\r\n return;\r\n }\r\n\r\n timer = setTimeout(checkCanInit, 100);\r\n};\r\n\r\n// update DOM to indicate JavaScript is available\r\n// https://www.paulirish.com/2009/avoiding-the-fouc-v3/\r\ndocument.documentElement.className = document.documentElement.className.replace(\r\n /\\bno-js\\b/,\r\n 'js'\r\n);\r\n\r\ncheckCanInit();\r\n"],"names":["trackEvent","category","action","label","ACCORDION_CLASS","ACCORDION_SELECTOR","ACCORDION_TOGGLE_SELECTOR","CSS_TOGGLED","accordion","hide","$el","show","ignoreTracking","toggleVisibility","e","$clicked","target","$target","$htmlElement","locationHashChanged","$hash","CONFIG","CSS","SELECTORS","instance","options","dom","state","handleInputChange","hideError","sendToggleRequest","_a","_b","formData","response","showError","message","crossSaveToggle","handleButtonClick","_c","_d","categoryToPlatform","$clickBeingConfirmed","platform","username","isDestructiveMigration","confirmDialogTitle","confirmDialogContent","confirmDialogButtonText","formElement","confirmDialog","getOrdinal","value","s","v","leadingZero","unit","ignoreZero","days","months","timeZoneAbbreviated","date","dateMatches","tz","first","displayDate","ignoreTime","displayShortDate","getTimeUntil","difference","seconds","COPY","activeContent","emphasis","inactiveContent","content","pendingContent","timerInterval","updateState","now","isActive","hasEnded","$dropStatus","$drop","updateTimer","endTime","until","drops","fetchEntitlements","TEXT","updateDom","entitlements","updateDrops","updateEntitlements","entitlement","$unlockStatus","$entitlementsTable","$row","$cellName","$cellTimestamp","inViewport","CLASS","SELECTOR","attributes","checkEntry","entry","$entry","isRepeat","observer","callback","entries","bodyClass","itemHistoryModal","$itemHistoryModal","$itemHistoryModalContent","allNodes","modalOpen","lastFocus","i","modalShow","modalClose","focusRestrict","event","WITHIN_DISTANCE","lazyLoadBackground","background","$triggerBtn","$content","reveal","KEY_UP","KEY_DOWN","SPACE","toggleGroupNav","CSS_VISIBLE","validHideKeyCodes","validShowKeyCodes","$html","checkKeyboardShortcutForToggle","toggleNav","track","trackClick","items","maxWidth","$item","itemWidth","autosizeAccounts","init","canInit","timer","checkCanInit"],"mappings":"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"}