UNPKG

@lahzenegar/video-react

Version:

Video-React is a web video player built from the ground up for an HTML5 world using React library.

379 lines (332 loc) 11 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _dom = require('../utils/dom'); var _browser = require('../utils/browser'); var browser = _interopRequireWildcard(_browser); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var propTypes = { clickable: _propTypes2.default.bool, dblclickable: _propTypes2.default.bool, manager: _propTypes2.default.object, actions: _propTypes2.default.object, player: _propTypes2.default.object, shortcuts: _propTypes2.default.array }; var defaultProps = { clickable: true, dblclickable: true }; var Shortcut = function (_Component) { (0, _inherits3.default)(Shortcut, _Component); function Shortcut(props, context) { (0, _classCallCheck3.default)(this, Shortcut); var _this = (0, _possibleConstructorReturn3.default)(this, (Shortcut.__proto__ || (0, _getPrototypeOf2.default)(Shortcut)).call(this, props, context)); _this.defaultShortcuts = [{ keyCode: 32, // spacebar handle: _this.togglePlay }, { keyCode: 75, // k handle: _this.togglePlay }, { keyCode: 70, // f handle: _this.toggleFullscreen }, { keyCode: 37, // Left arrow handle: function handle(player, actions) { if (!player.hasStarted) { return; } actions.replay(5, { action: 'replay-5', source: 'shortcut' }); // Go back 5 seconds } }, { keyCode: 74, // j handle: function handle(player, actions) { if (!player.hasStarted) { return; } actions.replay(10, { action: 'replay-10', source: 'shortcut' }); // Go back 10 seconds } }, { keyCode: 39, // Right arrow handle: function handle(player, actions) { if (!player.hasStarted) { return; } actions.forward(5, { action: 'forward-5', source: 'shortcut' }); // Go forward 5 seconds } }, { keyCode: 76, // l handle: function handle(player, actions) { if (!player.hasStarted) { return; } actions.forward(10, { action: 'forward-10', source: 'shortcut' }); // Go forward 10 seconds } }, { keyCode: 36, // Home handle: function handle(player, actions) { if (!player.hasStarted) { return; } actions.seek(0); // Go to beginning of video } }, { keyCode: 35, // End handle: function handle(player, actions) { if (!player.hasStarted) { return; } // Go to end of video actions.seek(player.duration); } }, { keyCode: 38, // Up arrow handle: function handle(player, actions) { // Increase volume 5% var v = player.volume + 0.05; if (v > 1) { v = 1; } actions.changeVolume(v, { action: 'volume-up', source: 'shortcut' }); } }, { keyCode: 40, // Down arrow handle: function handle(player, actions) { // Decrease volume 5% var v = player.volume - 0.05; if (v < 0) { v = 0; } var action = v > 0 ? 'volume-down' : 'volume-off'; actions.changeVolume(v, { action: action, source: 'shortcut' }); } }, { keyCode: 190, // Shift + > shift: true, handle: function handle(player, actions) { // Increase speed var playbackRate = player.playbackRate; if (playbackRate >= 1.25) { playbackRate = 1.5; } else if (playbackRate >= 1.0) { playbackRate = 1.25; } else if (playbackRate >= 0.75) { playbackRate = 1.0; } else if (playbackRate >= 0.5) { playbackRate = 0.75; } else if (playbackRate >= 0) { playbackRate = 0.5; } actions.changeRate(playbackRate, { action: 'fast-forward', source: 'shortcut' }); } }, { keyCode: 188, // Shift + < shift: true, handle: function handle(player, actions) { // Decrease speed var playbackRate = player.playbackRate; if (playbackRate <= 0.75) { playbackRate = 0.5; } else if (playbackRate <= 1.0) { playbackRate = 0.75; } else if (playbackRate <= 1.25) { playbackRate = 1.0; } else if (playbackRate <= 1.5) { playbackRate = 1.25; } actions.changeRate(playbackRate, { action: 'fast-rewind', source: 'shortcut' }); } }]; _this.shortcuts = [].concat((0, _toConsumableArray3.default)(_this.defaultShortcuts)); _this.mergeShortcuts = _this.mergeShortcuts.bind(_this); _this.handleKeyPress = _this.handleKeyPress.bind(_this); _this.handleClick = _this.handleClick.bind(_this); _this.handleDoubleClick = _this.handleDoubleClick.bind(_this); return _this; } (0, _createClass3.default)(Shortcut, [{ key: 'componentDidMount', value: function componentDidMount() { this.mergeShortcuts(); document.addEventListener('keydown', this.handleKeyPress); document.addEventListener('click', this.handleClick); document.addEventListener('dblclick', this.handleDoubleClick); } }, { key: 'componentDidUpdate', value: function componentDidUpdate(prevProps) { if (prevProps.shortcuts !== this.props.shortcuts) { this.mergeShortcuts(); } } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { document.removeEventListener('keydown', this.handleKeyPress); document.removeEventListener('click', this.handleClick); document.removeEventListener('dblclick', this.handleDoubleClick); } // merge the shortcuts from props }, { key: 'mergeShortcuts', value: function mergeShortcuts() { var gradeShortcut = function gradeShortcut(s) { var score = 0; var ps = ['ctrl', 'shift', 'alt']; ps.forEach(function (key) { if (s[key]) { score++; } }); return score; }; var shortcuts = (this.props.shortcuts || this.defaultShortcuts).filter(function (s) { return s.keyCode && s.handle && typeof s.handle === 'function'; }); this.shortcuts = [].concat((0, _toConsumableArray3.default)(shortcuts)).sort(function (a, b) { return gradeShortcut(b) - gradeShortcut(a); }); } }, { key: 'togglePlay', value: function togglePlay(player, actions) { if (player.paused) { actions.play({ action: 'play', source: 'shortcut' }); } else { actions.pause({ action: 'pause', source: 'shortcut' }); } } }, { key: 'toggleFullscreen', value: function toggleFullscreen(player, actions) { actions.toggleFullscreen(player); } }, { key: 'handleKeyPress', value: function handleKeyPress(e) { var _props = this.props, player = _props.player, actions = _props.actions; if (!player.isActive) { return; } if (document.activeElement && ((0, _dom.hasClass)(document.activeElement, 'video-react-control') || (0, _dom.hasClass)(document.activeElement, 'video-react-menu-button-active') // || hasClass(document.activeElement, 'video-react-slider') || (0, _dom.hasClass)(document.activeElement, 'video-react-big-play-button'))) { return; } var keyCode = e.keyCode || e.which; var ctrl = e.ctrlKey || e.metaKey; var shift = e.shiftKey; var alt = e.altKey; var shortcut = this.shortcuts.filter(function (s) { if (!s.keyCode || s.keyCode - keyCode !== 0) { return false; } if (s.ctrl !== undefined && s.ctrl !== ctrl || s.shift !== undefined && s.shift !== shift || s.alt !== undefined && s.alt !== alt) { return false; } return true; })[0]; if (shortcut) { shortcut.handle(player, actions); e.preventDefault(); } } // only if player is active and player is ready }, { key: 'canBeClicked', value: function canBeClicked(player, e) { if (!player.isActive || e.target.nodeName !== 'VIDEO' || player.readyState !== 4 || browser.IS_MOBILE) { return false; } return true; } }, { key: 'handleClick', value: function handleClick(e) { var _props2 = this.props, player = _props2.player, actions = _props2.actions, clickable = _props2.clickable; if (!this.canBeClicked(player, e) || !clickable) { return; } this.togglePlay(player, actions); // e.preventDefault(); } }, { key: 'handleDoubleClick', value: function handleDoubleClick(e) { var _props3 = this.props, player = _props3.player, actions = _props3.actions, dblclickable = _props3.dblclickable; if (!this.canBeClicked(player, e) || !dblclickable) { return; } this.toggleFullscreen(player, actions); // e.preventDefault(); } // this component dose not render anything // it's just for the key down event }, { key: 'render', value: function render() { return null; } }]); return Shortcut; }(_react.Component); exports.default = Shortcut; Shortcut.propTypes = propTypes; Shortcut.defaultProps = defaultProps; Shortcut.displayName = 'Shortcut';