'use strict'; import React from 'react'; import InjectInHeadMixin from '../../mixins/inject_in_head_mixin'; import Panel from 'react-bootstrap/lib/Panel'; /** * This is the component that implements display-specific functionality. * * ResourceViewer handles the following mimetypes: * - image * - video * - audio * - pdf * - other */ let Other = React.createClass({ propTypes: { url: React.PropTypes.string.isRequired }, render() { let ext = this.props.url.split('.').pop(); return (

.{ext}

); } }); let Image = React.createClass({ propTypes: { url: React.PropTypes.string.isRequired, preview: React.PropTypes.string.isRequired }, mixins: [InjectInHeadMixin], componentDidMount() { this.inject('http://code.jquery.com/jquery-2.1.4.min.js') .then(() => Promise.all([ this.inject('/static/thirdparty/shmui/shmui.css'), this.inject('/static/thirdparty/shmui/jquery.shmui.js') ]).then(() => { window.jQuery('.shmui-ascribe').shmui(); })); }, 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.ready)); }, ready() { this.setState({ready: true}); }, render() { if (this.state.ready) { return ( ); } else { return ( ); } } }); let resourceMap = { 'image': Image, 'video': Video, 'other': Other }; let MediaPlayer = React.createClass({ propTypes: { mimetype: React.PropTypes.oneOf(['image', 'video', 'audio', 'pdf', 'other']).isRequired, preview: React.PropTypes.string.isRequired, url: React.PropTypes.string.isRequired, extraData: React.PropTypes.array }, render() { let Component = resourceMap[this.props.mimetype] || Other; return (
); } }); export default MediaPlayer;