import React from "react"; import Path from "path"; import "./viewerpage.scss"; import "./error.scss"; import { Files } from "../model/"; import { BreadCrumb, Bundle, NgIf, Loader, EventReceiver, LoggedInOnly, ErrorPage, } from "../components/"; import { opener, notify } from "../helpers/"; import { FileDownloader, ImageViewer, PDFViewer, FormViewer } from "./viewerpage/"; const VideoPlayer = (props) => ( {(Comp) => } ); const IDE = (props) => ( {(Comp) => } ); const AudioPlayer = (props) => ( {(Comp) => } ); const Appframe = (props) => ( {(Comp) => } ); export class ViewerPageComponent extends React.Component { constructor(props) { super(props); this.state = { path: props.match.url.replace("/view", "").replace(/%23/g, "#") + (location.hash || ""), url: null, filename: Path.basename(props.match.url.replace("/view", "")) || "untitled.dat", opener: null, content: null, needSaving: false, isSaving: false, loading: true, application_arguments: null, }; this.props.subscribe("file.select", this.onPathUpdate.bind(this)); } UNSAFE_componentWillReceiveProps(props) { this.setState({ path: props.match.url.replace("/view", "").replace(/%23/g, "#") + (location.hash || ""), filename: Path.basename(props.match.url.replace("/view", "")) || "untitled.dat", }, () => this.componentDidMount()); } componentDidMount() { const metadata = () => { return new Promise((done, err) => { const [app_opener, app_args] = opener(this.state.path); Files.url(this.state.path).then((url) => { this.setState({ url: url, opener: app_opener, application_arguments: app_args, }, () => done(app_opener)); }).catch((error) => { this.props.error(error); err(error); }); }); }; const data_fetch = (app) => { if (app === "editor" || app === "form") { return Promise.all([ Files.cat(this.state.path), Files.options(this.state.path), ]).then((d) => { const [content, options] = d; this.setState({ content: content, loading: false, acl: options["allow"], }); }).catch((err) => { if (err && err.code === "BINARY_FILE") { this.setState({ opener: "download", loading: false }); } else { this.props.error(err); } }); } this.setState({ loading: false }); }; return metadata().then(data_fetch); } componentWillUnmount() { this.props.unsubscribe("file.select"); } save(file) { this.setState({ isSaving: true }); return Files.save(this.state.path, file) .then(() => { this.setState({ isSaving: false, needSaving: false }); return Promise.resolve(); }) .then(() => { return new Promise((done, err) => { const reader = new FileReader(); reader.onload = () => { this.setState({ content: reader.result }); done(); }; reader.onerror = (e) => { err({ message: "Internal error 500" }); }; reader.readAsText(file); }); }) .catch((err) => { if (err && err.code === "CANCELLED") return; this.setState({ isSaving: false }); notify.send(err, "error"); return Promise.reject(err); }); } onPathUpdate(path) { this.props.history.push("/files"+path); } needSaving(bool) { return new Promise((done) => { this.setState({ needSaving: bool }, done); }); } render() { return (
); } } export const ViewerPage = ErrorPage(LoggedInOnly(EventReceiver(ViewerPageComponent)));