{"version":3,"file":"Snackbar.js","names":["Snackbar","a","setters","Component","default","deepMerge","Event","on","off","execute","constructor","element","options","arguments","length","sustain","timeoutMs","preventStacking","initState","state","currentNotification","stack","timeoutId","bindEvents","_onNotify","bind","_onClose","onGlobalUpdate","window","clearTimeout","requestAnimationFrame","removeNotification","data","addNotification","_removeNotificationEvents","querySelector","clearAllNotifications","push","createNotification","content","notification","document","createElement","classList","add","innerHTML","type","appendChild","setTimeout","removeChild","shift","snackbarNotifications","forEach","l","i","destroy","removeListener"],"sources":["components/global/Snackbar.js"],"sourcesContent":["import Component from 'core/Component';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { Event } from 'services/EventEmitter';\nimport { on, off } from 'toolbox/event';\n\n/**\n * This is a description of the Snackbar constructor function.\n * @class\n * @classdesc This is a description of the Snackbar class. (must be edited)\n * @extends Component\n */\nexport default class Snackbar extends Component {\n /**\n * Constructor of the class that mainly merge the options of the components\n * @param {HTMLElement} element HTMLElement of the component\n * @param {Object} options options that belongs to the component\n */\n constructor(element, options = {}) {\n super(element, deepMerge({\n sustain: 700, // delay between two notifications\n timeoutMs: 5000, // default duration of notifications\n preventStacking: false, // by default snackbars can be stacked\n }, options));\n }\n\n /**\n * Init the different state of the component\n * It helps to avoid heavy DOM manipulation\n */\n initState() {\n this.state.currentNotification = null;\n this.state.stack = [];\n this.state.timeoutId = null;\n }\n\n /**\n * Should contain only event listeners and nothing else\n * All the event handlers should be into a separated function. No usage of anonyous function\n */\n bindEvents() {\n Event.on('snackbar.notify', this._onNotify.bind(this), this);\n Event.on('snackbar.close', this._onClose.bind(this), this);\n\n // Get notifications on global update\n Event.on('global.update', this.onGlobalUpdate.bind(this));\n }\n\n /**\n * Handler when closing a notification\n */\n _onClose() {\n if (this.state.timeoutId !== null) {\n window.clearTimeout(this.state.timeoutId);\n window.requestAnimationFrame(this.removeNotification.bind(this, false));\n }\n }\n\n /**\n * Handler of a new notification\n * @param {Object} data notification data retrieved from emit\n * @param {boolean} preventStacking clears notification stack and show current notification\n */\n _onNotify(data, preventStacking = false) {\n this.addNotification(data, preventStacking);\n }\n\n\n /**\n * Remove notification events\n */\n _removeNotificationEvents() {\n if (this.state.currentNotification !== null) {\n off('click', this.state.currentNotification.querySelector('[data-js-close]'));\n }\n }\n\n /**\n * Store notification to the stack\n * @param {Object} data notification data retrieved from emit\n * @param {boolean} preventStacking clears notification stack and show current notification\n */\n addNotification(data, preventStacking) {\n if (preventStacking) {\n this.clearAllNotifications();\n }\n\n // store current notification data to the state\n this.state.stack.push(data);\n\n // if there is no other notification currently displayed then display the current one\n if (this.state.stack.length === 1) {\n this.createNotification(this.state.stack[0]);\n }\n }\n\n /**\n * Display a notification\n * @param {Object} data notification data retrieved from emit\n */\n createNotification(data) {\n const timeoutMs = data.timeoutMs || this.options.timeoutMs;\n const content = `\n ${data.content}\n \n `;\n\n const notification = document.createElement('div');\n notification.classList.add('c-snackbar__surface');\n notification.innerHTML = content;\n\n switch (data.type) {\n case 'success':\n notification.classList.add('m-success');\n break;\n case 'warning':\n notification.classList.add('m-warning');\n break;\n case 'error':\n notification.classList.add('m-error');\n break;\n default:\n break;\n }\n\n this.element.appendChild(notification);\n this.state.currentNotification = notification;\n\n this.state.timeoutId = window.setTimeout(() => {\n window.requestAnimationFrame(this.removeNotification.bind(this, false));\n }, timeoutMs);\n\n on('click', this.state.currentNotification.querySelector('[data-js-close]'), this._onClose.bind(this));\n }\n\n /**\n * Remove current notification\n * @param {boolean} preventStacking - Ensure that no new notification get stacked\n */\n removeNotification(preventStacking = false) {\n this._removeNotificationEvents();\n if (this.state.currentNotification) {\n this.element.removeChild(this.state.currentNotification);\n }\n this.state.currentNotification = null;\n this.state.stack.shift();\n this.state.timeoutId = null;\n\n if (this.state.stack.length && !preventStacking) {\n window.setTimeout(() => {\n window.requestAnimationFrame(this.createNotification.bind(this, this.state.stack[0]));\n }, this.options.sustain);\n }\n }\n\n /**\n * Handler for global update\n * @param {Object} content - Analytics data of the virtual page\n */\n onGlobalUpdate(content) {\n if (content.snackbarNotifications) {\n content.snackbarNotifications.forEach((notification) => {\n this.addNotification(notification);\n });\n }\n }\n\n /**\n * remove all notifications\n */\n clearAllNotifications() {\n // clear timed out call if any\n if (this.state.timeoutId !== null) {\n window.clearTimeout(this.state.timeoutId);\n }\n\n // run with simple cycle to make sure that removeNotification will be called\n // exact numbe of times as state.stack length, as removeNotification modifies (reduce length) of stack\n const l = this.state.stack.length;\n for (let i = 0; i < l; i++) {\n this.removeNotification(true);\n }\n }\n\n /**\n * Destroy is called automatically after the component is being removed from the DOM\n * You must always destroy the listeners attached to an element to avoid any memory leaks\n */\n destroy() {\n Event.removeListener('snackbar.notify', this._onNotify.bind(this), this);\n Event.removeListener('snackbar.close', this._onClose.bind(this), this);\n this._removeNotificationEvents();\n }\n}\n"],"mappings":"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","ignoreList":[]}