diff --git a/.eslintrc b/.eslintrc index 2312f48f..d41c0a2a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -22,7 +22,7 @@ "react/jsx-sort-props": 0, "react/jsx-uses-react": 1, "react/jsx-uses-vars": 1, - "react/no-did-mount-set-state": 1, + "react/no-did-mount-set-state": [1, "allow-in-func"], "react/no-did-update-set-state": 1, "react/no-multi-comp": 0, "react/no-unknown-property": 1, @@ -58,4 +58,4 @@ "superInFunctions": 1, "templateStrings": 1 } -} \ No newline at end of file +} diff --git a/js/components/ascribe_media/media_player.js b/js/components/ascribe_media/media_player.js index e767a800..a7e56fb7 100644 --- a/js/components/ascribe_media/media_player.js +++ b/js/components/ascribe_media/media_player.js @@ -103,14 +103,17 @@ let Video = React.createClass({ * ReactJS is responsible for DOM manipulation but VideoJS updates the DOM * to install itself to display the video, therefore ReactJS complains that we are * changing the DOM under its feet. + * The component supports a fall-back to HTML5 video tag. * * What we do is the following: - * 1) set `state.ready = false` - * 2) render the cover using the `` component (because ready is false) + * 1) set `state.libraryLoaded = null` (state.libraryLoaded can be in three states: `null` + * if we don't know anything about it, `true` if the external library has been loaded, + * `false` if we failed to load the external library) + * 2) render the cover using the `` component (because libraryLoaded is null) * 3) on `componentDidMount`, we load the external `css` and `js` resources using * the `InjectInHeadMixin`, attaching a function to `Promise.then` to change - * `state.ready` to true - * 4) when the promise is succesfully resolved, we change `state.ready` triggering + * `state.libraryLoaded` to true + * 4) when the promise is succesfully resolved, we change `state.libraryLoaded` triggering * a re-render * 5) the new render calls `prepareVideoHTML` to get the raw HTML of the video tag * (that will be later processed and expanded by VideoJS) @@ -129,18 +132,19 @@ let Video = React.createClass({ mixins: [InjectInHeadMixin], getInitialState() { - return { ready: false, videoMounted: false }; + return { libraryLoaded: null, videoMounted: false }; }, componentDidMount() { Q.all([ this.inject('//vjs.zencdn.net/4.12/video-js.css'), - this.inject('//vjs.zencdn.net/4.12/video.js') - ]).then(this.ready); + this.inject('//vjs.zencdn.net/4.12/video.js')]) + .then(() => this.setState({libraryLoaded: true})) + .fail(() => this.setState({libraryLoaded: false})); }, componentDidUpdate() { - if (this.state.ready && !this.state.videoMounted) { + if (this.state.libraryLoaded && !this.state.videoMounted) { window.videojs('#mainvideo'); /* eslint-disable */ this.setState({videoMounted: true}); @@ -149,11 +153,9 @@ let Video = React.createClass({ }, componentWillUnmount() { - window.videojs('#mainvideo').dispose(); - }, - - ready() { - this.setState({ready: true, videoMounted: false}); + if (this.state.videoMounted) { + window.videojs('#mainvideo').dispose(); + } }, prepareVideoHTML() { @@ -171,7 +173,7 @@ let Video = React.createClass({ }, render() { - if (this.state.ready) { + if (this.state.libraryLoaded !== null) { return (
);