UNPKG

@taubi19/react-sound

Version:

React Sound component using soundmanager2

279 lines (236 loc) 8.41 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); 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 _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 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 pendingCalls = []; var initialized = false; var soundManager = void 0; // Allow server side rendering if (typeof window !== 'undefined') { if (process.env.NODE_ENV !== 'production') { var _require = require('soundmanager2'); soundManager = _require.soundManager; } else { var _require2 = require('soundmanager2/script/soundmanager2-nodebug'); soundManager = _require2.soundManager; } soundManager.onready(function () { pendingCalls.slice().forEach(function (cb) { return cb(); }); }); } function _createSound(options, cb) { if (soundManager.ok()) { cb(soundManager.createSound(options)); return function () {}; } else { if (!initialized) { initialized = true; soundManager.beginDelayedInit(); } var call = function call() { cb(soundManager.createSound(options)); }; pendingCalls.push(call); return function () { pendingCalls.splice(pendingCalls.indexOf(call), 1); }; } } function noop() {} var playStatuses = { PLAYING: 'PLAYING', STOPPED: 'STOPPED', PAUSED: 'PAUSED' }; var Sound = function (_React$Component) { _inherits(Sound, _React$Component); function Sound() { _classCallCheck(this, Sound); return _possibleConstructorReturn(this, (Sound.__proto__ || Object.getPrototypeOf(Sound)).apply(this, arguments)); } _createClass(Sound, [{ key: 'componentDidMount', value: function componentDidMount() { var _this2 = this; this.createSound(function (sound) { return _this2.updateSound(sound); }); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { this.removeSound(); } }, { key: 'componentDidUpdate', value: function componentDidUpdate(prevProps) { var _this3 = this; if (this.props.url !== prevProps.url) { this.createSound(function (sound) { return _this3.updateSound(sound, prevProps); }); } else { this.updateSound(this.sound, prevProps); } } }, { key: 'updateSound', value: function updateSound(sound) { var prevProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (!sound) { return; } if (this.props.playStatus === playStatuses.PLAYING) { if (sound.playState === 0) { sound.play(); } if (sound.paused) { sound.resume(); } } else if (this.props.playStatus === playStatuses.STOPPED) { if (sound.playState !== 0) { sound.stop(); } } else { // this.props.playStatus === playStatuses.PAUSED if (!sound.paused) { sound.pause(); } } if (this.props.playFromPosition != null) { if (this.props.playFromPosition !== prevProps.playFromPosition) { sound.setPosition(this.props.playFromPosition); } } if (this.props.position != null) { if (sound.position !== this.props.position && Math.round(sound.position) !== Math.round(this.props.position)) { sound.setPosition(this.props.position); } } if (this.props.volume !== prevProps.volume) { sound.setVolume(this.props.volume); } if (this.props.playbackRate !== prevProps.playbackRate) { sound.setPlaybackRate(this.props.playbackRate); } } }, { key: 'createSound', value: function createSound(callback) { var _this4 = this; this.removeSound(); var instance = this; if (!this.props.url) { return; } this.stopCreatingSound = _createSound({ url: this.props.url, autoLoad: this.props.autoLoad, volume: this.props.volume, position: this.props.playFromPosition || this.props.position || 0, playbackRate: this.props.playbackRate, whileloading: function whileloading() { instance.props.onLoading(this); }, whileplaying: function whileplaying() { instance.props.onPlaying(this); }, onerror: function onerror(errorCode, description) { instance.props.onError(errorCode, description, this); }, onload: function onload() { instance.props.onLoad(this); }, onpause: function onpause() { instance.props.onPause(this); }, onresume: function onresume() { instance.props.onResume(this); }, onstop: function onstop() { instance.props.onStop(this); }, onfinish: function onfinish() { if (instance.props.loop && instance.props.playStatus === playStatuses.PLAYING) { instance.sound.play(); } else { instance.props.onFinishedPlaying(); } }, onbufferchange: function onbufferchange() { instance.props.onBufferChange(this.isBuffering); } }, function (sound) { _this4.sound = sound; callback(sound); }); } }, { key: 'removeSound', value: function removeSound() { if (this.stopCreatingSound) { this.stopCreatingSound(); delete this.stopCreatingSound; } if (this.sound) { try { this.sound.destruct(); } catch (e) {} // eslint-disable-line delete this.sound; } } }, { key: 'render', value: function render() { return null; } }]); return Sound; }(_react2.default.Component); Sound.status = playStatuses; Sound.propTypes = { url: _propTypes2.default.string.isRequired, playStatus: _propTypes2.default.oneOf(Object.keys(playStatuses)).isRequired, position: _propTypes2.default.number, playFromPosition: _propTypes2.default.number, volume: _propTypes2.default.number, playbackRate: _propTypes2.default.number, onError: _propTypes2.default.func, onLoading: _propTypes2.default.func, onLoad: _propTypes2.default.func, onPlaying: _propTypes2.default.func, onPause: _propTypes2.default.func, onResume: _propTypes2.default.func, onStop: _propTypes2.default.func, onFinishedPlaying: _propTypes2.default.func, onBufferChange: _propTypes2.default.func, autoLoad: _propTypes2.default.bool, loop: _propTypes2.default.bool }; Sound.defaultProps = { volume: 100, playbackRate: 1, onError: noop, onLoading: noop, onPlaying: noop, onLoad: noop, onPause: noop, onResume: noop, onStop: noop, onFinishedPlaying: noop, onBufferChange: noop, autoLoad: false, loop: false }; exports.default = Sound;