* Fix various scrolling issues * Move reaction scrolling to reaction list * Handle scrolling when RHS opens * Only run scroll update code when posts change
106 строки
2.4 KiB
JavaScript
106 строки
2.4 KiB
JavaScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See License.txt for license information.
|
|
|
|
import React from 'react';
|
|
import PropTypes from 'prop-types';
|
|
|
|
import {postListScrollChange} from 'actions/global_actions.jsx';
|
|
|
|
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
|
|
});
|
|
|
|
postListScrollChange();
|
|
|
|
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>
|
|
);
|
|
}
|
|
}
|