2018-06-11 08:41:25 +02:00
|
|
|
// @flow
|
2019-01-16 05:33:06 +01:00
|
|
|
import { remote } from 'electron';
|
2020-08-12 17:44:28 +02:00
|
|
|
import React from 'react';
|
2021-07-07 09:10:28 +02:00
|
|
|
import { lazyImport } from 'util/lazyImport';
|
2020-01-06 19:32:35 +01:00
|
|
|
import classnames from 'classnames';
|
2020-04-01 20:43:50 +02:00
|
|
|
import * as RENDER_MODES from 'constants/file_render_modes';
|
2021-07-06 11:02:05 +02:00
|
|
|
import VideoViewer from 'component/viewers/videoViewer';
|
2019-09-06 02:26:03 +02:00
|
|
|
import { withRouter } from 'react-router-dom';
|
2019-08-02 08:28:14 +02:00
|
|
|
import fs from 'fs';
|
2020-11-22 22:33:37 +01:00
|
|
|
import analytics from 'analytics';
|
2019-04-03 07:56:58 +02:00
|
|
|
|
2019-11-07 20:39:22 +01:00
|
|
|
import DocumentViewer from 'component/viewers/documentViewer';
|
2020-04-01 20:43:50 +02:00
|
|
|
|
2019-11-26 20:08:34 +01:00
|
|
|
// @if TARGET='app'
|
2020-04-01 20:43:50 +02:00
|
|
|
// should match
|
2019-11-26 20:08:34 +01:00
|
|
|
import DocxViewer from 'component/viewers/docxViewer';
|
2019-11-07 20:39:22 +01:00
|
|
|
import ComicBookViewer from 'component/viewers/comicBookViewer';
|
|
|
|
import ThreeViewer from 'component/viewers/threeViewer';
|
2019-03-08 20:20:17 +01:00
|
|
|
// @endif
|
2018-06-11 08:41:25 +02:00
|
|
|
|
2021-07-07 09:10:28 +02:00
|
|
|
const AppViewer = lazyImport(() => import('component/viewers/appViewer' /* webpackChunkName: "appViewer" */));
|
|
|
|
const HtmlViewer = lazyImport(() => import('component/viewers/htmlViewer' /* webpackChunkName: "htmlViewer" */));
|
|
|
|
const ImageViewer = lazyImport(() => import('component/viewers/imageViewer' /* webpackChunkName: "imageViewer" */));
|
|
|
|
const PdfViewer = lazyImport(() => import('component/viewers/pdfViewer' /* webpackChunkName: "pdfViewer" */));
|
2021-06-11 08:06:29 +02:00
|
|
|
|
2018-06-11 08:41:25 +02:00
|
|
|
type Props = {
|
2019-08-06 05:25:33 +02:00
|
|
|
uri: string,
|
2019-08-02 08:28:14 +02:00
|
|
|
streamingUrl: string,
|
2020-01-27 22:37:54 +01:00
|
|
|
embedded?: boolean,
|
2019-08-02 08:28:14 +02:00
|
|
|
contentType: string,
|
2019-04-24 16:02:08 +02:00
|
|
|
claim: StreamClaim,
|
2018-06-11 08:41:25 +02:00
|
|
|
currentTheme: string,
|
2019-08-06 05:25:33 +02:00
|
|
|
downloadPath: string,
|
2020-04-01 20:43:50 +02:00
|
|
|
fileExtension: string,
|
2020-01-27 20:32:20 +01:00
|
|
|
autoplay: boolean,
|
2020-04-01 20:43:50 +02:00
|
|
|
renderMode: string,
|
2020-01-31 16:46:50 +01:00
|
|
|
thumbnail: string,
|
2020-05-05 20:02:12 +02:00
|
|
|
desktopPlayStartTime?: number,
|
2020-07-22 22:56:58 +02:00
|
|
|
className?: string,
|
2020-01-27 19:52:25 +01:00
|
|
|
};
|
|
|
|
|
2020-04-29 21:31:11 +02:00
|
|
|
class FileRender extends React.PureComponent<Props> {
|
2019-01-19 19:54:06 +01:00
|
|
|
constructor(props: Props) {
|
2019-01-16 05:33:06 +01:00
|
|
|
super(props);
|
|
|
|
|
2019-01-19 19:54:06 +01:00
|
|
|
(this: any).escapeListener = this.escapeListener.bind(this);
|
2019-01-16 05:33:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
componentDidMount() {
|
2020-11-22 22:33:37 +01:00
|
|
|
const { embedded } = this.props;
|
2019-01-16 05:33:06 +01:00
|
|
|
window.addEventListener('keydown', this.escapeListener, true);
|
2020-11-22 22:33:37 +01:00
|
|
|
analytics.playerLoadedEvent(embedded);
|
2019-01-16 05:33:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
componentWillUnmount() {
|
|
|
|
window.removeEventListener('keydown', this.escapeListener, true);
|
|
|
|
}
|
|
|
|
|
2019-01-19 19:54:06 +01:00
|
|
|
escapeListener(e: SyntheticKeyboardEvent<*>) {
|
2019-01-16 05:33:06 +01:00
|
|
|
if (e.keyCode === 27) {
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
|
|
this.exitFullscreen();
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
exitFullscreen() {
|
|
|
|
remote.getCurrentWindow().setFullScreen(false);
|
|
|
|
}
|
|
|
|
|
2018-06-13 06:06:53 +02:00
|
|
|
renderViewer() {
|
2020-05-05 20:02:12 +02:00
|
|
|
const {
|
|
|
|
currentTheme,
|
|
|
|
contentType,
|
|
|
|
downloadPath,
|
|
|
|
fileExtension,
|
|
|
|
streamingUrl,
|
|
|
|
uri,
|
|
|
|
renderMode,
|
|
|
|
desktopPlayStartTime,
|
|
|
|
} = this.props;
|
2020-04-01 20:43:50 +02:00
|
|
|
const source = streamingUrl;
|
|
|
|
|
|
|
|
switch (renderMode) {
|
|
|
|
case RENDER_MODES.AUDIO:
|
|
|
|
case RENDER_MODES.VIDEO:
|
2020-05-05 20:02:12 +02:00
|
|
|
return (
|
2021-07-06 11:02:05 +02:00
|
|
|
<VideoViewer
|
|
|
|
uri={uri}
|
|
|
|
source={source}
|
|
|
|
contentType={contentType}
|
|
|
|
desktopPlayStartTime={desktopPlayStartTime}
|
|
|
|
/>
|
2020-05-05 20:02:12 +02:00
|
|
|
);
|
2020-04-01 20:43:50 +02:00
|
|
|
case RENDER_MODES.IMAGE:
|
2021-06-11 08:06:29 +02:00
|
|
|
return (
|
|
|
|
<React.Suspense fallback={null}>
|
|
|
|
<ImageViewer uri={uri} source={source} />;
|
|
|
|
</React.Suspense>
|
|
|
|
);
|
2020-04-01 20:43:50 +02:00
|
|
|
case RENDER_MODES.HTML:
|
2021-06-11 08:06:29 +02:00
|
|
|
return (
|
|
|
|
<React.Suspense fallback={null}>
|
|
|
|
<HtmlViewer source={downloadPath || source} />;
|
|
|
|
</React.Suspense>
|
|
|
|
);
|
2020-04-01 20:43:50 +02:00
|
|
|
case RENDER_MODES.DOCUMENT:
|
|
|
|
case RENDER_MODES.MARKDOWN:
|
|
|
|
return (
|
|
|
|
<DocumentViewer
|
|
|
|
source={{
|
|
|
|
// @if TARGET='app'
|
2021-04-08 19:59:22 +02:00
|
|
|
file: (options) => fs.createReadStream(downloadPath, options),
|
2020-04-01 20:43:50 +02:00
|
|
|
// @endif
|
|
|
|
stream: source,
|
|
|
|
fileExtension,
|
|
|
|
contentType,
|
|
|
|
}}
|
|
|
|
renderMode={renderMode}
|
|
|
|
theme={currentTheme}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
case RENDER_MODES.DOCX:
|
|
|
|
return <DocxViewer source={downloadPath} />;
|
|
|
|
case RENDER_MODES.PDF:
|
2021-06-11 08:06:29 +02:00
|
|
|
return (
|
|
|
|
<React.Suspense fallback={null}>
|
|
|
|
<PdfViewer source={downloadPath || source} />;
|
|
|
|
</React.Suspense>
|
|
|
|
);
|
2020-04-01 20:43:50 +02:00
|
|
|
case RENDER_MODES.CAD:
|
2020-04-06 19:59:05 +02:00
|
|
|
return (
|
|
|
|
<ThreeViewer
|
|
|
|
source={{
|
2020-04-16 21:57:03 +02:00
|
|
|
fileType: fileExtension,
|
2020-04-06 19:59:05 +02:00
|
|
|
downloadPath,
|
|
|
|
}}
|
|
|
|
theme={currentTheme}
|
|
|
|
/>
|
|
|
|
);
|
2020-04-01 20:43:50 +02:00
|
|
|
case RENDER_MODES.COMIC:
|
2020-05-08 20:45:48 +02:00
|
|
|
return (
|
|
|
|
<ComicBookViewer
|
|
|
|
source={{
|
|
|
|
// @if TARGET='app'
|
2021-04-08 19:59:22 +02:00
|
|
|
file: (options) => fs.createReadStream(downloadPath, options),
|
2020-05-08 20:45:48 +02:00
|
|
|
// @endif
|
2020-07-22 22:56:58 +02:00
|
|
|
stream: source,
|
2020-05-08 20:45:48 +02:00
|
|
|
}}
|
|
|
|
theme={currentTheme}
|
2020-07-22 22:56:58 +02:00
|
|
|
/>
|
2020-05-08 20:45:48 +02:00
|
|
|
);
|
2020-04-01 20:43:50 +02:00
|
|
|
case RENDER_MODES.APPLICATION:
|
2021-06-11 08:06:29 +02:00
|
|
|
return (
|
|
|
|
<React.Suspense fallback={null}>
|
|
|
|
<AppViewer uri={uri} />;
|
|
|
|
</React.Suspense>
|
|
|
|
);
|
2018-08-02 06:56:17 +02:00
|
|
|
}
|
2019-03-21 14:59:31 +01:00
|
|
|
|
2020-04-01 20:43:50 +02:00
|
|
|
return null;
|
2018-06-11 08:41:25 +02:00
|
|
|
}
|
2020-04-01 20:43:50 +02:00
|
|
|
|
2018-06-11 08:41:25 +02:00
|
|
|
render() {
|
2020-07-22 22:56:58 +02:00
|
|
|
const { embedded, renderMode, className } = this.props;
|
2020-01-06 19:32:35 +01:00
|
|
|
|
2019-03-27 05:40:02 +01:00
|
|
|
return (
|
2020-01-27 22:37:54 +01:00
|
|
|
<div
|
2020-07-22 22:56:58 +02:00
|
|
|
className={classnames('file-render', className, {
|
2020-04-01 20:43:50 +02:00
|
|
|
'file-render--document': RENDER_MODES.TEXT_MODES.includes(renderMode) && !embedded,
|
2020-04-14 01:48:11 +02:00
|
|
|
'file-render--embed': embedded,
|
2020-10-20 19:10:02 +02:00
|
|
|
'file-render--video': renderMode === RENDER_MODES.VIDEO || renderMode === RENDER_MODES.AUDIO,
|
2020-01-27 22:37:54 +01:00
|
|
|
})}
|
|
|
|
>
|
2020-08-12 17:44:28 +02:00
|
|
|
{this.renderViewer()}
|
2019-03-27 05:40:02 +01:00
|
|
|
</div>
|
|
|
|
);
|
2018-06-11 08:41:25 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-06 02:26:03 +02:00
|
|
|
export default withRouter(FileRender);
|