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 (
)
}
}
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 (
);
}
}
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 (
);
}
}