diff --git a/frontend/config/webpack.config.dev.js b/frontend/config/webpack.config.dev.js index f666dab59e..4965ca03ab 100644 --- a/frontend/config/webpack.config.dev.js +++ b/frontend/config/webpack.config.dev.js @@ -149,31 +149,16 @@ module.exports = { require.resolve('react-dev-utils/webpackHotDevClient'), paths.appSrc + "/history-trash-file-view.js", ], + fileView: [ + require.resolve('./polyfills'), + require.resolve('react-dev-utils/webpackHotDevClient'), + paths.appSrc + "/file-view.js", + ], viewFileText: [ require.resolve('./polyfills'), require.resolve('react-dev-utils/webpackHotDevClient'), paths.appSrc + "/view-file-text.js", ], - viewFileImage: [ - require.resolve('./polyfills'), - require.resolve('react-dev-utils/webpackHotDevClient'), - paths.appSrc + "/view-file-image.js", - ], - viewFileXmind: [ - require.resolve('./polyfills'), - require.resolve('react-dev-utils/webpackHotDevClient'), - paths.appSrc + "/view-file-xmind.js", - ], - viewFileVideo: [ - require.resolve('./polyfills'), - require.resolve('react-dev-utils/webpackHotDevClient'), - paths.appSrc + "/view-file-video.js", - ], - viewFilePDF: [ - require.resolve('./polyfills'), - require.resolve('react-dev-utils/webpackHotDevClient'), - paths.appSrc + "/view-file-pdf.js", - ], viewFileDocument: [ require.resolve('./polyfills'), require.resolve('react-dev-utils/webpackHotDevClient'), @@ -184,21 +169,6 @@ module.exports = { require.resolve('react-dev-utils/webpackHotDevClient'), paths.appSrc + "/view-file-spreadsheet.js", ], - viewFileSVG: [ - require.resolve('./polyfills'), - require.resolve('react-dev-utils/webpackHotDevClient'), - paths.appSrc + "/view-file-svg.js", - ], - viewFileAudio: [ - require.resolve('./polyfills'), - require.resolve('react-dev-utils/webpackHotDevClient'), - paths.appSrc + "/view-file-audio.js", - ], - viewFileUnknown: [ - require.resolve('./polyfills'), - require.resolve('react-dev-utils/webpackHotDevClient'), - paths.appSrc + "/view-file-unknown.js", - ], settings: [ require.resolve('./polyfills'), require.resolve('react-dev-utils/webpackHotDevClient'), diff --git a/frontend/config/webpack.config.prod.js b/frontend/config/webpack.config.prod.js index 45cde571f6..50c0fdb53e 100644 --- a/frontend/config/webpack.config.prod.js +++ b/frontend/config/webpack.config.prod.js @@ -78,16 +78,10 @@ module.exports = { sharedFileViewSpreadsheet: [require.resolve('./polyfills'), paths.appSrc + "/shared-file-view-spreadsheet.js"], sharedFileViewUnknown: [require.resolve('./polyfills'), paths.appSrc + "/shared-file-view-unknown.js"], historyTrashFileView: [require.resolve('./polyfills'), paths.appSrc + "/history-trash-file-view.js"], + fileView: [require.resolve('./polyfills'), paths.appSrc + "/file-view.js"], viewFileText: [require.resolve('./polyfills'), paths.appSrc + "/view-file-text.js"], - viewFileImage: [require.resolve('./polyfills'), paths.appSrc + "/view-file-image.js"], - viewFileXmind: [require.resolve('./polyfills'), paths.appSrc + "/view-file-xmind.js"], - viewFileVideo: [require.resolve('./polyfills'), paths.appSrc + "/view-file-video.js"], - viewFilePDF: [require.resolve('./polyfills'), paths.appSrc + "/view-file-pdf.js"], viewFileDocument: [require.resolve('./polyfills'), paths.appSrc + "/view-file-document.js"], viewFileSpreadsheet: [require.resolve('./polyfills'), paths.appSrc + "/view-file-spreadsheet.js"], - viewFileSVG: [require.resolve('./polyfills'), paths.appSrc + "/view-file-svg.js"], - viewFileAudio: [require.resolve('./polyfills'), paths.appSrc + "/view-file-audio.js"], - viewFileUnknown: [require.resolve('./polyfills'), paths.appSrc + "/view-file-unknown.js"], settings: [require.resolve('./polyfills'), paths.appSrc + "/settings.js"], repoHistory: [require.resolve('./polyfills'), paths.appSrc + "/repo-history.js"], repoSnapshot: [require.resolve('./polyfills'), paths.appSrc + "/repo-snapshot.js"], diff --git a/frontend/src/components/file-content-view/image.js b/frontend/src/components/file-content-view/image.js index 395ffa3cb3..ca88426297 100644 --- a/frontend/src/components/file-content-view/image.js +++ b/frontend/src/components/file-content-view/image.js @@ -5,8 +5,11 @@ import { gettext, siteRoot } from '../../utils/constants'; import '../../css/image-file-view.css'; const { - repoID, - fileName, previousImage, nextImage, rawPath + repoID, repoEncrypted, + fileExt, filePath, fileName, + thumbnailSizeForOriginal, + previousImage, nextImage, rawPath, + xmindImageSrc // for xmind file } = window.app.pageOptions; let previousImageUrl, nextImageUrl; @@ -19,6 +22,13 @@ if (nextImage) { class FileContent extends React.Component { + constructor(props) { + super(props); + this.state = { + loadFailed: false + }; + } + componentDidMount() { document.addEventListener('keydown', (e) => { if (previousImage && e.keyCode == 37) { // press '<-' @@ -30,7 +40,28 @@ class FileContent extends React.Component { }); } + handleLoadFailure = () => { + this.setState({ + loadFailed: true + }); + } + render() { + if (this.state.loadFailed) { + return this.props.tip; + } + + // request thumbnails for some files + // only for 'file view'. not for 'history/trash file view' + let thumbnailURL = ''; + const fileExtList = ['tif', 'tiff', 'psd']; + if (this.props.canUseThumbnail && !repoEncrypted && fileExtList.includes(fileExt)) { + thumbnailURL = `${siteRoot}thumbnail/${repoID}/${thumbnailSizeForOriginal}${Utils.encodePath(filePath)}`; + } + + // for xmind file + const xmindSrc = xmindImageSrc ? `${siteRoot}${xmindImageSrc}` : ''; + return (
{previousImage && ( @@ -39,7 +70,7 @@ class FileContent extends React.Component { {nextImage && ( )} - {fileName} + {fileName}
); } diff --git a/frontend/src/file-view.js b/frontend/src/file-view.js new file mode 100644 index 0000000000..51690e675e --- /dev/null +++ b/frontend/src/file-view.js @@ -0,0 +1,55 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import FileView from './components/file-view/file-view'; +import FileViewTip from './components/file-view/file-view-tip'; +import Image from './components/file-content-view/image'; +import SVG from './components/file-content-view/svg'; +import PDF from './components/file-content-view/pdf'; +import Video from './components/file-content-view/video'; +import Audio from './components/file-content-view/audio'; + +const { + fileType, err +} = window.app.pageOptions; + +class InnerFileView extends React.Component { + + render() { + if (err) { + return ( + } /> + ); + } + + let content; + switch (fileType) { + case 'Image': + content = } canUseThumbnail={true} />; + break; + case 'XMind': + content = } />; + break; + case 'SVG': + content = ; + break; + case 'PDF': + content = ; + break; + case 'Video': + content =