lbry-desktop/ui/component/viewers/documentViewer.jsx

117 lines
2.9 KiB
React
Raw Normal View History

// @flow
import React from 'react';
import LoadingScreen from 'component/common/loading-screen';
import MarkdownPreview from 'component/common/markdown-preview';
2019-11-07 20:39:22 +01:00
import CodeViewer from 'component/viewers/codeViewer';
import * as https from 'https';
2019-03-27 05:40:02 +01:00
type Props = {
2018-07-28 03:42:35 +02:00
theme: string,
source: {
file: (?string) => any,
stream: string,
fileType: string,
contentType: string,
},
};
type State = {
error: boolean,
loading: boolean,
content: ?string,
};
class DocumentViewer extends React.PureComponent<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
error: false,
loading: true,
content: null,
};
}
componentDidMount() {
const { source } = this.props;
// @if TARGET='app'
if (source && source.file) {
const stream = source.file('utf8');
let data = '';
stream.on('data', chunk => {
data += chunk;
});
stream.on('end', () => {
this.setState({ content: data, loading: false });
});
stream.on('error', () => {
this.setState({ error: true, loading: false });
});
}
// @endif
// @if TARGET='web'
if (source && source.stream) {
https.get(
source.stream,
function(response) {
if (response.statusCode === 200) {
let body = '';
let i = 0;
response.on('data', function(chunk) {
i = i + 1;
body += chunk;
});
response.on(
'end',
function() {
this.setState({ content: body, loading: false });
}.bind(this)
);
} else {
this.setState({ error: true, loading: false });
}
}.bind(this)
);
}
// @endif
}
renderDocument() {
2018-07-27 02:24:00 +02:00
let viewer = null;
const { content } = this.state;
2018-07-28 03:42:35 +02:00
const { source, theme } = this.props;
const { fileType, contentType } = source;
2018-07-27 02:24:00 +02:00
const markdownType = ['md', 'markdown'];
if (markdownType.includes(fileType) || contentType === 'text/markdown' || contentType === 'text/md') {
2018-07-27 02:24:00 +02:00
// Render markdown
viewer = <MarkdownPreview content={content} promptLinks />;
} else {
2018-07-27 02:24:00 +02:00
// Render plain text
2019-11-07 20:39:22 +01:00
viewer = <CodeViewer value={content} contentType={contentType} theme={theme} />;
}
2018-07-27 02:24:00 +02:00
return viewer;
}
render() {
const { error, loading, content } = this.state;
const isReady = content && !error;
const loadingMessage = __('Rendering document.');
2018-07-28 03:54:06 +02:00
const errorMessage = __("Sorry, looks like we can't load the document.");
return (
2019-08-13 07:35:13 +02:00
<div className="file-render__viewer--document">
{loading && !error && <LoadingScreen status={loadingMessage} spinner />}
{error && <LoadingScreen status={errorMessage} spinner={!error} />}
2019-11-07 20:39:22 +01:00
{isReady && this.renderDocument()}
</div>
);
}
}
export default DocumentViewer;