From 151a9994bae48b7f0d2988221cc46809fdf673d0 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Thu, 24 Mar 2016 00:13:32 +0000 Subject: [PATCH] WIP fix for image load popping --- src/components/structures/MessagePanel.js | 15 +++----- src/components/structures/RoomView.js | 6 +++- src/components/structures/ScrollPanel.js | 12 ++++++- src/components/views/messages/MImageBody.js | 39 ++++++++++++++++----- 4 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 66e2daddd5..b67ed5fd4b 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -16,6 +16,7 @@ limitations under the License. var React = require('react'); var ReactDOM = require("react-dom"); +var dis = require("../../dispatcher"); var sdk = require('../../index'); /* (almost) stateless UI component which builds the event tiles in the room timeline. @@ -301,8 +302,7 @@ module.exports = React.createClass({ ref={this._collectEventNode.bind(this, eventId)} data-scroll-token={scrollToken}> + last={last} isSelectedEvent={highlight} /> ); @@ -368,14 +368,8 @@ module.exports = React.createClass({ this.eventNodes[eventId] = node; }, - - // once images in the events load, make the scrollPanel check the - // scroll offsets. - _onImageLoad: function() { - var scrollPanel = this.refs.scrollPanel; - if (scrollPanel) { - scrollPanel.checkScroll(); - } + onResize: function() { + dis.dispatch({ action: 'timeline_resize' }); }, render: function() { @@ -392,6 +386,7 @@ module.exports = React.createClass({ return ( diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 3f4a666c56..ca347b99f6 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -485,6 +485,10 @@ module.exports = React.createClass({ } }, + onSearchResultsResize: function() { + dis.dispatch({ action: 'timeline_resize' }); + }, + onSearchResultsFillRequest: function(backwards) { if (!backwards) return q(false); @@ -1361,7 +1365,7 @@ module.exports = React.createClass({ if (this.state.searchResults) { searchResultsPanel = ( + onFillRequest={ this.onSearchResultsFillRequest } onResize={ this.onSearchResultsResize }>
  • {this.getSearchResultTiles()}
    diff --git a/src/components/structures/ScrollPanel.js b/src/components/structures/ScrollPanel.js index 874078456e..bea870818f 100644 --- a/src/components/structures/ScrollPanel.js +++ b/src/components/structures/ScrollPanel.js @@ -94,6 +94,11 @@ module.exports = React.createClass({ */ onScroll: React.PropTypes.func, + /* onResize: a callback which is called whenever the Gemini scroll + * panel is resized + */ + onResize: React.PropTypes.func, + /* className: classnames to add to the top-level div */ className: React.PropTypes.string, @@ -181,6 +186,11 @@ module.exports = React.createClass({ this.checkFillState(); }, + onResize: function() { + this.props.onResize(); + this.checkScroll(); + }, + // after an update to the contents of the panel, check that the scroll is // where it ought to be, and set off pagination requests if necessary. checkScroll: function() { @@ -481,7 +491,7 @@ module.exports = React.createClass({ // reflect the fact that we don't necessarily contain a list of messages. // it's not obvious why we have a separate div and ol anyway. return (
      diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index b60098295a..6e46bf01e4 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -105,24 +105,45 @@ module.exports = React.createClass({ return MatrixClientPeg.get().mxcUrlToHttp(content.url, 800, 600); }, + componentDidMount: function() { + this.dispatcherRef = dis.register(this.onAction); + this.fixupHeight(); + }, + + componentWillUnmount: function() { + dis.unregister(this.dispatcherRef); + }, + + onAction: function(payload) { + if (payload.action === "timeline_resize") { + this.fixupHeight(); + } + }, + + fixupHeight: function() { + var content = this.props.mxEvent.getContent(); + + var thumbHeight = null; + var timelineWidth = this._body.offsetWidth; + var maxHeight = 600*timelineWidth/800; + + //console.log("trying to fit image into timelineWidth of " + this._body.offsetWidth + " or " + this._body.clientWidth); + if (content.info) thumbHeight = this.thumbHeight(content.info.w, content.info.h, timelineWidth, maxHeight); + this._image.style.height = thumbHeight + "px"; + }, + render: function() { var TintableSvg = sdk.getComponent("elements.TintableSvg"); var content = this.props.mxEvent.getContent(); var cli = MatrixClientPeg.get(); - var thumbHeight = null; - if (content.info) thumbHeight = this.thumbHeight(content.info.w, content.info.h, 800, 600); - - var imgStyle = {}; - if (thumbHeight) imgStyle['maxHeight'] = thumbHeight; - var thumbUrl = this._getThumbUrl(); if (thumbUrl) { return ( - + this._body = c}> - {content.body} this._image = c} + alt={content.body} onMouseEnter={this.onImageEnter} onMouseLeave={this.onImageLeave} onLoad={this.props.onImageLoad} />