1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-15 09:04:04 +02:00
joplin/ReactNativeClient/lib/components/note-body-viewer.js

90 lines
2.3 KiB
JavaScript
Raw Normal View History

const React = require('react'); const Component = React.Component;
2017-11-19 17:19:36 +02:00
const { Platform, WebView, View, Linking } = require('react-native');
const { globalStyle } = require('lib/components/global-style.js');
const { Resource } = require('lib/models/resource.js');
const { reg } = require('lib/registry.js');
const MdToHtml = require('lib/MdToHtml.js');
2017-07-30 21:51:18 +02:00
class NoteBodyViewer extends Component {
constructor() {
super();
this.state = {
resources: {},
2017-08-21 22:46:31 +02:00
webViewLoaded: false,
2017-07-30 21:51:18 +02:00
}
2017-08-21 22:46:31 +02:00
this.isMounted_ = false;
2017-07-30 21:51:18 +02:00
}
2017-08-21 22:46:31 +02:00
componentWillMount() {
this.mdToHtml_ = new MdToHtml({ supportsResourceLinks: false });
2017-08-21 22:46:31 +02:00
this.isMounted_ = true;
}
componentWillUnmount() {
this.mdToHtml_ = null;
2017-08-21 22:46:31 +02:00
this.isMounted_ = false;
}
onLoadEnd() {
if (this.state.webViewLoaded) return;
// Need to display after a delay to avoid a white flash before
// the content is displayed.
setTimeout(() => {
if (!this.isMounted_) return;
this.setState({ webViewLoaded: true });
2017-09-10 18:57:06 +02:00
}, 100);
2017-08-21 22:46:31 +02:00
}
2017-07-30 21:51:18 +02:00
render() {
const note = this.props.note;
const style = this.props.style;
const onCheckboxChange = this.props.onCheckboxChange;
const mdOptions = {
onResourceLoaded: () => {
this.forceUpdate();
},
};
const html = this.mdToHtml_.render(note ? note.body : '', this.props.webViewStyle, mdOptions);
2017-08-21 22:46:31 +02:00
let webViewStyle = {}
2017-11-19 17:19:36 +02:00
// On iOS, the onLoadEnd() event is never fired so always
// display the webview (don't do the little trick
// to avoid the white flash).
if (Platform.OS !== 'ios') {
webViewStyle.opacity = this.state.webViewLoaded ? 1 : 0.01;
}
2017-07-30 21:51:18 +02:00
return (
<View style={style}>
<WebView
2017-11-19 17:19:36 +02:00
scalesPageToFit={false}
2017-08-21 22:46:31 +02:00
style={webViewStyle}
source={{ html: html }}
onLoadEnd={() => this.onLoadEnd()}
onError={(e) => reg.logger().error('WebView error', e) }
2017-07-30 21:51:18 +02:00
onMessage={(event) => {
let msg = event.nativeEvent.data;
if (msg.indexOf('checkboxclick:') === 0) {
const newBody = this.mdToHtml_.handleCheckboxClick(msg, note.body);
2017-07-30 21:51:18 +02:00
if (onCheckboxChange) onCheckboxChange(newBody);
} else if (msg.indexOf('bodyscroll:') === 0) {
//msg = msg.split(':');
//this.bodyScrollTop_ = Number(msg[1]);
2017-07-30 21:51:18 +02:00
} else {
Linking.openURL(msg);
}
}}
/>
</View>
);
}
}
2017-11-03 02:13:17 +02:00
module.exports = { NoteBodyViewer };