import React from 'react'; import InjectInHeadMixin from '../../mixins/inject_in_head_mixin'; /** * This is the component that implements display-specific functionality. * * ResourceViewer handles the following mimetypes: * - image * - video * - audio * - pdf * - other */ let Image = React.createClass({ render() { return (); } }); let Video = React.createClass({ propTypes: { preview: React.PropTypes.string.isRequired, url: React.PropTypes.string.isRequired, extraData: React.PropTypes.array.isRequired }, mixins: [InjectInHeadMixin], getInitialState() { return { ready: false }; }, componentDidMount() { this.inject('http://code.jquery.com/jquery-2.1.4.min.js') .then(() => Promise.all([ this.inject('https://cdnjs.cloudflare.com/ajax/libs/mediaelement/2.17.0/mediaelement-and-player.min.js'), this.inject('https://cdnjs.cloudflare.com/ajax/libs/mediaelement/2.17.0/mediaelementplayer.min.css') ]).then(() => { this.setState({ready: true}); })); }, render() { if (this.state.ready) { return ( ); } else { return( ); } } }); let resourceMap = { 'image': Image, 'video': Video } let ResourceViewer = React.createClass({ propTypes: { mimetype: React.PropTypes.oneOf(['image', 'video', 'audio', 'pdf', 'other']).isRequired, preview: React.PropTypes.string.isRequired, url: React.PropTypes.string.isRequired }, render() { let Component = resourceMap[this.props.mimetype] || Image; return (
); } }); export default ResourceViewer;