diff options
Diffstat (limited to 'webapp/components/post_view/post_image.jsx')
-rw-r--r-- | webapp/components/post_view/post_image.jsx | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/webapp/components/post_view/post_image.jsx b/webapp/components/post_view/post_image.jsx new file mode 100644 index 000000000..5feb01db4 --- /dev/null +++ b/webapp/components/post_view/post_image.jsx @@ -0,0 +1,100 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import React from 'react'; +import PropTypes from 'prop-types'; + +export default class PostImageEmbed extends React.PureComponent { + static propTypes = { + + /** + * The link to load the image from + */ + link: PropTypes.string.isRequired, + + /** + * Function to call when image is loaded + */ + onLinkLoaded: PropTypes.func, + + /** + * The function to call if image load fails + */ + onLinkLoadError: PropTypes.func + } + + constructor(props) { + super(props); + + this.handleLoadComplete = this.handleLoadComplete.bind(this); + this.handleLoadError = this.handleLoadError.bind(this); + + this.state = { + loaded: false, + errored: false + }; + } + + componentWillMount() { + this.loadImg(this.props.link); + } + + componentWillReceiveProps(nextProps) { + if (nextProps.link !== this.props.link) { + this.setState({ + loaded: false, + errored: false + }); + } + } + + componentDidUpdate(prevProps) { + if (!this.state.loaded && prevProps.link !== this.props.link) { + this.loadImg(this.props.link); + } + } + + loadImg(src) { + const img = new Image(); + img.onload = this.handleLoadComplete; + img.onerror = this.handleLoadError; + img.src = src; + } + + handleLoadComplete() { + this.setState({ + loaded: true, + errored: false + }); + if (this.props.onLinkLoaded) { + this.props.onLinkLoaded(); + } + } + + handleLoadError() { + this.setState({ + errored: true, + loaded: true + }); + if (this.props.onLinkLoadError) { + this.props.onLinkLoadError(); + } + } + + render() { + if (this.state.errored || !this.state.loaded) { + return null; + } + + return ( + <div + className='post__embed-container' + > + <img + className='img-div' + src={this.props.link} + /> + </div> + ); + } +} |