import React from 'react'; const ThumbnailPreview = ({dataUrl}) => { const divStyle = { width : '30%', margin : '1%', display: 'inline-block', border : 'solid 1px black', } const imageStyle = { width : '100%', display: 'block', } return (
{ dataUrl ? ( image preview here ) : (

loading...

)}
); } class PublishThumbnailInput extends React.Component { constructor (props) { super(props); this.state = { videoPreviewSrc: null, thumbnailError : null, thumbnailInput : '', } this.handleInput = this.handleInput.bind(this); this.updateVideoThumb = this.updateVideoThumb.bind(this); } componentDidMount () { this.setClaimAndThumbailUrl(this.props.publishClaim); this.previewThumbnails(this.props.publishFile); } componentWillReceiveProps (nextProps) { // if (nextProps.publishFile !== this.publishFile) { // this.createThumbnails(nextProps.publishFile); // } if (nextProps.publishClaim !== this.props.publishClaim) { console.log(nextProps.publishClaim, this.props.publishClaim); this.setClaimAndThumbailUrl(nextProps.publishClaim); } } previewThumbnails (videoFile) { console.log('video file:', videoFile); this.loadFileAndReturnThumbnails(videoFile) .then((thumbnail) => { console.log('thumbs:', thumbnail); this.selectVideoThumb(thumbnail); this.setPossibleThumbnailFiles(thumbnail, thumbnail, thumbnail); }) .catch(error => { console.log('error:', error); this.setState({error: error.message}); }); } loadFileAndReturnThumbnails (file) { return new Promise((resolve, reject) => { var fileReader = new FileReader(); fileReader.onload = () => { console.log('file loaded'); const blob = new Blob([fileReader.result], {type: file.type}); const url = URL.createObjectURL(blob); let video = document.createElement('video'); const snapShot = (time) => { console.log('creating thubmnail @', time); // video.currentTime = time; let canvas = document.createElement('canvas'); canvas.width = video.videoWidth; canvas.height = video.videoHeight; canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height); const imageDataUrl = canvas.toDataURL(); const success = imageDataUrl.length > 1000; if (success) { return imageDataUrl; } return success; } const loadedata = () => { console.log('loadeddata'); console.log('readyState', video.readyState); const duration = video.duration; console.log('readyState', duration); const thumb = snapShot(duration / 2); resolve(thumb); } video.addEventListener('loadeddata', loadedata); video.preload = 'metadata'; video.src = url; // Load video in Safari / IE11 video.muted = true; video.playsInline = true; video.play(); }; fileReader.readAsArrayBuffer(file); }); } selectVideoThumb (dataUrl) { // update this.props.selectedFile this.props.onThumbnailFileSelect(dataUrl); } setPossibleThumbnailFiles (fileOne, fileTwo, fileThree) { console.log('updating thumbnail file options'); this.props.onThumbnailFileOptionsChange(fileOne, fileTwo, fileThree); } setClaimAndThumbailUrl (claim) { // set thumbnail claim based on publish claim name const url = `${this.props.host}/${this.props.channel}/${claim}.jpeg`; this.props.onThumbnailClaimChange(claim, url); } render () { return (

{this.state.error}

{this.props.potentialFiles.map((file, index) => )}
); } } export default PublishThumbnailInput;