UNPKG

openplayerjs

Version:
447 lines (446 loc) 24.9 kB
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _Controls_settings, _Controls_timer, _Controls_controls, _Controls_player, _Controls_items, _Controls_controlEls; import Captions from './controls/captions'; import Fullscreen from './controls/fullscreen'; import Levels from './controls/levels'; import Play from './controls/play'; import Progress from './controls/progress'; import Settings from './controls/settings'; import Time from './controls/time'; import Volume from './controls/volume'; import { EVENT_OPTIONS, IS_ANDROID, IS_IOS } from './utils/constants'; import { addEvent, isAudio, isVideo, sanitize } from './utils/general'; class Controls { constructor(player) { this.events = { media: {}, mouse: {}, }; _Controls_settings.set(this, void 0); _Controls_timer.set(this, 0); _Controls_controls.set(this, void 0); _Controls_player.set(this, void 0); _Controls_items.set(this, void 0); _Controls_controlEls.set(this, { Captions, Fullscreen, Levels, Play, Progress, Settings, Time, Volume, }); __classPrivateFieldSet(this, _Controls_player, player, "f"); this._setElements(); } create() { __classPrivateFieldGet(this, _Controls_player, "f").getElement().controls = false; const isMediaVideo = isVideo(__classPrivateFieldGet(this, _Controls_player, "f").getElement()); this._createControlsLayer(); this._buildElements(); this.events.controlschanged = () => { this.destroy(); this._setElements(); this.create(); }; this.events.ended = () => { __classPrivateFieldGet(this, _Controls_player, "f").getContainer().classList.remove('op-controls--hidden'); }; __classPrivateFieldGet(this, _Controls_player, "f").getElement().addEventListener('controlschanged', this.events.controlschanged, EVENT_OPTIONS); __classPrivateFieldGet(this, _Controls_player, "f").getElement().addEventListener('ended', this.events.ended, EVENT_OPTIONS); const { alwaysVisible } = __classPrivateFieldGet(this, _Controls_player, "f").getOptions().controls || {}; if (!alwaysVisible) { const showControls = () => { if (isMediaVideo) { __classPrivateFieldGet(this, _Controls_player, "f").getContainer().classList.remove('op-controls--hidden'); this._stopControlTimer(); } }; this.events.mouse.mouseenter = () => { if (isMediaVideo && !__classPrivateFieldGet(this, _Controls_player, "f").activeElement().paused) { this._stopControlTimer(); if (__classPrivateFieldGet(this, _Controls_player, "f").activeElement().currentTime) { __classPrivateFieldGet(this, _Controls_player, "f").playBtn.setAttribute('aria-hidden', __classPrivateFieldGet(this, _Controls_player, "f").isMedia() ? 'false' : 'true'); __classPrivateFieldGet(this, _Controls_player, "f").loader.setAttribute('aria-hidden', 'true'); } else if (__classPrivateFieldGet(this, _Controls_player, "f").getOptions().showLoaderOnInit) { __classPrivateFieldGet(this, _Controls_player, "f").playBtn.setAttribute('aria-hidden', 'true'); __classPrivateFieldGet(this, _Controls_player, "f").loader.setAttribute('aria-hidden', 'false'); } __classPrivateFieldGet(this, _Controls_player, "f").getContainer().classList.remove('op-controls--hidden'); this._startControlTimer(2500); } }; this.events.mouse.mousemove = () => { if (isMediaVideo && !__classPrivateFieldGet(this, _Controls_player, "f").activeElement().paused) { if (__classPrivateFieldGet(this, _Controls_player, "f").activeElement().currentTime) { __classPrivateFieldGet(this, _Controls_player, "f").loader.setAttribute('aria-hidden', 'true'); __classPrivateFieldGet(this, _Controls_player, "f").playBtn.setAttribute('aria-hidden', __classPrivateFieldGet(this, _Controls_player, "f").isMedia() ? 'false' : 'true'); } else { __classPrivateFieldGet(this, _Controls_player, "f").playBtn.setAttribute('aria-hidden', __classPrivateFieldGet(this, _Controls_player, "f").getOptions().showLoaderOnInit ? 'true' : 'false'); __classPrivateFieldGet(this, _Controls_player, "f").loader.setAttribute('aria-hidden', __classPrivateFieldGet(this, _Controls_player, "f").getOptions().showLoaderOnInit ? 'false' : 'true'); } __classPrivateFieldGet(this, _Controls_player, "f").getContainer().classList.remove('op-controls--hidden'); this._startControlTimer(2500); } }; this.events.mouse.mouseleave = () => { if (isMediaVideo && !__classPrivateFieldGet(this, _Controls_player, "f").activeElement().paused) { this._startControlTimer(1000); } }; this.events.media.play = () => { if (isMediaVideo) { this._startControlTimer(__classPrivateFieldGet(this, _Controls_player, "f").getOptions().hidePlayBtnTimer || 350); } }; this.events.media.loadedmetadata = showControls.bind(this); this.events.media.pause = showControls.bind(this); this.events.media.waiting = showControls.bind(this); this.events.media.stalled = showControls.bind(this); this.events.media.playererror = showControls.bind(this); Object.keys(this.events.media).forEach((event) => { __classPrivateFieldGet(this, _Controls_player, "f").getElement().addEventListener(event, this.events.media[event], EVENT_OPTIONS); }); if (IS_ANDROID || IS_IOS) { __classPrivateFieldGet(this, _Controls_player, "f").getContainer().addEventListener('click', this.events.mouse.mouseenter, EVENT_OPTIONS); } else { Object.keys(this.events.mouse).forEach((event) => { __classPrivateFieldGet(this, _Controls_player, "f").getContainer().addEventListener(event, this.events.mouse[event], EVENT_OPTIONS); }); } if (isMediaVideo && !__classPrivateFieldGet(this, _Controls_player, "f").activeElement().paused) { this._startControlTimer(3000); } } } destroy() { if (!IS_ANDROID && !IS_IOS) { Object.keys(this.events.mouse).forEach((event) => { __classPrivateFieldGet(this, _Controls_player, "f").getContainer().removeEventListener(event, this.events.mouse[event]); }); Object.keys(this.events.media).forEach((event) => { __classPrivateFieldGet(this, _Controls_player, "f").getElement().removeEventListener(event, this.events.media[event]); }); this._stopControlTimer(); } __classPrivateFieldGet(this, _Controls_player, "f").getElement().removeEventListener('controlschanged', this.events.controlschanged); __classPrivateFieldGet(this, _Controls_player, "f").getElement().removeEventListener('ended', this.events.ended); Object.keys(__classPrivateFieldGet(this, _Controls_items, "f")).forEach((position) => { __classPrivateFieldGet(this, _Controls_items, "f")[position].forEach((item) => { if (item.custom) { this._destroyCustomElement(item); } else if (typeof item.destroy === 'function') { item.destroy(); } }); }); __classPrivateFieldGet(this, _Controls_controls, "f").remove(); } getContainer() { return __classPrivateFieldGet(this, _Controls_controls, "f"); } getLayer(layer) { return __classPrivateFieldGet(this, _Controls_controls, "f").querySelector(`.op-controls-layer__${layer}`) || __classPrivateFieldGet(this, _Controls_controls, "f"); } _createControlsLayer() { if (!__classPrivateFieldGet(this, _Controls_controls, "f") || !__classPrivateFieldGet(this, _Controls_player, "f").getContainer().querySelector('.op-controls')) { __classPrivateFieldSet(this, _Controls_controls, document.createElement('div'), "f"); __classPrivateFieldGet(this, _Controls_controls, "f").className = 'op-controls'; __classPrivateFieldGet(this, _Controls_player, "f").getContainer().appendChild(__classPrivateFieldGet(this, _Controls_controls, "f")); const messageContainer = document.createElement('div'); messageContainer.className = 'op-status'; messageContainer.innerHTML = '<span></span>'; messageContainer.tabIndex = -1; messageContainer.setAttribute('aria-hidden', 'true'); if (isAudio(__classPrivateFieldGet(this, _Controls_player, "f").getElement())) { __classPrivateFieldGet(this, _Controls_controls, "f").appendChild(messageContainer); } } } _startControlTimer(time) { const el = __classPrivateFieldGet(this, _Controls_player, "f").activeElement(); this._stopControlTimer(); if (typeof window !== 'undefined') { __classPrivateFieldSet(this, _Controls_timer, window.setTimeout(() => { if ((!el.paused || !el.ended) && isVideo(__classPrivateFieldGet(this, _Controls_player, "f").getElement())) { __classPrivateFieldGet(this, _Controls_player, "f").getContainer().classList.add('op-controls--hidden'); __classPrivateFieldGet(this, _Controls_player, "f").playBtn.setAttribute('aria-hidden', 'true'); this._stopControlTimer(); const event = addEvent('controlshidden'); __classPrivateFieldGet(this, _Controls_player, "f").getElement().dispatchEvent(event); } }, time), "f"); } } _stopControlTimer() { if (__classPrivateFieldGet(this, _Controls_timer, "f") !== 0) { clearTimeout(__classPrivateFieldGet(this, _Controls_timer, "f")); __classPrivateFieldSet(this, _Controls_timer, 0, "f"); } } _setElements() { var _a; const controls = ((_a = __classPrivateFieldGet(this, _Controls_player, "f").getOptions().controls) === null || _a === void 0 ? void 0 : _a.layers) || {}; __classPrivateFieldSet(this, _Controls_items, { 'bottom-left': [], 'bottom-middle': [], 'bottom-right': [], left: [], main: [], middle: [], right: [], 'top-left': [], 'top-middle': [], 'top-right': [], }, "f"); const isVideoEl = isVideo(__classPrivateFieldGet(this, _Controls_player, "f").getElement()); const isAudioEl = isAudio(__classPrivateFieldGet(this, _Controls_player, "f").getElement()); const controlPositions = Object.keys(controls); const layersExist = controlPositions.find((item) => /^(top|bottom)/.test(item)); this._createControlsLayer(); controlPositions.forEach((position) => { const [layer, pos] = position.split('-'); if (pos) { if (!__classPrivateFieldGet(this, _Controls_controls, "f").classList.contains('op-controls__stacked')) { __classPrivateFieldGet(this, _Controls_controls, "f").classList.add('op-controls__stacked'); } const className = `op-controls-layer__${layer}`; if (!__classPrivateFieldGet(this, _Controls_controls, "f").querySelector(`.${className}`)) { const controlLayer = document.createElement('div'); controlLayer.className = className; __classPrivateFieldGet(this, _Controls_controls, "f").appendChild(controlLayer); } } else if (layersExist) { const className = 'op-controls-layer__center'; if (!__classPrivateFieldGet(this, _Controls_controls, "f").querySelector(`.${className}`)) { const controlLayer = document.createElement('div'); controlLayer.className = className; __classPrivateFieldGet(this, _Controls_controls, "f").appendChild(controlLayer); } } const layers = controls ? controls[position] : null; if (layers) { layers .filter((v, i, a) => a.indexOf(v) === i) .forEach((el) => { const currentLayer = layersExist && !pos ? 'center' : layer; const className = `${el.charAt(0).toUpperCase()}${el.slice(1)}`; const item = new (__classPrivateFieldGet(this, _Controls_controlEls, "f")[className])(__classPrivateFieldGet(this, _Controls_player, "f"), pos || layer, currentLayer); if (el === 'settings') { __classPrivateFieldSet(this, _Controls_settings, item, "f"); } if (isVideoEl || (el !== 'fullscreen' && isAudioEl)) { __classPrivateFieldGet(this, _Controls_items, "f")[position].push(item); } }); } }); __classPrivateFieldGet(this, _Controls_player, "f").getCustomControls().forEach((item) => { const [layer, pos] = item.position.split('-'); const currentLayer = layersExist && !pos ? 'center' : layer; item.layer = currentLayer; item.position = pos || layer; if (typeof item.index === 'number') { __classPrivateFieldGet(this, _Controls_items, "f")[item.position].splice(item.index, 0, item); } else if (item.position === 'right') { __classPrivateFieldGet(this, _Controls_items, "f")[item.position].unshift(item); } else { __classPrivateFieldGet(this, _Controls_items, "f")[item.position].push(item); } }); } _buildElements() { Object.keys(__classPrivateFieldGet(this, _Controls_items, "f")).forEach((position) => { __classPrivateFieldGet(this, _Controls_items, "f")[position].forEach((item) => { if (item.custom) { this._createCustomElement(item); } else { item.create(); } }); }); Object.keys(__classPrivateFieldGet(this, _Controls_items, "f")).forEach((position) => { __classPrivateFieldGet(this, _Controls_items, "f")[position].forEach((item) => { const allowDefault = !__classPrivateFieldGet(this, _Controls_player, "f").getOptions().detachMenus || item instanceof Settings; const current = item; if (allowDefault && !current.custom && typeof current.addSettings === 'function') { const menuItem = current.addSettings(); if (__classPrivateFieldGet(this, _Controls_settings, "f") && Object.keys(menuItem).length) { __classPrivateFieldGet(this, _Controls_settings, "f").addItem(menuItem.name, menuItem.key, menuItem.default, menuItem.subitems, menuItem.className); } } }); }); const e = addEvent('controlschanged'); __classPrivateFieldGet(this, _Controls_controls, "f").dispatchEvent(e); } _hideCustomMenu(menu) { let timeout; if (timeout && typeof window !== 'undefined') { window.cancelAnimationFrame(timeout); } if (typeof window !== 'undefined') { timeout = window.requestAnimationFrame(() => { menu.setAttribute('aria-hidden', 'true'); }); } } _toggleCustomMenu(event, menu, item) { const menus = __classPrivateFieldGet(this, _Controls_player, "f").getContainer().querySelectorAll('.op-settings'); menus.forEach((m) => { if (m.getAttribute('aria-hidden') === 'false' && m.id !== menu.id) { m.setAttribute('aria-hidden', 'true'); } }); menu.setAttribute('aria-hidden', menu.getAttribute('aria-hidden') === 'true' ? 'false' : 'true'); if (typeof item.click === 'function') { item.click(event); } } _createCustomElement(item) { const element = document.createElement(item.type); element.tabIndex = 0; element.id = item.id; element.className = `op-controls__${item.id} op-control__${item.position} ${item.showInAds ? '' : 'op-control__hide-in-ad'}`; if (item.styles) { Object.assign(element.style, item.styles); } if (item.type === 'button' && item.icon) { element.innerHTML = /\.(jpg|png|svg|gif)$/.test(item.icon) ? `<img src="${sanitize(item.icon)}"${item.alt ? `alt="${sanitize(item.alt)}"` : ''}>` : sanitize(item.icon); } else if (item.content) { element.innerHTML = sanitize(item.content, false); } if (item.type === 'button' && item.title) { element.title = sanitize(item.title); } if (item.type === 'img' && item.alt) { element.alt = sanitize(item.alt); } if (item.type !== 'button' && item.click && typeof item.click === 'function') { element.setAttribute('aria-role', 'button'); } if (item.type === 'button' && item.subitems && Array.isArray(item.subitems) && item.subitems.length > 0) { const menu = document.createElement('div'); menu.className = 'op-settings op-settings__custom'; menu.id = `${item.id}-menu`; menu.setAttribute('aria-hidden', 'true'); const items = item.subitems.map((s) => { let itemIcon = ''; if (s.icon) { itemIcon = /\.(jpg|png|svg|gif)$/.test(s.icon) ? `<img src="${sanitize(s.icon)}"${s.alt ? `alt="${sanitize(s.alt)}"` : ''}>` : sanitize(s.icon, false); } return `<div class="op-settings__menu-item" tabindex="0" ${s.title ? `title="${s.title}"` : ''} role="menuitemradio"> <div class="op-settings__menu-label" id="${s.id}" data-value="${item.id}-${s.id}">${itemIcon} ${s.label}</div> </div>`; }); menu.innerHTML = `<div class="op-settings__menu" role="menu">${items.join('')}</div>`; __classPrivateFieldGet(this, _Controls_player, "f").getContainer().appendChild(menu); item.subitems.forEach((subitem) => { const menuItem = menu.querySelector(`#${subitem.id}`); if (menuItem && subitem.click && typeof subitem.click === 'function') { menuItem.addEventListener('click', subitem.click, EVENT_OPTIONS); } }); element.addEventListener('click', (e) => this._toggleCustomMenu(e, menu, item), EVENT_OPTIONS); __classPrivateFieldGet(this, _Controls_player, "f") .getElement() .addEventListener('controlshidden', () => this._hideCustomMenu(menu), EVENT_OPTIONS); } else if (item.click && typeof item.click === 'function') { element.addEventListener('click', item.click, EVENT_OPTIONS); } if (item.mouseenter && typeof item.mouseenter === 'function') { element.addEventListener('mouseenter', item.mouseenter, EVENT_OPTIONS); } if (item.mouseleave && typeof item.mouseleave === 'function') { element.addEventListener('mouseleave', item.mouseleave, EVENT_OPTIONS); } if (item.keydown && typeof item.keydown === 'function') { element.addEventListener('keydown', item.keydown, EVENT_OPTIONS); } if (item.blur && typeof item.blur === 'function') { element.addEventListener('blur', item.blur, EVENT_OPTIONS); } if (item.focus && typeof item.focus === 'function') { element.addEventListener('focus', item.focus, EVENT_OPTIONS); } if (item.layer) { if (item.layer === 'main') { __classPrivateFieldGet(this, _Controls_player, "f").getContainer().appendChild(element); } else { this.getLayer(item.layer).appendChild(element); } } if (item.init && typeof item.init === 'function') { item.init(__classPrivateFieldGet(this, _Controls_player, "f")); } } _destroyCustomElement(item) { const control = this.getContainer().querySelector(`.op-controls__${item.id}`); if (control) { if (item.subitems && Array.isArray(item.subitems) && item.subitems.length > 0) { const menu = __classPrivateFieldGet(this, _Controls_player, "f").getContainer().querySelector(`#${item.id}-menu`); if (menu) { item.subitems.forEach((subitem) => { const menuItem = menu.querySelector(`#${subitem.id}`); if (menuItem && subitem.click && typeof subitem.click === 'function') { menuItem.removeEventListener('click', subitem.click); } }); control.removeEventListener('click', (e) => this._toggleCustomMenu(e, menu, item)); __classPrivateFieldGet(this, _Controls_player, "f").getElement().removeEventListener('controlshidden', () => this._hideCustomMenu(menu)); menu.remove(); } } if (item.click && typeof item.click === 'function') { control.removeEventListener('click', item.click); } if (item.mouseenter && typeof item.mouseenter === 'function') { control.removeEventListener('mouseenter', item.mouseenter); } if (item.mouseleave && typeof item.mouseleave === 'function') { control.removeEventListener('mouseleave', item.mouseleave); } if (item.keydown && typeof item.keydown === 'function') { control.removeEventListener('keydown', item.keydown); } if (item.blur && typeof item.blur === 'function') { control.removeEventListener('blur', item.blur); } if (item.focus && typeof item.focus === 'function') { control.removeEventListener('focus', item.focus); } control.remove(); if (item.destroy && typeof item.destroy === 'function') { item.destroy(__classPrivateFieldGet(this, _Controls_player, "f")); } } } } _Controls_settings = new WeakMap(), _Controls_timer = new WeakMap(), _Controls_controls = new WeakMap(), _Controls_player = new WeakMap(), _Controls_items = new WeakMap(), _Controls_controlEls = new WeakMap(); export default Controls;