{"version":3,"file":"index.js","mappings":"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","sources":["webpack://oriflameusersessionprovider/./src/LogoutExecutor.ts","webpack://oriflameusersessionprovider/./node_modules/@ori-events/request-shopping-context/esm/index.js","webpack://oriflameusersessionprovider/./node_modules/@ori-events/shopping-context-loaded/esm/index.js","webpack://oriflameusersessionprovider/./node_modules/@ori-events/user-logout-confirmation/esm/index.js","webpack://oriflameusersessionprovider/./node_modules/@ori-events/user-logout-confirmed/esm/index.js","webpack://oriflameusersessionprovider/./node_modules/@ori-events/user-logout-execute/esm/index.js","webpack://oriflameusersessionprovider/./node_modules/@ori-events/user-logout-request/esm/index.js","webpack://oriflameusersessionprovider/./src/LogoutProvider.ts","webpack://oriflameusersessionprovider/./src/index.ts"],"sourcesContent":["import type { SomeLogger } from '../types/global';\n\nexport default class LogoutExecutor {\n readonly LOGOUT_DATA_SELECTOR = '.js-logout-data';\n\n readonly URL_ESHOP_ATTR = 'data-url-eshoplogout';\n\n readonly URL_LOGOUT = '/system/UI/LogoutPopup/Logout';\n\n readonly AUTH_TOKEN_STORAGE_KEY = 'AuthToken';\n\n readonly ININCHAT_ID_STORAGE_KEY = 'ininChatId';\n\n logger: SomeLogger;\n\n private readonly storage: Storage;\n\n constructor(logger: SomeLogger = console) {\n this.logger = logger;\n this.storage = window.sessionStorage;\n }\n\n doLogout(): void {\n this.clearSessionStorage();\n this.logoutInInChat();\n this.logoutFromEshop();\n }\n\n private clearSessionStorage(): void {\n const { ori } = window;\n if (!ori) {\n this.logger.warn(`[LogoutExecutor.clearSessionStorage] ori namespace not found on window!`);\n\n return;\n }\n\n if (ori.webApi) {\n const keys = ori.webApi.getStorageKeys();\n keys.forEach((item) => {\n sessionStorage.removeItem(item);\n });\n }\n\n if (ori.globalApi) {\n // clear globalAPI module\n ori.globalApi.clearStorageItems();\n }\n\n if (ori.personalMenu) {\n ori.personalMenu.clearStorageItems();\n }\n\n if (ori.allReportsPage) {\n ori.allReportsPage.clearStorageItems();\n }\n\n if (this.storage.getItem(this.AUTH_TOKEN_STORAGE_KEY)) {\n this.storage.removeItem(this.AUTH_TOKEN_STORAGE_KEY);\n }\n }\n\n private logoutInInChat(): void {\n const { ori } = window;\n if (!ori) {\n this.logger.warn(`[LogoutExecutor.logoutInInChat] ori namespace not found on window!`);\n\n return;\n }\n\n const ininChatStorage = this.storage.getItem(this.ININCHAT_ID_STORAGE_KEY);\n if (ori.ininChat && ininChatStorage) {\n this.logger.debug(`[LogoutExecutor.logoutInInChat] Closing InInChat...`);\n ori.ininChat.handleClose();\n }\n }\n\n private logoutFromEshop(): void {\n const logoutDataElement = document.querySelector(this.LOGOUT_DATA_SELECTOR);\n if (!logoutDataElement) {\n const errorMessage = `[LogoutExecutor.logoutFromEshop] Element ${this.LOGOUT_DATA_SELECTOR} was not found.`;\n this.logger.error(errorMessage);\n throw new Error(errorMessage);\n }\n\n const urlEshopLogout = logoutDataElement.getAttribute(this.URL_ESHOP_ATTR) ?? '';\n this.logger.debug(\n `[LogoutExecutor.logoutFromEshop] Logging out from eshop using: ${urlEshopLogout}`,\n );\n\n fetch(urlEshopLogout, { mode: 'no-cors', credentials: 'include' })\n .then(() => {\n this.logger.info(\n `[LogoutExecutor.logoutFromEshop] Logged out, redirecting to: ${this.URL_LOGOUT}`,\n );\n // eslint-disable-next-line no-restricted-globals -- The user needs to be redirected to the logout url\n location.href = this.URL_LOGOUT;\n })\n .catch((error: unknown) => {\n this.logger.error('[LogoutExecutor.logoutFromEshop] Error while logging out from eshop. ', {\n url: urlEshopLogout,\n error,\n });\n });\n }\n}\n","export var Name = 'request-shopping-context';\nexport var RequestShoppingContextEvent = Name;","export var Name = 'shopping-context-loaded';\nexport var ShoppingContextLoadedEvent = Name;","export var Name = 'user-logout-confirmation';\nexport var UserLogoutConfirmationEvent = Name;","export var Name = 'user-logout-confirmed';\nexport var UserLogoutConfirmedEvent = Name;","export var Name = 'user-logout-execute';\nexport var UserLogoutExecuteEvent = Name;","export var Name = 'user-logout-request';\nexport var UserLogoutRequestEvent = Name;","import type * as BasketUpdated from '@ori-events/basket-updated';\nimport { Name as RequestShoppingContextEvent } from '@ori-events/request-shopping-context';\nimport { Name as ShoppingContextLoadedEvent } from '@ori-events/shopping-context-loaded';\nimport { Name as UserLogoutConfirmationEvent } from '@ori-events/user-logout-confirmation';\nimport { Name as UserLogoutConfirmedEvent } from '@ori-events/user-logout-confirmed';\nimport { Name as UserLogoutExecuteEvent } from '@ori-events/user-logout-execute';\nimport { Name as UserLogoutRequestEvent } from '@ori-events/user-logout-request';\n\nimport type { SomeLogger } from '../types/global';\n\ntype Context = Element | Window | typeof globalThis;\n\nexport default class LogoutProvider {\n readonly MAX_SHOPPING_CONTEXT_AWAIT_TIME_SECONDS = 10;\n\n /**\n * Element on which we listen for our events and also dispatch others' events.\n */\n readonly context: Context;\n\n /**\n * Logger (defaults to console) implementing basic console logging methods.\n */\n logger: SomeLogger;\n\n /**\n * Function called after all conditions are satisfied that does the logout (on BE and in sessionStorage).\n */\n private readonly logoutCallback: () => void;\n\n /**\n * Marks the phase between LogoutRequest and ShoppingBag's response to our ShoppingContext status request.\n * If the ShoppingBag fail to respond in MAX_SHOPPING_CONTEXT_AWAIT_TIME_SECONDS\n * we will no longer wait and logout user right away.\n */\n private isLogoutRequestSequenceInProgress = false;\n\n /**\n * Set to true on logout request event and is reset back to false\n * after short time defined by local constant MAX_SHOPPING_CONTEXT_AWAIT_TIME_SECONDS.\n */\n private isAwaitingShoppingContextInProgress = false;\n\n private wasLogoutShoppingContextLoadedInTime: boolean | undefined;\n\n constructor(logoutCallback: () => void, context: Context, logger: SomeLogger = console) {\n this.context = context;\n this.logoutCallback = logoutCallback;\n this.logger = logger;\n\n this.bindEvents();\n\n this.logger.info(`[LogoutProvider] Set up on context: `, context);\n }\n\n private bindEvents() {\n this.context.addEventListener(UserLogoutRequestEvent, (e) => {\n this.onLogoutRequest(e);\n });\n\n this.context.addEventListener(ShoppingContextLoadedEvent, (e) => {\n this.onShoppingContextLoaded(e);\n });\n\n this.context.addEventListener(UserLogoutConfirmedEvent, (e) => {\n this.onLogoutConfirmed(e);\n });\n\n this.context.addEventListener(UserLogoutExecuteEvent, (e) => {\n this.onLogoutExecute(e);\n });\n\n this.logger.debug(`[LogoutProvider.bindEvents] Events bound.`, {\n context: this.context,\n events: [\n UserLogoutRequestEvent,\n ShoppingContextLoadedEvent,\n UserLogoutConfirmedEvent,\n UserLogoutExecuteEvent,\n ],\n });\n }\n\n private startLogoutRequestSequence() {\n if (this.isLogoutRequestSequenceInProgress) {\n return;\n }\n\n this.isLogoutRequestSequenceInProgress = true;\n this.wasLogoutShoppingContextLoadedInTime = undefined;\n\n // Limit validity of logout request to short period of time.\n this.isAwaitingShoppingContextInProgress = true;\n setTimeout(() => {\n if (typeof this.wasLogoutShoppingContextLoadedInTime === 'undefined') {\n this.wasLogoutShoppingContextLoadedInTime = false;\n this.endLogoutRequestSequence();\n\n // Skip to UserLogoutExecuteEvent directly and not wait for shopping bag status.\n this.context.dispatchEvent(new CustomEvent(UserLogoutExecuteEvent));\n }\n }, this.MAX_SHOPPING_CONTEXT_AWAIT_TIME_SECONDS * 1000);\n\n this.logger.info(\n `[LogoutProvider.startLogoutRequestSequence] Logout sequence started, listening for ${ShoppingContextLoadedEvent} event in next ${this.MAX_SHOPPING_CONTEXT_AWAIT_TIME_SECONDS} seconds.`,\n );\n }\n\n private endLogoutRequestSequence() {\n if (!this.isLogoutRequestSequenceInProgress) {\n return;\n }\n\n this.isLogoutRequestSequenceInProgress = false;\n if (this.isAwaitingShoppingContextInProgress) {\n this.isAwaitingShoppingContextInProgress = false;\n }\n\n if (this.wasLogoutShoppingContextLoadedInTime === false) {\n this.logger.error(\n `[LogoutProvider.endLogoutRequestSequence] Event ${ShoppingContextLoadedEvent} failed to be fired in time (${this.MAX_SHOPPING_CONTEXT_AWAIT_TIME_SECONDS} seconds).`,\n );\n }\n }\n\n private onLogoutRequest(event: Event) {\n this.logger.debug(`[LogoutProvider.onLogoutRequest] event:`, event);\n if (this.isLogoutRequestSequenceInProgress) {\n this.logger.info(\n `[LogoutProvider.onLogoutRequest] Ignoring another request - log out sequence has already been started.`,\n );\n\n return;\n }\n\n this.startLogoutRequestSequence();\n this.context.dispatchEvent(new CustomEvent(RequestShoppingContextEvent));\n }\n\n private onShoppingContextLoaded(event: Event) {\n if (!this.isLogoutRequestSequenceInProgress || !this.isAwaitingShoppingContextInProgress) {\n return;\n }\n\n this.logger.debug(`[LogoutProvider.onShoppingContextLoaded] event:`, event);\n\n // Ignore more ShoppingContextLoaded events.\n this.isAwaitingShoppingContextInProgress = false;\n this.wasLogoutShoppingContextLoadedInTime = true;\n this.endLogoutRequestSequence();\n\n const bagHasItems =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- could be null\n (event as CustomEvent).detail?.shoppingBag?.shoppingBagQuantity > 0;\n\n if (bagHasItems) {\n this.context.dispatchEvent(new CustomEvent(UserLogoutConfirmationEvent));\n } else {\n this.context.dispatchEvent(new CustomEvent(UserLogoutExecuteEvent));\n }\n }\n\n private onLogoutConfirmed(event: Event) {\n this.logger.debug(`[LogoutProvider.onLogoutConfirmed] event:`, event);\n this.context.dispatchEvent(new CustomEvent(UserLogoutExecuteEvent));\n }\n\n private onLogoutExecute(event: Event) {\n this.logger.debug(`[LogoutProvider.onLogoutExecute] event:`, event);\n\n // Actually do logout = call logout callback.\n this.logoutCallback();\n }\n}\n","import LogoutExecutor from './LogoutExecutor';\nimport LogoutProvider from './LogoutProvider';\n\nexport interface UserSessionProviderApi {\n logoutProvider: LogoutProvider;\n logoutExecutor: LogoutExecutor;\n logoutCallback: () => void;\n}\n\nconst logoutExecutor = new LogoutExecutor();\n\nconst logoutCallback = () => {\n logoutExecutor.doLogout();\n};\n\nconst api: UserSessionProviderApi = {\n logoutProvider: new LogoutProvider(logoutCallback, window),\n logoutExecutor,\n logoutCallback,\n};\n\n// Allow for debugging in Online context\nif (window.ori && !window.ori.userSessionProvider) {\n window.ori.userSessionProvider = api;\n}\n\nexport default api;\n"],"names":["LogoutExecutor","logger","console","LOGOUT_DATA_SELECTOR","URL_ESHOP_ATTR","URL_LOGOUT","AUTH_TOKEN_STORAGE_KEY","ININCHAT_ID_STORAGE_KEY","storage","this","window","sessionStorage","doLogout","clearSessionStorage","logoutInInChat","logoutFromEshop","ori","webApi","getStorageKeys","forEach","item","removeItem","globalApi","clearStorageItems","personalMenu","allReportsPage","getItem","warn","ininChatStorage","ininChat","debug","handleClose","logoutDataElement","document","querySelector","errorMessage","error","Error","urlEshopLogout","getAttribute","fetch","mode","credentials","then","info","location","href","catch","url","Name","LogoutProvider","logoutCallback","context","MAX_SHOPPING_CONTEXT_AWAIT_TIME_SECONDS","isLogoutRequestSequenceInProgress","isAwaitingShoppingContextInProgress","wasLogoutShoppingContextLoadedInTime","bindEvents","addEventListener","UserLogoutRequestEvent","e","onLogoutRequest","ShoppingContextLoadedEvent","onShoppingContextLoaded","UserLogoutConfirmedEvent","onLogoutConfirmed","UserLogoutExecuteEvent","onLogoutExecute","events","startLogoutRequestSequence","undefined","setTimeout","endLogoutRequestSequence","dispatchEvent","CustomEvent","event","RequestShoppingContextEvent","detail","shoppingBag","shoppingBagQuantity","UserLogoutConfirmationEvent","logoutExecutor","api","logoutProvider","userSessionProvider"],"sourceRoot":""}