{"version":3,"file":"FlowplayerVideo.js","names":["FlowplayerVideo","a","setters","Video","default","videoType","deepMerge","on","off","execute","constructor","element","options","arguments","length","type","FLOWPLAYER","width","height","videoID","autoplay","autopause","mute","loop","controls","startAt","siteId","autoVideoRatio","useFlowplayerModule","API_URL","MODULE_URL","bindEvents","onFlowPlayerModule","bind","loadPlayer","startVideo","event","state","playOnRender","createVideo","preventDefault","addLoader","videoId","Error","importAPI","replace","loadAPI","then","catch","e","console","error","url","Promise","resolve","componentId","getAttribute","isAPILoaded","document","querySelector","dispatchEvent","Event","importScriptTag","createElement","firstScriptTag","head","getElementsByTagName","text","parentNode","insertBefore","window","flowplayer","reject","apiScriptTag","src","async","onload","onerror","getPlayer","player","createPlayer","playerId","selectors","videoPlayer","playerVars","muted","ui","videoassetlink","getElementById","remove","flowplayerElement","id","appendChild","cloud","onRenderVideo","onPlayerReady","classList","add","handlePlayerReadyOptions","onPlayVideo","onStopVideo","onPauseVideo","onCanPlayVideo","onPlayerPlay","onPlayerPause","toggleMute","unMute","muteVideoPlayer","unMuteVideoPlayer","addObserver","playVideoPlayer","sendEventAnalytics","action","sendAnalytics","category","label","extraData","event_name","video_title","currentSrc","video_action","sendProgressToAnalytics","percent","currentTime","duration","prevBreakpoint","getProgressBreakpoint","progressPercentage","currentBreakpoint","percentLabel","toFixed","paused","play","destroy"],"sources":["components/global/FlowplayerVideo.js"],"sourcesContent":["import Video from './Video';\nimport videoType from 'constants/videoType';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { on, off } from 'toolbox/event';\n\n/**\n * This is a description of the FlowplayerVideo constructor function.\n * @class\n * @classdesc This is a description of the FlowplayerVideo class. (must be edited)\n * @extends Component\n */\nexport default class FlowplayerVideo extends Video {\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 type: videoType.FLOWPLAYER,\n width: '100%',\n height: '100%',\n videoID: null,\n autoplay: 0,\n autopause: true, // Whether a player should autopause when it is outside of the viewport\n mute: false,\n loop: 1,\n controls: 1,\n startAt: null,\n siteId: null,\n autoVideoRatio: null,\n useFlowplayerModule: false, // Whether to use the Flowplayer API as a module\n }, options));\n this.API_URL = 'https://cdn.flowplayer.com/players//native/flowplayer.async.js';\n this.MODULE_URL = '//embed.flowplayer.com//.js';\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 on('moduleimported', this.element, this.onFlowPlayerModule.bind(this));\n }\n\n /**\n * Handles the moduleimported event and loads the player\n * @returns {void}\n */\n onFlowPlayerModule() {\n this.loadPlayer();\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 if (!this.state.playOnRender) {\n this.options.autoplay = true;\n this.state.playOnRender = true;\n this.createVideo(event);\n }\n }\n\n /**\n * Loads Flowplayer API to render video inside component and call loadPlayer() when API ready.\n *\n * @param {Object} event - Event object\n */\n createVideo(event) {\n if (event) {\n event.preventDefault();\n }\n this.addLoader();\n\n if (!this.options.videoId) {\n throw new Error('The videoId of the player is missing!');\n }\n\n if (!this.options.siteId) {\n throw new Error('The siteId of the player is missing!');\n }\n\n if (!this.options.useFlowplayerModule) {\n // Load the IFrame Player API code asynchronously.\n FlowplayerVideo.loadAPI(this.API_URL.replace('', this.options.siteId))\n .then(this.loadPlayer.bind(this))\n .catch((e) => {\n console.error(`Flowplayer load API promise rejected : ${e}`);\n });\n\n return;\n }\n // Import the embedding script module to bypass the advertising functionality\n this.importAPI(this.MODULE_URL.replace('', this.options.siteId).replace('', this.options.videoId));\n }\n\n /**\n * Imports the Flowplayer API script and sets the window.flowplayer object\n * @param {string} url - the URL of the Flowplayer API script to import\n * @returns {void}\n */\n importAPI(url) {\n return new Promise((resolve) => {\n const componentId = this.element.getAttribute('data-component-id');\n\n if (FlowplayerVideo.isAPILoaded()) {\n document.querySelector(`[data-component-id=\"${componentId}\"]`).dispatchEvent(new Event('moduleimported'));\n resolve();\n return;\n }\n\n const importScriptTag = document.createElement('script');\n const firstScriptTag = document.head.getElementsByTagName('script')[0];\n\n importScriptTag.type = 'module';\n importScriptTag.text = `\n import('${url}').then((module) => {\n window.flowplayer = module.default;\n document.querySelector('[data-component-id=\"${componentId}\"]').dispatchEvent(new Event('moduleimported'));\n })`;\n firstScriptTag.parentNode.insertBefore(importScriptTag, firstScriptTag);\n });\n }\n\n /**\n * Returns true if Flowplayer API is already loaded.\n *\n * @return {Boolean} true or false\n */\n static isAPILoaded() {\n return !!window.flowplayer;\n }\n\n /**\n * Loads Flowplayer API and returns promise\n *\n * @param {Object} url - Event object\n * @returns {Promise} object\n */\n static loadAPI(url) {\n return new Promise((resolve, reject) => {\n if (FlowplayerVideo.isAPILoaded()) {\n resolve();\n return;\n }\n\n // Load the IFrame Player API code asynchronously.\n const apiScriptTag = document.createElement('script');\n apiScriptTag.src = url;\n apiScriptTag.async = true;\n apiScriptTag.onload = resolve;\n apiScriptTag.onerror = reject;\n const firstScriptTag = document.head.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(apiScriptTag, firstScriptTag);\n });\n }\n\n /**\n * return component video player\n * @returns {Object} player\n */\n getPlayer() {\n return this.player;\n }\n\n /**\n * Calls Flowplayer API to create video player iframe\n *\n * @param {String} playerId - id of element, which will be relaced by video player\n * @return {Object} window.Flowplayer.Player\n */\n createPlayer(playerId) {\n if (this.selectors.videoPlayer) {\n return this.selectors.videoPlayer;\n }\n const playerVars = {\n src: this.options.videoId,\n autoplay: this.options.autoplay,\n loop: this.options.loop,\n muted: this.options.mute,\n autopause: this.options.autopause,\n controls: +!!this.options.controls,\n };\n\n playerVars.ui = 0;\n if (this.options.controls === 0) {\n const flowplayerUINoControls = 1024;\n const flowplayerUINoFullscreen = 1;\n const flowplayerUINoTouchZones = 16384;\n // eslint-disable-next-line no-bitwise\n playerVars.ui = flowplayerUINoControls | flowplayerUINoFullscreen | flowplayerUINoTouchZones;\n }\n const flowplayerUINoTitle = 256;\n const flowplayerUINoDesc = 512;\n // eslint-disable-next-line no-bitwise\n playerVars.ui += flowplayerUINoTitle | flowplayerUINoDesc;\n\n const videoassetlink = document.getElementById(playerId);\n if (videoassetlink) {\n videoassetlink.remove();\n }\n\n this.state.playerId = playerId;\n const flowplayerElement = document.createElement('div');\n flowplayerElement.id = playerId;\n this.element.appendChild(flowplayerElement);\n window.flowplayer(`#${this.state.playerId}`, playerVars);\n\n if (!this.options.useFlowplayerModule) {\n window.flowplayer.cloud.then(this.onRenderVideo.bind(this, true));\n }\n this.selectors.videoPlayer = window.flowplayer(`#${this.state.playerId}`);\n\n return this.selectors.videoPlayer;\n }\n\n /**\n * Configure video player and bind player events.\n */\n onPlayerReady() {\n this.selectors.videoPlayer = window.flowplayer(`#${this.state.playerId}`);\n\n if (this.options.autoVideoRatio) {\n this.element.classList.add('m-auto-ratio');\n }\n this.handlePlayerReadyOptions();\n\n this.selectors.videoPlayer.classList.add('disable-play');\n\n this.selectors.videoPlayer.on('playing', this.onPlayVideo.bind(this));\n this.selectors.videoPlayer.on('ended', this.onStopVideo.bind(this));\n this.selectors.videoPlayer.on('pause', this.onPauseVideo.bind(this));\n this.selectors.videoPlayer.on('canplay', this.onCanPlayVideo.bind(this));\n }\n\n /**\n * Play video\n * Here the logic is removed to not disturb the flowplayer behavior already playing the video by himself\n */\n onPlayerPlay() {\n // overloading the method from the parent class Video.js\n }\n\n /**\n * Pause video\n * Here the logic is removed to not disturb the flowplayer behavior already pausing the video by himself\n */\n onPlayerPause() {\n // overloading the method from the parent class Video.js\n }\n\n /**\n * Mute the video\n */\n mute() {\n this.selectors.videoPlayer.toggleMute();\n }\n\n /**\n * Unmute the video\n */\n unMute() {\n this.selectors.videoPlayer.toggleMute();\n }\n\n /**\n * Mute video player\n */\n muteVideoPlayer() {\n this.mute();\n }\n\n /**\n * Unmute video player\n */\n unMuteVideoPlayer() {\n this.unMute();\n }\n\n /**\n * Play video when it is playable\n * Flowplayer will play the video when it is ready\n */\n onCanPlayVideo() {\n this.addObserver(this.selectors.videoPlayer);\n if (this.state.playOnRender) {\n this.playVideoPlayer();\n }\n }\n\n /**\n * Send event analytics\n * @param {String} action - action value\n */\n sendEventAnalytics(action) {\n this.sendAnalytics({\n event: 'uaevent',\n category: 'video',\n action,\n label: this.options.videoId,\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 * Update player progress in percents, report the % played if it matches some of the breakpoints\n */\n sendProgressToAnalytics() {\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 (prevBreakpoint < currentBreakpoint) {\n const percentLabel = (currentBreakpoint * 100).toFixed();\n this.sendEventAnalytics(`${percentLabel}% Viewed`);\n }\n }\n\n /**\n * Play video player\n */\n playVideoPlayer() {\n if (this.selectors.videoPlayer) {\n this.state.paused = false;\n this.selectors.videoPlayer.play();\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 super.destroy();\n off('moduleimported', this.element);\n }\n}\n"],"mappings":"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","ignoreList":[]}