@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
JavaScript
;
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';