{"version":3,"file":"Video.js","names":["Video","a","setters","Component","default","videoType","on","off","trigger","deepMerge","mix","AnalyticsMixin","LoaderMixin","EventCatcherMixin","Event","execute","with","constructor","element","options","arguments","length","templateName","type","SELFHOSTED","width","height","classNames","loading","playerActive","mute","muteButton","controls","autoplay","loop","videoId","startAt","metadata","intersectionThreshold","updateProgressInteval","analyticsPercentageBreakpoints","a11y","controlAriaLabelStop","controlAriaLabelPlay","controlAriaLabelMute","controlAriaLabelUnmute","loyaltyAction","analytics","initCache","selectors","videoCover","querySelector","videoLink","indexElement","closest","videoControlButton","videoControlButtonMute","initState","state","paused","muted","isAutoPaused","progressPercentage","playedTime","loopedVideoCompleted","isPlayerEvents","isActionFromVideoControlButton","bindEvents","startVideo","bind","onVideoControlToggle","onVideoControlMuteToggle","afterInit","sort","b","sendPromoImpressionsToAnalytics","setTimeout","createVideo","showControlButton","showControlButtonMute","event","then","playVideo","preventDefault","addLoader","videoPlayerData","Object","assign","poster","currentSrc","render","replaceChildren","onRenderVideo","removeLoader","classList","add","bubbles","bindPlayerEvents","onPlayerReady","videoPlayer","onPlayVideo","onStopVideo","onPauseVideo","onMuteVideo","onUnMuteVideo","handlePlayerReadyOptions","addObserver","seekTo","onPlayerPlay","e","time","detail","onPlayerPause","pauseVideo","onMutePlayer","muteVideo","onUnMutePlayer","unMuteVideo","onMouseMove","stopPropagation","passive","unbindPlayerEvents","pauseVideoPlayer","remove","setAttribute","pause","playVideoPlayer","play","muteVideoPlayer","unMuteVideoPlayer","sendEventAnalytics","action","sendAnalytics","category","label","eventLabel","extraData","event_name","video_title","video_action","sendProgressToAnalytics","percent","currentTime","duration","prevBreakpoint","getProgressBreakpoint","currentBreakpoint","percentLabel","toFixed","clearPercentageInteval","find","point","progressInterval","clearInterval","defaultMuted","setInterval","emit","observer","window","IntersectionObserver","onIntersection","threshold","observe","removeObserver","unobserve","disconnect","entries","forEach","entry","isIntersecting","getPlayer","loadPlayer","playerId","id","player","playerElement","document","createElement","appendChild","createPlayer","destroy"],"sources":["components/global/Video.js"],"sourcesContent":["/* eslint max-lines: [\"error\", {\"max\": 450, \"skipBlankLines\": true, \"skipComments\": true }] */\nimport Component from 'core/Component';\nimport videoType from 'constants/videoType';\nimport { on, off, trigger } from 'toolbox/event';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { mix } from 'core/mixwith';\nimport AnalyticsMixin from 'mixins/Analytics';\nimport LoaderMixin from 'mixins/Loader';\nimport EventCatcherMixin from 'mixins/EventCatcher';\nimport { Event } from 'services/EventEmitter';\n\n/**\n * This is a description of the Video constructor function.\n * @class\n * @classdesc This is a description of the Video class.\n * @extends Component\n */\nexport default class Video extends mix(Component).with(AnalyticsMixin, LoaderMixin, EventCatcherMixin) {\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 templateName: 'common/videoplayer',\n type: videoType.SELFHOSTED,\n width: '100%',\n height: '100%',\n classNames: {\n loading: 'm-loading',\n playerActive: 'm-player-active',\n },\n mute: true,\n muteButton: false,\n controls: true,\n autoplay: false,\n loop: false,\n videoId: null,\n startAt: null,\n metadata: null,\n trigger: 'click',\n intersectionThreshold: 0, // intersection observer threshold\n updateProgressInteval: 1000,\n analyticsPercentageBreakpoints: [\n 0.25,\n 0.5,\n 0.75,\n 0.9,\n ],\n a11y: {\n controlAriaLabelStop: '',\n controlAriaLabelPlay: '',\n controlAriaLabelMute: '',\n controlAriaLabelUnmute: '',\n },\n loyaltyAction: '',\n analytics: {},\n }, options));\n }\n\n /**\n * All selectors must be cached. Never cache elements that are out of the component scope\n */\n initCache() {\n this.selectors.videoCover = this.element.querySelector('img');\n this.selectors.videoLink = this.element.querySelector('[data-js-video-link]');\n this.selectors.indexElement = this.element.closest('[data-js-video-asset]');\n this.selectors.videoControlButton = this.selectors.indexElement.querySelector('[data-js-video-control-button]');\n this.selectors.videoControlButtonMute = this.selectors.indexElement.querySelector('[data-js-video-control-button-mute]');\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.paused = true;\n this.state.muted = true;\n this.state.isAutoPaused = false;\n this.state.progressPercentage = null;\n this.state.playedTime = 0;\n this.state.loopedVideoCompleted = false;\n this.state.isPlayerEvents = false;\n this.state.isActionFromVideoControlButton = false;\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 super.bindEvents();\n if (this.options.trigger) {\n on(this.options.trigger, this.element, this.startVideo.bind(this));\n }\n if (this.selectors.videoControlButton) {\n on('click', this.selectors.videoControlButton, this.onVideoControlToggle.bind(this));\n }\n if (this.selectors.videoControlButtonMute) {\n on('click', this.selectors.videoControlButtonMute, this.onVideoControlMuteToggle.bind(this));\n }\n }\n\n /**\n * After init\n * Run any script after the component is fully initialized\n */\n afterInit() {\n this.options.analyticsPercentageBreakpoints = this.options.analyticsPercentageBreakpoints.sort((a, b) => b - a);\n\n this.sendPromoImpressionsToAnalytics();\n\n if (this.options.autoplay) {\n setTimeout(this.createVideo.bind(this), 0);\n this.showControlButton();\n this.showControlButtonMute();\n }\n }\n\n /**\n * Renders the HTML5 video player and then plays the video\n *\n * @param {Object} event - Event object\n */\n startVideo(event) {\n this.createVideo(event).then(this.playVideo.bind(this));\n }\n\n /**\n * Retrieves \"videoplayer\" component template to render HTML5 videoplayer\n *\n * @param {Object} event - Event object\n * @returns {Promise} promise object\n */\n createVideo(event) {\n if (event) {\n event.preventDefault();\n }\n this.addLoader();\n off(this.options.trigger, this.element);\n\n const videoPlayerData = Object.assign({\n poster: this.selectors.videoCover.currentSrc,\n }, this.options);\n\n return this.render(videoPlayerData, {\n replaceChildren: true,\n }).then(this.onRenderVideo.bind(this));\n }\n\n /**\n * Render video handler\n */\n onRenderVideo() {\n this.removeLoader();\n this.element.classList.add(this.options.classNames.playerActive);\n\n trigger('video.player.ready', this.element, {\n bubbles: true,\n type: this.options.type,\n videoId: this.options.videoId,\n autoplay: this.options.autoplay,\n loop: this.options.loop,\n mute: this.options.mute,\n });\n if (!this.state.isPlayerEvents) {\n this.bindPlayerEvents();\n }\n this.onPlayerReady();\n }\n\n /**\n * Configure video player and bind player events.\n */\n onPlayerReady() {\n this.selectors.videoPlayer = this.element.querySelector('video');\n this.selectors.videoPlayer.loop = !!this.options.loop;\n\n on('play', this.selectors.videoPlayer, this.onPlayVideo.bind(this));\n on('ended', this.selectors.videoPlayer, this.onStopVideo.bind(this));\n on('pause', this.selectors.videoPlayer, this.onPauseVideo.bind(this));\n on('mute', this.selectors.videoPlayer, this.onMuteVideo.bind(this));\n on('unmute', this.selectors.videoPlayer, this.onUnMuteVideo.bind(this));\n\n this.handlePlayerReadyOptions();\n this.addObserver(this.selectors.videoPlayer);\n }\n\n /**\n * Handle options on player ready\n */\n handlePlayerReadyOptions() {\n // need to mute player, if autoplay or mute is enabled\n if (this.options.autoplay || this.options.mute) {\n this.mute();\n }\n if (this.options.startAt) {\n this.seekTo(this.options.startAt);\n }\n if (this.options.controls === 0) {\n this.showControlButton();\n }\n if (this.options.controls === 0 && this.options.muteButton) {\n this.showControlButtonMute();\n }\n }\n\n /**\n * Play video\n * @param {Object} e - event object\n */\n onPlayerPlay(e) {\n const { time } = e.detail;\n this.playVideo(time);\n }\n\n /**\n * Pause video\n */\n onPlayerPause() {\n this.pauseVideo();\n }\n\n /**\n * Mute video\n */\n onMutePlayer() {\n this.muteVideo();\n }\n\n /**\n * Unmute video\n */\n onUnMutePlayer() {\n this.unMuteVideo();\n }\n\n /**\n * Control Move event handler\n * In case if Video player placed inside carousel, need to prevent mouse move event\n *\n * @param {Object} event Event object\n */\n onMouseMove(event) {\n event.stopPropagation();\n }\n\n /**\n * Bind player event handlers\n */\n bindPlayerEvents() {\n this.state.isPlayerEvents = true;\n on('video.player.pause', this.element, this.onPlayerPause.bind(this));\n on('video.player.play', this.element, this.onPlayerPlay.bind(this));\n on('mousemove pointermove touchmove', this.element, this.onMouseMove.bind(this), {\n passive: true,\n });\n on('video.player.mute', this.element, this.onMutePlayer.bind(this));\n on('video.player.unmute', this.element, this.onUnMutePlayer.bind(this));\n }\n\n /**\n * Unbind player event handlers\n */\n unbindPlayerEvents() {\n this.state.isPlayerEvents = false;\n off('video.player.pause', this.element);\n off('video.player.play', this.element);\n off('mousemove pointermove touchmove', this.element);\n off('video.player.mute', this.element);\n off('video.player.unmute', this.element);\n }\n\n /**\n * Pause video\n */\n pauseVideo() {\n if (!this.state.paused) {\n this.pauseVideoPlayer();\n this.state.paused = true;\n if (this.selectors.videoControlButton) {\n this.selectors.videoControlButton.classList.remove('m-pause');\n this.selectors.videoControlButton.classList.add('m-play');\n this.selectors.videoControlButton.setAttribute('aria-label', this.options.a11y.controlAriaLabelPlay);\n }\n }\n }\n\n /**\n * Pause video player\n */\n pauseVideoPlayer() {\n if (this.selectors.videoPlayer) {\n this.selectors.videoPlayer.pause();\n }\n }\n\n /**\n * Play video\n * @param {Number} time - start time\n */\n playVideo(time) {\n if (this.state.paused) {\n this.seekTo(time);\n this.playVideoPlayer();\n this.state.paused = false;\n this.state.isAutoPaused = false;\n if (this.selectors.videoControlButton) {\n this.selectors.videoControlButton.classList.remove('m-play');\n this.selectors.videoControlButton.classList.add('m-pause');\n this.selectors.videoControlButton.setAttribute('aria-label', this.options.a11y.controlAriaLabelStop);\n }\n }\n }\n\n /**\n * Play video player\n */\n playVideoPlayer() {\n if (this.selectors.videoPlayer) {\n this.selectors.videoPlayer.play();\n }\n }\n\n /**\n * Mute video\n */\n muteVideo() {\n if (!this.state.muted) {\n this.muteVideoPlayer();\n this.state.muted = true;\n if (this.selectors.videoControlButtonMute) {\n this.selectors.videoControlButtonMute.classList.remove('m-unmute');\n this.selectors.videoControlButtonMute.classList.add('m-mute');\n this.selectors.videoControlButtonMute.setAttribute('aria-label', this.options.a11y.controlAriaLabelUnmute);\n }\n }\n }\n\n /**\n * Mute video player\n */\n muteVideoPlayer() {\n if (this.selectors.videoPlayer) {\n this.selectors.videoPlayer.muted = true;\n }\n }\n\n /**\n * Unmute video\n * @param {Number} time - start time\n */\n unMuteVideo() {\n if (this.state.muted) {\n this.unMuteVideoPlayer();\n this.state.muted = false;\n if (this.selectors.videoControlButtonMute) {\n this.selectors.videoControlButtonMute.classList.remove('m-mute');\n this.selectors.videoControlButtonMute.classList.add('m-unmute');\n this.selectors.videoControlButtonMute.setAttribute('aria-label', this.options.a11y.controlAriaLabelMute);\n }\n }\n }\n\n /**\n * Unmute video player\n */\n unMuteVideoPlayer() {\n if (this.selectors.videoPlayer) {\n this.selectors.videoPlayer.muted = false;\n }\n }\n\n /**\n * Send event analytics\n * @param {String} action - action value\n */\n sendEventAnalytics(action) {\n if (this.options.type === videoType.SELFHOSTED) {\n this.sendAnalytics({\n event: 'uaevent',\n category: 'video',\n action,\n label: this.options.analytics.eventLabel || this.options.videoId || this.selectors.videoPlayer.currentSrc,\n extraData: {\n event_name: 'video_interaction',\n video_title: this.options.videoId || this.selectors.videoPlayer.currentSrc,\n video_action: action,\n },\n });\n }\n }\n\n /**\n * Update player progress in percents, report the % played if it matches some of the breakpoints\n */\n sendProgressToAnalytics() {\n if (this.options.type === videoType.SELFHOSTED) {\n const percent = this.selectors.videoPlayer.currentTime / this.selectors.videoPlayer.duration;\n\n const prevBreakpoint = this.getProgressBreakpoint(this.state.progressPercentage);\n const currentBreakpoint = this.getProgressBreakpoint(percent);\n\n this.state.progressPercentage = percent;\n\n if (!this.state.loopedVideoCompleted) {\n if (prevBreakpoint < currentBreakpoint) {\n const percentLabel = (currentBreakpoint * 100).toFixed();\n this.sendEventAnalytics(`${percentLabel}% Viewed`);\n }\n\n if (this.options.loop && (this.state.playedTime > this.selectors.videoPlayer.currentTime)) {\n this.clearPercentageInteval();\n this.sendEventAnalytics('video completed');\n this.state.loopedVideoCompleted = true;\n }\n }\n\n this.state.playedTime = this.selectors.videoPlayer.currentTime;\n }\n }\n\n /**\n * Returns last breakpoint from input percent\n * @param {Number} percent progress percentage (0 - 1)\n * @returns {Number} last passed breakpoint\n */\n getProgressBreakpoint(percent) {\n return this.options.analyticsPercentageBreakpoints.find(point => percent >= point) || -1;\n }\n\n /**\n * Clears percentage inteval\n */\n clearPercentageInteval() {\n if (this.progressInterval) {\n clearInterval(this.progressInterval);\n }\n }\n\n /**\n * Mute the video\n */\n mute() {\n this.selectors.videoPlayer.muted = true;\n this.selectors.videoPlayer.defaultMuted = true;\n }\n\n /**\n * Scroll video to proper time\n * @param {Number} time - video time postion\n */\n seekTo(time) {\n if (typeof time === 'number') {\n this.selectors.videoPlayer.currentTime = time;\n }\n }\n\n /**\n * Play video event handler\n */\n onPlayVideo() {\n trigger('video.player.play', this.element, {\n bubbles: true,\n type: this.options.type,\n videoId: this.options.videoId,\n autoplay: this.options.autoplay,\n loop: this.options.loop,\n mute: this.options.mute,\n muteButton: this.options.muteButton,\n metadata: this.options.metadata,\n });\n\n this.clearPercentageInteval();\n this.progressInterval = setInterval(this.sendProgressToAnalytics.bind(this), this.options.updateProgressInteval);\n\n if (!this.state.loopedVideoCompleted || this.state.isActionFromVideoControlButton) {\n this.state.isActionFromVideoControlButton = false;\n this.sendEventAnalytics('play');\n Event.emit('videoplayer.play', { element: this.element, videoId: this.options.videoId });\n }\n }\n\n /**\n * Stop video event handler\n */\n onStopVideo() {\n trigger('video.player.ended', this.element, this.options);\n\n this.clearPercentageInteval();\n\n this.sendEventAnalytics('video completed');\n }\n\n /**\n * Mute video event handler\n */\n onMuteVideo() {\n trigger('video.player.mute', this.element, this.options);\n }\n\n /**\n * Mute video event handler\n */\n onUnMuteVideo() {\n trigger('video.player.unmute', this.element, this.options);\n }\n\n /**\n * Pause video event handler\n */\n onPauseVideo() {\n trigger('video.player.pause', this.element, this.options);\n\n this.clearPercentageInteval();\n\n if (this.selectors.videoPlayer && (!this.state.loopedVideoCompleted || this.state.isActionFromVideoControlButton)\n && this.selectors.videoPlayer.currentTime !== this.selectors.videoPlayer.duration) {\n this.state.isActionFromVideoControlButton = false;\n this.sendEventAnalytics('pause');\n }\n }\n\n /**\n * Create intersection observer instance and attach it to video\n * @param {HTMLElement} element element to observe\n */\n addObserver(element) {\n this.observer = this.observer || new window.IntersectionObserver(this.onIntersection.bind(this), {\n threshold: this.options.intersectionThreshold,\n });\n this.observer.observe(element || this.element);\n }\n\n /**\n * Disconnect intersection observer\n */\n removeObserver() {\n if (this.observer) {\n this.observer.unobserve(this.element);\n this.observer.disconnect();\n }\n }\n\n /**\n * Inter section event handler\n * @param {Object} entries - Entries object\n */\n onIntersection(entries) {\n entries.forEach((entry) => {\n if (!entry.isIntersecting) {\n if (!this.state.paused) {\n this.state.isAutoPaused = true;\n this.pauseVideo();\n }\n } else if (this.state.paused && this.state.isAutoPaused && this.options.autoplay) {\n this.playVideo();\n }\n });\n }\n\n /**\n * Show Autoplay button\n */\n showControlButton() {\n if (this.selectors.videoControlButton) {\n this.selectors.videoControlButton.classList.remove('h-hidden');\n this.selectors.videoControlButton.classList.add(this.state.paused ? 'm-play' : 'm-pause');\n }\n }\n\n /**\n * Show Mute button\n */\n showControlButtonMute() {\n if (this.selectors.videoControlButtonMute) {\n this.selectors.videoControlButtonMute.classList.remove('h-hidden');\n this.selectors.videoControlButtonMute.classList.add(this.state.muted ? 'm-mute' : 'm-unmute');\n }\n }\n\n /**\n * Mouse Enter event handler\n */\n onVideoControlToggle() {\n this.state.isActionFromVideoControlButton = true;\n\n if (this.state.paused) {\n this.state.isAutoPaused = true;\n this.playVideo();\n } else {\n this.state.isAutoPaused = false;\n this.pauseVideo();\n }\n }\n\n /**\n * Mouse Enter event handler\n */\n onVideoControlMuteToggle() {\n if (this.state.muted) {\n this.unMuteVideo();\n } else {\n this.muteVideo();\n }\n }\n\n /**\n * return component video player\n * @returns {Object} player\n */\n getPlayer() {\n return this.selectors.videoPlayer;\n }\n\n /**\n * Load video player into component element.\n * Used in Video component based on API (Youtube, Vimeo)\n *\n * @returns {Object} this.player\n */\n loadPlayer() {\n const playerId = `player_${this.id}`;\n const player = this.getPlayer();\n const playerElement = document.createElement('div');\n\n if (player) {\n this.playVideo();\n return player;\n }\n\n this.selectors.videoLink.remove();\n playerElement.id = playerId;\n this.element.appendChild(playerElement);\n if (!this.state.isPlayerEvents) {\n this.bindPlayerEvents();\n }\n this.player = this.createPlayer(playerId);\n this.playVideo();\n\n return this.player;\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 this.removeObserver();\n this.unbindPlayerEvents();\n off(this.element);\n\n if (this.selectors.videoPlayer) {\n this.clearPercentageInteval();\n off(this.selectors.videoPlayer);\n }\n if (this.selectors.videoControlButton) {\n off('click', this.selectors.videoControlButton);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}