/** * videojs-share * @version 2.0.1 * @copyright 2018 Mikhail Khazov * @license MIT */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('video.js')) : typeof define === 'function' && define.amd ? define(['video.js'], factory) : (global.videojsShare = factory(global.videojs)); }(this, (function (videojs$1) { 'use strict'; videojs$1 = 'default' in videojs$1 ? videojs$1['default'] : videojs$1; var version = "2.0.1"; var url = getUrl(); function getUrl() { return window.location.href; } function getRedirectUri() { return url + '#close_window'; } function getEmbedCode() { return ''; } function getSocials() { return ['fbFeed', 'tw', 'reddit', 'gp', 'messenger', 'linkedin', 'vk', 'ok', 'mail', 'telegram', 'whatsapp', 'viber']; } var defaults = { mobileVerification: true, title: 'Video', url: url, socials: getSocials(), embedCode: getEmbedCode(), redirectUri: getRedirectUri() }; var classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }; var possibleConstructorReturn = function (self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }; var Button = videojs.getComponent('Button'); /** * Share button. */ var ShareButton = function (_Button) { inherits(ShareButton, _Button); function ShareButton(player, options) { classCallCheck(this, ShareButton); var _this = possibleConstructorReturn(this, _Button.call(this, player, options)); _this.addClass('vjs-menu-button'); _this.addClass('vjs-share-control'); _this.addClass('vjs-icon-share'); _this.controlText(player.localize('Share')); return _this; } ShareButton.prototype.handleClick = function handleClick() { this.player().getChild('ShareOverlay').open(); }; return ShareButton; }(Button); var ModalDialog = videojs.getComponent('ModalDialog'); /** * Share modal. */ var ShareModal = function (_ModalDialog) { inherits(ShareModal, _ModalDialog); function ShareModal(player, options) { classCallCheck(this, ShareModal); var _this = possibleConstructorReturn(this, _ModalDialog.call(this, player, options)); _this.playerClassName = 'vjs-videojs-share_open'; return _this; } ShareModal.prototype.open = function open() { var player = this.player(); player.addClass(this.playerClassName); _ModalDialog.prototype.open.call(this); player.trigger('sharing:opened'); }; ShareModal.prototype.close = function close() { var player = this.player(); player.removeClass(this.playerClassName); _ModalDialog.prototype.close.call(this); player.trigger('sharing:closed'); }; return ShareModal; }(ModalDialog); var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function unwrapExports (x) { return x && x.__esModule ? x['default'] : x; } function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } function select(element) { var selectedText; if (element.nodeName === 'SELECT') { element.focus(); selectedText = element.value; } else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') { var isReadOnly = element.hasAttribute('readonly'); if (!isReadOnly) { element.setAttribute('readonly', ''); } element.select(); element.setSelectionRange(0, element.value.length); if (!isReadOnly) { element.removeAttribute('readonly'); } selectedText = element.value; } else { if (element.hasAttribute('contenteditable')) { element.focus(); } var selection = window.getSelection(); var range = document.createRange(); range.selectNodeContents(element); selection.removeAllRanges(); selection.addRange(range); selectedText = selection.toString(); } return selectedText; } var select_1 = select; var clipboardAction = createCommonjsModule(function (module, exports) { (function (global, factory) { if (typeof undefined === "function" && undefined.amd) { undefined(['module', 'select'], factory); } else { factory(module, select_1); } })(commonjsGlobal, function (module, _select) { 'use strict'; var _select2 = _interopRequireDefault(_select); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var ClipboardAction = function () { /** * @param {Object} options */ function ClipboardAction(options) { _classCallCheck(this, ClipboardAction); this.resolveOptions(options); this.initSelection(); } /** * Defines base properties passed from constructor. * @param {Object} options */ _createClass(ClipboardAction, [{ key: 'resolveOptions', value: function resolveOptions() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; this.action = options.action; this.container = options.container; this.emitter = options.emitter; this.target = options.target; this.text = options.text; this.trigger = options.trigger; this.selectedText = ''; } }, { key: 'initSelection', value: function initSelection() { if (this.text) { this.selectFake(); } else if (this.target) { this.selectTarget(); } } }, { key: 'selectFake', value: function selectFake() { var _this = this; var isRTL = document.documentElement.getAttribute('dir') == 'rtl'; this.removeFake(); this.fakeHandlerCallback = function () { return _this.removeFake(); }; this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true; this.fakeElem = document.createElement('textarea'); // Prevent zooming on iOS this.fakeElem.style.fontSize = '12pt'; // Reset box model this.fakeElem.style.border = '0'; this.fakeElem.style.padding = '0'; this.fakeElem.style.margin = '0'; // Move element out of screen horizontally this.fakeElem.style.position = 'absolute'; this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically var yPosition = window.pageYOffset || document.documentElement.scrollTop; this.fakeElem.style.top = yPosition + 'px'; this.fakeElem.setAttribute('readonly', ''); this.fakeElem.value = this.text; this.container.appendChild(this.fakeElem); this.selectedText = (0, _select2.default)(this.fakeElem); this.copyText(); } }, { key: 'removeFake', value: function removeFake() { if (this.fakeHandler) { this.container.removeEventListener('click', this.fakeHandlerCallback); this.fakeHandler = null; this.fakeHandlerCallback = null; } if (this.fakeElem) { this.container.removeChild(this.fakeElem); this.fakeElem = null; } } }, { key: 'selectTarget', value: function selectTarget() { this.selectedText = (0, _select2.default)(this.target); this.copyText(); } }, { key: 'copyText', value: function copyText() { var succeeded = void 0; try { succeeded = document.execCommand(this.action); } catch (err) { succeeded = false; } this.handleResult(succeeded); } }, { key: 'handleResult', value: function handleResult(succeeded) { this.emitter.emit(succeeded ? 'success' : 'error', { action: this.action, text: this.selectedText, trigger: this.trigger, clearSelection: this.clearSelection.bind(this) }); } }, { key: 'clearSelection', value: function clearSelection() { if (this.trigger) { this.trigger.focus(); } window.getSelection().removeAllRanges(); } }, { key: 'destroy', value: function destroy() { this.removeFake(); } }, { key: 'action', set: function set() { var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy'; this._action = action; if (this._action !== 'copy' && this._action !== 'cut') { throw new Error('Invalid "action" value, use either "copy" or "cut"'); } }, get: function get() { return this._action; } }, { key: 'target', set: function set(target) { if (target !== undefined) { if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) { if (this.action === 'copy' && target.hasAttribute('disabled')) { throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); } if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) { throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); } this._target = target; } else { throw new Error('Invalid "target" value, use a valid Element'); } } }, get: function get() { return this._target; } }]); return ClipboardAction; }(); module.exports = ClipboardAction; }); }); function E () { // Keep this empty so it's easier to inherit from // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) } E.prototype = { on: function (name, callback, ctx) { var e = this.e || (this.e = {}); (e[name] || (e[name] = [])).push({ fn: callback, ctx: ctx }); return this; }, once: function (name, callback, ctx) { var self = this; function listener () { self.off(name, listener); callback.apply(ctx, arguments); } listener._ = callback; return this.on(name, listener, ctx); }, emit: function (name) { var data = [].slice.call(arguments, 1); var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); var i = 0; var len = evtArr.length; for (i; i < len; i++) { evtArr[i].fn.apply(evtArr[i].ctx, data); } return this; }, off: function (name, callback) { var e = this.e || (this.e = {}); var evts = e[name]; var liveEvents = []; if (evts && callback) { for (var i = 0, len = evts.length; i < len; i++) { if (evts[i].fn !== callback && evts[i].fn._ !== callback) liveEvents.push(evts[i]); } } // Remove event from queue to prevent memory leak // Suggested by https://github.com/lazd // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910 (liveEvents.length) ? e[name] = liveEvents : delete e[name]; return this; } }; var index = E; var is = createCommonjsModule(function (module, exports) { /** * Check if argument is a HTML element. * * @param {Object} value * @return {Boolean} */ exports.node = function(value) { return value !== undefined && value instanceof HTMLElement && value.nodeType === 1; }; /** * Check if argument is a list of HTML elements. * * @param {Object} value * @return {Boolean} */ exports.nodeList = function(value) { var type = Object.prototype.toString.call(value); return value !== undefined && (type === '[object NodeList]' || type === '[object HTMLCollection]') && ('length' in value) && (value.length === 0 || exports.node(value[0])); }; /** * Check if argument is a string. * * @param {Object} value * @return {Boolean} */ exports.string = function(value) { return typeof value === 'string' || value instanceof String; }; /** * Check if argument is a function. * * @param {Object} value * @return {Boolean} */ exports.fn = function(value) { var type = Object.prototype.toString.call(value); return type === '[object Function]'; }; }); var DOCUMENT_NODE_TYPE = 9; /** * A polyfill for Element.matches() */ if (typeof Element !== 'undefined' && !Element.prototype.matches) { var proto = Element.prototype; proto.matches = proto.matchesSelector || proto.mozMatchesSelector || proto.msMatchesSelector || proto.oMatchesSelector || proto.webkitMatchesSelector; } /** * Finds the closest parent that matches a selector. * * @param {Element} element * @param {String} selector * @return {Function} */ function closest (element, selector) { while (element && element.nodeType !== DOCUMENT_NODE_TYPE) { if (typeof element.matches === 'function' && element.matches(selector)) { return element; } element = element.parentNode; } } var closest_1 = closest; /** * Delegates event to a selector. * * @param {Element} element * @param {String} selector * @param {String} type * @param {Function} callback * @param {Boolean} useCapture * @return {Object} */ function _delegate(element, selector, type, callback, useCapture) { var listenerFn = listener.apply(this, arguments); element.addEventListener(type, listenerFn, useCapture); return { destroy: function() { element.removeEventListener(type, listenerFn, useCapture); } } } /** * Delegates event to a selector. * * @param {Element|String|Array} [elements] * @param {String} selector * @param {String} type * @param {Function} callback * @param {Boolean} useCapture * @return {Object} */ function delegate(elements, selector, type, callback, useCapture) { // Handle the regular Element usage if (typeof elements.addEventListener === 'function') { return _delegate.apply(null, arguments); } // Handle Element-less usage, it defaults to global delegation if (typeof type === 'function') { // Use `document` as the first parameter, then apply arguments // This is a short way to .unshift `arguments` without running into deoptimizations return _delegate.bind(null, document).apply(null, arguments); } // Handle Selector-based usage if (typeof elements === 'string') { elements = document.querySelectorAll(elements); } // Handle Array-like based usage return Array.prototype.map.call(elements, function (element) { return _delegate(element, selector, type, callback, useCapture); }); } /** * Finds closest match and invokes callback. * * @param {Element} element * @param {String} selector * @param {String} type * @param {Function} callback * @return {Function} */ function listener(element, selector, type, callback) { return function(e) { e.delegateTarget = closest_1(e.target, selector); if (e.delegateTarget) { callback.call(element, e); } } } var delegate_1 = delegate; /** * Validates all params and calls the right * listener function based on its target type. * * @param {String|HTMLElement|HTMLCollection|NodeList} target * @param {String} type * @param {Function} callback * @return {Object} */ function listen(target, type, callback) { if (!target && !type && !callback) { throw new Error('Missing required arguments'); } if (!is.string(type)) { throw new TypeError('Second argument must be a String'); } if (!is.fn(callback)) { throw new TypeError('Third argument must be a Function'); } if (is.node(target)) { return listenNode(target, type, callback); } else if (is.nodeList(target)) { return listenNodeList(target, type, callback); } else if (is.string(target)) { return listenSelector(target, type, callback); } else { throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList'); } } /** * Adds an event listener to a HTML element * and returns a remove listener function. * * @param {HTMLElement} node * @param {String} type * @param {Function} callback * @return {Object} */ function listenNode(node, type, callback) { node.addEventListener(type, callback); return { destroy: function() { node.removeEventListener(type, callback); } } } /** * Add an event listener to a list of HTML elements * and returns a remove listener function. * * @param {NodeList|HTMLCollection} nodeList * @param {String} type * @param {Function} callback * @return {Object} */ function listenNodeList(nodeList, type, callback) { Array.prototype.forEach.call(nodeList, function(node) { node.addEventListener(type, callback); }); return { destroy: function() { Array.prototype.forEach.call(nodeList, function(node) { node.removeEventListener(type, callback); }); } } } /** * Add an event listener to a selector * and returns a remove listener function. * * @param {String} selector * @param {String} type * @param {Function} callback * @return {Object} */ function listenSelector(selector, type, callback) { return delegate_1(document.body, selector, type, callback); } var listen_1 = listen; var clipboard = createCommonjsModule(function (module, exports) { (function (global, factory) { if (typeof undefined === "function" && undefined.amd) { undefined(['module', './clipboard-action', 'tiny-emitter', 'good-listener'], factory); } else { factory(module, clipboardAction, index, listen_1); } })(commonjsGlobal, function (module, _clipboardAction, _tinyEmitter, _goodListener) { 'use strict'; var _clipboardAction2 = _interopRequireDefault(_clipboardAction); var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter); var _goodListener2 = _interopRequireDefault(_goodListener); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Clipboard = function (_Emitter) { _inherits(Clipboard, _Emitter); /** * @param {String|HTMLElement|HTMLCollection|NodeList} trigger * @param {Object} options */ function Clipboard(trigger, options) { _classCallCheck(this, Clipboard); var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this)); _this.resolveOptions(options); _this.listenClick(trigger); return _this; } /** * Defines if attributes would be resolved using internal setter functions * or custom functions that were passed in the constructor. * @param {Object} options */ _createClass(Clipboard, [{ key: 'resolveOptions', value: function resolveOptions() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; this.action = typeof options.action === 'function' ? options.action : this.defaultAction; this.target = typeof options.target === 'function' ? options.target : this.defaultTarget; this.text = typeof options.text === 'function' ? options.text : this.defaultText; this.container = _typeof(options.container) === 'object' ? options.container : document.body; } }, { key: 'listenClick', value: function listenClick(trigger) { var _this2 = this; this.listener = (0, _goodListener2.default)(trigger, 'click', function (e) { return _this2.onClick(e); }); } }, { key: 'onClick', value: function onClick(e) { var trigger = e.delegateTarget || e.currentTarget; if (this.clipboardAction) { this.clipboardAction = null; } this.clipboardAction = new _clipboardAction2.default({ action: this.action(trigger), target: this.target(trigger), text: this.text(trigger), container: this.container, trigger: trigger, emitter: this }); } }, { key: 'defaultAction', value: function defaultAction(trigger) { return getAttributeValue('action', trigger); } }, { key: 'defaultTarget', value: function defaultTarget(trigger) { var selector = getAttributeValue('target', trigger); if (selector) { return document.querySelector(selector); } } }, { key: 'defaultText', value: function defaultText(trigger) { return getAttributeValue('text', trigger); } }, { key: 'destroy', value: function destroy() { this.listener.destroy(); if (this.clipboardAction) { this.clipboardAction.destroy(); this.clipboardAction = null; } } }], [{ key: 'isSupported', value: function isSupported() { var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut']; var actions = typeof action === 'string' ? [action] : action; var support = !!document.queryCommandSupported; actions.forEach(function (action) { support = support && !!document.queryCommandSupported(action); }); return support; } }]); return Clipboard; }(_tinyEmitter2.default); /** * Helper function to retrieve attribute value. * @param {String} suffix * @param {Element} element */ function getAttributeValue(suffix, element) { var attribute = 'data-clipboard-' + suffix; if (!element.hasAttribute(attribute)) { return; } return element.getAttribute(attribute); } module.exports = Clipboard; }); }); var Clipboard = unwrapExports(clipboard); var WIN_PARAMS = 'scrollbars=0, resizable=1, menubar=0, left=100, top=100, width=550, height=440, toolbar=0, status=0'; // eslint-disable-line import/prefer-default-export function encodeParams(obj) { return Object.keys(obj).filter(function (k) { return typeof obj[k] !== 'undefined' && obj[k] !== ''; }).map(function (k) { return encodeURIComponent(k) + '=' + encodeURIComponent(obj[k]); }).join('&'); } function fbFeed() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var fbAppId = options.fbAppId, url = options.url, redirectUri = options.redirectUri; if (!fbAppId) { throw new Error('fbAppId is not defined'); } var params = encodeParams({ app_id: fbAppId, display: 'popup', redirect_uri: redirectUri, link: url }); return window.open('https://www.facebook.com/dialog/feed?' + params, '_blank', WIN_PARAMS); } function fbShare() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var fbAppId = options.fbAppId, url = options.url, hashtag = options.hashtag, redirectUri = options.redirectUri; if (!fbAppId) { throw new Error('fbAppId is not defined'); } var params = encodeParams({ app_id: fbAppId, display: 'popup', redirect_uri: redirectUri, href: url, hashtag: hashtag }); return window.open('https://www.facebook.com/dialog/share?' + params, '_blank', WIN_PARAMS); } function fbButton() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var url = options.url; if (!url) { throw new Error('url is not defined'); } var params = encodeParams({ kid_directed_site: '0', sdk: 'joey', u: url, display: 'popup', ref: 'plugin', src: 'share_button' }); return window.open('https://www.facebook.com/sharer/sharer.php?' + params, '_blank', WIN_PARAMS); } function gp() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var url = options.url; var params = encodeParams({ url: url }); return window.open('https://plus.google.com/share?' + params, '_blank', WIN_PARAMS); } function mail() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var url = options.url, title = options.title, description = options.description, image = options.image; var params = encodeParams({ share_url: url, title: title, description: description, imageurl: image }); return window.open('http://connect.mail.ru/share?' + params, '_blank', WIN_PARAMS); } function email() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var url = options.url, title = options.title, description = options.description; var body = (title || '') + '\r\n' + (description || '') + '\r\n' + (url || ''); var uri = 'mailto:?body=' + encodeURIComponent(body); return window.location.assign(uri); } function ok() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var url = options.url, title = options.title; var params = encodeParams({ 'st.cmd': 'addShare', 'st._surl': url, title: title }); return window.open('https://ok.ru/dk?' + params, '_blank', WIN_PARAMS); } function telegram() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var url = options.url, title = options.title; var params = encodeParams({ url: url, text: title }); return window.open('https://t.me/share/url?' + params, '_blank', WIN_PARAMS); } function tw() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var title = options.title, url = options.url, _options$hashtags = options.hashtags, hashtags = _options$hashtags === undefined ? [] : _options$hashtags; var params = encodeParams({ text: title, url: url, hashtags: hashtags.join(',') }); return window.open('https://twitter.com/intent/tweet?' + params, '_blank', WIN_PARAMS); } function reddit() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var url = options.url, title = options.title; var params = encodeParams({ url: url, title: title }); return window.open('https://www.reddit.com/submit?' + params, '_blank', WIN_PARAMS); } function pinterest() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var description = options.description, url = options.url, media = options.media; var params = encodeParams({ url: url, description: description, media: media }); return window.open('https://pinterest.com/pin/create/button/?' + params, '_blank', WIN_PARAMS); } function tumblr() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var url = options.url, title = options.title, caption = options.caption, _options$tags = options.tags, tags = _options$tags === undefined ? [] : _options$tags, _options$posttype = options.posttype, posttype = _options$posttype === undefined ? 'link' : _options$posttype; var params = encodeParams({ canonicalUrl: url, title: title, caption: caption, tags: tags.join(','), posttype: posttype }); return window.open('https://www.tumblr.com/widgets/share/tool?' + params, '_blank', WIN_PARAMS); } function isMobileSafari() { return !!window.navigator.userAgent.match(/Version\/[\d.]+.*Safari/); } function mobileShare(link) { return isMobileSafari() ? window.open(link) : window.location.assign(link); } function viber() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var url = options.url, title = options.title; if (!url && !title) { throw new Error('url and title not specified'); } var params = encodeParams({ text: [title, url].filter(function (item) { return item; }).join(' ') }); return mobileShare('viber://forward?' + params); } var VK_MAX_LENGTH = 80; function getUrl$1() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var url = options.url, image = options.image, isVkParse = options.isVkParse; var description = options.description, title = options.title; if (description && description.length > VK_MAX_LENGTH) { description = description.substr(0, VK_MAX_LENGTH) + '...'; } if (title && title.length > VK_MAX_LENGTH) { title = title.substr(0, VK_MAX_LENGTH) + '...'; } var params = void 0; if (isVkParse) { params = encodeParams({ url: url }); } else { params = encodeParams({ url: url, title: title, description: description, image: image, noparse: true }); } return 'https://vk.com/share.php?' + params; } function share() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return window.open(getUrl$1(options), '_blank', WIN_PARAMS); } function whatsapp() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var phone = options.phone, title = options.title, url = options.url; var params = encodeParams({ text: [title, url].filter(function (item) { return item; }).join(' '), phone: phone }); return window.open('https://api.whatsapp.com/send?' + params, '_blank', WIN_PARAMS); } function linkedin() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var title = options.title, url = options.url, description = options.description; var params = encodeParams({ title: title, summary: description, url: url }); return window.open('https://www.linkedin.com/shareArticle?mini=true&' + params, '_blank', WIN_PARAMS); } function messenger() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var fbAppId = options.fbAppId, url = options.url; if (!fbAppId) { throw new Error('fbAppId is not defined'); } var params = encodeParams({ app_id: fbAppId, link: url }); return window.location.assign('fb-messenger://share?' + params); } function line() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var title = options.title, url = options.url; if (!url) { throw new Error('url is not defined'); } var params = encodeURIComponent('' + url); if (title) { params = '' + encodeURIComponent(title + ' ') + params; } return window.open('https://line.me/R/msg/text/?' + params, '_blank', WIN_PARAMS); } var sharing = (Object.freeze || Object)({ fbFeed: fbFeed, fbShare: fbShare, fbButton: fbButton, gp: gp, mail: mail, email: email, ok: ok, telegram: telegram, tw: tw, reddit: reddit, pinterest: pinterest, tumblr: tumblr, viber: viber, getVkUrl: getUrl$1, vk: share, whatsapp: whatsapp, linkedin: linkedin, messenger: messenger, line: line }); /** * @return {boolean} */ function isTouchDevice() { return 'ontouchstart' in window || navigator.MaxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; } /** * Checks if the player opened on iOS or Android device. * * @return {boolean} */ function isMobileDevice() { return (/Android/.test(window.navigator.userAgent) || /iP(hone|ad|od)/i.test(window.navigator.userAgent) ); } var EXCLUDED_SOCIALS = ['whatsapp', 'viber', 'messenger']; /** * Filters socials list depending on platform. * * @param {Array} socials * List of socials to filter. * @return {Array} * Filtered list of socials. */ function filterSocials() { var socials = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var mobileVerification = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; return mobileVerification ? isMobileDevice() ? socials : socials.filter(function (social) { return !EXCLUDED_SOCIALS.includes(social); }) : socials; } var fbFeed$1 = "\n \n\n"; var tw$1 = "\n \n\n"; var reddit$1 = "\n \n\n"; var gp$1 = "\n \n\n"; var messenger$1 = "\n \n \n\n"; var linkedin$1 = "\n \n\n"; var vk = "\n \n\n"; var ok$1 = "\n \n\n"; var mail$1 = "\n \n\n"; var telegram$1 = "\n \n\n"; var whatsapp$1 = "\n \n\n"; var viber$1 = "\n \n\n"; var icons = { fbFeed: fbFeed$1, tw: tw$1, reddit: reddit$1, gp: gp$1, messenger: messenger$1, linkedin: linkedin$1, vk: vk, ok: ok$1, mail: mail$1, telegram: telegram$1, whatsapp: whatsapp$1, viber: viber$1 }; var ShareModalContent = function () { function ShareModalContent(player, options) { classCallCheck(this, ShareModalContent); this.player = player; this.options = options; this.socials = filterSocials(options.socials, options.mobileVerification); this.copyBtnTextClass = 'vjs-share__btn-text'; this.socialBtnClass = 'vjs-share__social'; this._createContent(); this._initToggle(); this._initClipboard(); this._initSharing(); } ShareModalContent.prototype.getContent = function getContent() { return this.content; }; ShareModalContent.prototype._createContent = function _createContent() { var copyBtn = '\n \n \n \n ' + this.player.localize('Copy') + '\n '; var wrapper = document.createElement('div'); wrapper.innerHTML = '
\n \n\n
\n \n \n\n \n \n
\n\n
\n
\n ' + this._getSocialItems().join('') + '\n
\n
\n
'; this.content = wrapper.firstChild; }; ShareModalContent.prototype._initClipboard = function _initClipboard() { var _this = this; var clipboard = new Clipboard('.vjs-share__btn', { target: function target(trigger) { return trigger.previousElementSibling; } }); clipboard.on('success', function (e) { var textContainer = e.trigger.querySelector('.' + _this.copyBtnTextClass); var restore = function restore() { textContainer.innerText = _this.player.localize('Copy'); e.clearSelection(); }; textContainer.innerText = _this.player.localize('Copied'); if (isTouchDevice()) { setTimeout(restore, 1000); } else { textContainer.parentElement.addEventListener('mouseleave', function () { setTimeout(restore, 300); }); } }); }; ShareModalContent.prototype._initSharing = function _initSharing() { var _this2 = this; var btns = this.content.querySelectorAll('.' + this.socialBtnClass); Array.from(btns).forEach(function (btn) { btn.addEventListener('click', function (e) { var social = e.currentTarget.getAttribute('data-social'); if (typeof sharing[social] === 'function') { sharing[social](_this2.socialOptions); } }); }); }; ShareModalContent.prototype._initToggle = function _initToggle() { var iconsList = this.content.querySelector('.vjs-share__socials'); if (this.socials.length > 10 || window.innerWidth <= 180 && this.socials.length > 6) { iconsList.style.height = 'calc((2em + 5px) * 2)'; } else { iconsList.classList.add('horizontal'); } }; ShareModalContent.prototype._getSocialItems = function _getSocialItems() { var socialItems = []; this.socials.forEach(function (social) { if (icons[social]) { socialItems.push('\n \n '); } }); return socialItems; }; createClass(ShareModalContent, [{ key: 'socialOptions', get: function get$$1() { var _options = this.options, url = _options.url, title = _options.title, description = _options.description, image = _options.image, fbAppId = _options.fbAppId, isVkParse = _options.isVkParse, redirectUri = _options.redirectUri; return { url: url, title: title, description: description, image: image, fbAppId: fbAppId, isVkParse: isVkParse, redirectUri: redirectUri }; } }]); return ShareModalContent; }(); var Component = videojs.getComponent('Component'); /** * Share overlay. */ var ShareOverlay = function (_Component) { inherits(ShareOverlay, _Component); function ShareOverlay(player, options) { classCallCheck(this, ShareOverlay); var _this = possibleConstructorReturn(this, _Component.call(this, player, options)); _this.player = player; _this.options = options; return _this; } ShareOverlay.prototype._createModal = function _createModal() { var content = new ShareModalContent(this.player, this.options).getContent(); this.modal = new ShareModal(this.player, { content: content, temporary: true }); this.el = this.modal.contentEl(); this.player.addChild(this.modal); }; ShareOverlay.prototype.open = function open() { this._createModal(); this.modal.open(); }; return ShareOverlay; }(Component); var Plugin = videojs$1.getPlugin('plugin'); // Default options for the plugin. /** * An advanced Video.js plugin. For more information on the API * * See: https://blog.videojs.com/feature-spotlight-advanced-plugins/ */ var Share = function (_Plugin) { inherits(Share, _Plugin); /** * Create a Share plugin instance. * * @param {Player} player * A Video.js Player instance. * * @param {Object} [options] * An optional options object. * * While not a core part of the Video.js plugin architecture, a * second argument of options is a convenient way to accept inputs * from your plugin's caller. */ function Share(player, options) { classCallCheck(this, Share); var _this = possibleConstructorReturn(this, _Plugin.call(this, player)); // the parent class will add player under this.player _this.options = videojs$1.mergeOptions(defaults, options); _this.player.ready(function () { _this.player.addClass('vjs-share'); player.addClass('vjs-videojs-share'); player.getChild('controlBar').addChild('ShareButton', options); player.addChild('ShareOverlay', options); }); return _this; } return Share; }(Plugin); // Define default values for the plugin's `state` object here. Share.defaultState = {}; // Include the version number. Share.VERSION = version; // Register the plugin with video.js. videojs$1.registerComponent('ShareButton', ShareButton); videojs$1.registerComponent('ShareOverlay', ShareOverlay); videojs$1.registerPlugin('share', Share); return Share; })));