import React from 'react'; import { BreadCrumb, Editor } from '../components/'; import { debounce, throttle, NgIf, Loader, Error, Fab, Icon, Container } from '../utilities/'; import { Files, opener, EventReceiver, EventEmitter } from '../data/'; import Path from 'path'; import { theme } from '../utilities'; import WaveSurfer from 'wavesurfer.js'; import videojs from 'video.js'; @EventReceiver export class ViewerPage extends React.Component { constructor(props){ super(props); this.state = { path: props.match.url.replace('/view', ''), filename: Path.basename(props.match.url.replace('/view', '')) || 'untitled.dat', opener: null, data: '', needSaving: false, isSaving: false, height: null, loading: true, error: false }; this.resetHeight = debounce(this.resetHeight.bind(this), 100); this.props.subscribe('file.select', this.onPathUpdate.bind(this)); } componentWillUnmount() { this.props.unsubscribe('file.select') window.removeEventListener("resize", this.resetHeight); } save(file){ this.setState({isSaving: true}) Files.save(this.state.path, file) .then(() => { this.setState({isSaving: false}) this.setState({needSaving: false}) }) .catch((err) => { if(err && err.code === 'CANCELLED'){ return } this.setState({isSaving: false}) let message = "Oups, something went wrong" if(err.message){ message += ':\n'+err.message } alert(message); }); } onPathUpdate(path){ this.props.history.push('/files'+path) } needSaving(bool){ this.setState({needSaving: bool}) } componentDidMount(){ this.resetHeight(); window.addEventListener("resize", this.resetHeight); this.setState({loading: true}); let app = opener(this.state.path); if(app === 'editor'){ Files.cat(this.state.path).then((content) => { this.setState({data: content, loading: false, opener: app}); }).catch(err => { if(err && err.code === 'CANCELLED'){ return } if(err.code === 'BINARY_FILE'){ Files.url(this.state.path).then((url) => { this.setState({data: url, loading: false, opener: 'download'}); }).catch(err => { this.setState({error: err}); }); }else{ this.setState({error: err}); } }); }else{ Files.url(this.state.path).then((url) => { this.setState({data: url, loading: false, opener: app}); }).catch(err => { if(err && err.code === 'CANCELLED'){ return } this.setState({error: err}); }); } } resetHeight(){ this.setState({ height: document.body.clientHeight - document.querySelector('.breadcrumb').offsetHeight }); } render() { let style = {height: '100%'}; return (
); } } class IDE extends React.Component { constructor(props){ super(props); this.state = { contentToSave: null } } onContentUpdate(text){ this.props.needSaving(true); this.setState({contentToSave: text}) } save(){ let file, blob = new window.Blob([this.state.contentToSave], {type : 'text/plain'}); try{ file = new window.File([blob], 'test.txt'); }catch(err){ // for crappy browser: // https://stackoverflow.com/questions/33821631/alternative-for-file-constructor-for-safari file = blob; } this.props.onSave(file); } render(){ return (
); } } const ImageViewer = (props) => { return (
) } const PDFViewer = (props) => { return (
); } class AudioPlayer extends React.Component { constructor(props){ super(props); this.state = { wafesurfer: null, loading: true, isPlaying: true, error: null } this.toggle = this.toggle.bind(this); window.addEventListener('keypress', this.toggle); } componentDidMount(){ let $el = document.querySelector('.player'); var wavesurfer = WaveSurfer.create({ container: '#waveform', waveColor: '#323639', progressColor: '#6f6f6f', cursorColor: '#323639', cursorWidth: 2, height: 250, barWidth: 1 }); this.setState({wavesurfer: wavesurfer}); wavesurfer.on('ready', () => { this.setState({loading: false}); if(this.state.isPlaying === true){ wavesurfer.play(); } }); wavesurfer.on('error', (err) => { this.setState({error: err, loading: false}); }); wavesurfer.load(this.props.data); } componentWillUnmount(){ if(this.state.wavesurfer){ this.state.wavesurfer.destroy(); } window.removeEventListener('keypress', this.toggle); } toggle(){ if(this.state.isPlaying === true){ this.setState({isPlaying: false}); this.state.wavesurfer.pause(); }else{ this.setState({isPlaying: true}); this.state.wavesurfer.play(); } } onPlay(e){ e.preventDefault(); e.stopPropagation(); this.setState({isPlaying: true}) this.state.wavesurfer.play(); } onPause(e){ e.preventDefault(); e.stopPropagation(); this.setState({isPlaying: false}); this.state.wavesurfer.pause(); } render(){ return (
{this.state.error}
) } } class VideoPlayer extends React.Component { constructor(props){ super(props); } componentDidMount(){ this.player = videojs(this.videoNode, { //autoplay: true, controls: true, aspectRatio: '16:9', fluid: false, sources: [{ src: this.props.data }] }, function onPlayerReady() { //console.log('onPlayerReady', this) }); } componentWillUnmount() { if (this.player) { this.player.dispose() } } render(){ return (
) } } class MenuBar extends React.Component{ constructor(props){ super(props); this.state = {loading: false, id: null} } onDownloadRequest(){ this.setState({ loading: true, id: window.setInterval(function(){ if(document.cookie){ this.setState({loading: false}) window.clearInterval(this.state.id); } }.bind(this), 80) }) } componentWillUnmount(){ window.clearInterval(this.state.id) } render(){ return (
{this.props.title}
); } } class FileDownloader extends React.Component{ constructor(props){ super(props) this.state = {loading: false, id: null}; } onClick(){ this.setState({ loading: true, id: window.setInterval(function(){ if(document.cookie){ this.setState({loading: false}) window.clearInterval(this.state.id); } }.bind(this), 80) }); } componentWillUnmount(){ window.clearInterval(this.state.id) } render(){ return (
DOWNLOAD
); } }