Merge pull request #179 from matrix-org/rav/pagination_spinners

Show spinners when forward/back paginating.
This commit is contained in:
Richard van der Hoff 2016-02-26 13:28:01 +00:00
commit c4603d3474
2 changed files with 28 additions and 0 deletions

View file

@ -27,6 +27,14 @@ module.exports = React.createClass({
// true to give the component a 'display: none' style. // true to give the component a 'display: none' style.
hidden: React.PropTypes.bool, hidden: React.PropTypes.bool,
// true to show a spinner at the top of the timeline to indicate
// back-pagination in progress
backPaginating: React.PropTypes.bool,
// true to show a spinner at the end of the timeline to indicate
// forward-pagination in progress
forwardPaginating: React.PropTypes.bool,
// the list of MatrixEvents to display // the list of MatrixEvents to display
events: React.PropTypes.array.isRequired, events: React.PropTypes.array.isRequired,
@ -328,13 +336,24 @@ module.exports = React.createClass({
render: function() { render: function() {
var ScrollPanel = sdk.getComponent("structures.ScrollPanel"); var ScrollPanel = sdk.getComponent("structures.ScrollPanel");
var Spinner = sdk.getComponent("elements.Spinner");
var topSpinner, bottomSpinner;
if (this.props.backPaginating) {
topSpinner = <li key="_topSpinner"><Spinner /></li>;
}
if (this.props.forwardPaginating) {
bottomSpinner = <li key="_bottomSpinner"><Spinner /></li>;
}
return ( return (
<ScrollPanel ref="scrollPanel" className="mx_RoomView_messagePanel" <ScrollPanel ref="scrollPanel" className="mx_RoomView_messagePanel"
onScroll={ this.props.onScroll } onScroll={ this.props.onScroll }
onFillRequest={ this.props.onFillRequest } onFillRequest={ this.props.onFillRequest }
style={ this.props.hidden ? { display: 'none' } : {} } style={ this.props.hidden ? { display: 'none' } : {} }
stickyBottom={ this.props.stickyBottom }> stickyBottom={ this.props.stickyBottom }>
{topSpinner}
{this._getEventTiles()} {this._getEventTiles()}
{bottomSpinner}
</ScrollPanel> </ScrollPanel>
); );
}, },

View file

@ -102,6 +102,9 @@ var TimelinePanel = React.createClass({
readMarkerVisible: true, readMarkerVisible: true,
readMarkerEventId: initialReadMarker, readMarkerEventId: initialReadMarker,
backPaginating: false,
forwardPaginating: false,
}; };
}, },
@ -154,8 +157,12 @@ var TimelinePanel = React.createClass({
return q(false); return q(false);
} }
debuglog("TimelinePanel: Initiating paginate; backwards:"+backwards); debuglog("TimelinePanel: Initiating paginate; backwards:"+backwards);
var statekey = backwards ? 'backPaginating' : 'forwardPaginating';
this.setState({[statekey]: true});
return this._timelineWindow.paginate(dir, PAGINATE_SIZE).then((r) => { return this._timelineWindow.paginate(dir, PAGINATE_SIZE).then((r) => {
debuglog("TimelinePanel: paginate complete backwards:"+backwards+"; success:"+r); debuglog("TimelinePanel: paginate complete backwards:"+backwards+"; success:"+r);
this.setState({[statekey]: false});
this._onTimelineUpdated(r); this._onTimelineUpdated(r);
return r; return r;
}); });
@ -615,6 +622,8 @@ var TimelinePanel = React.createClass({
return ( return (
<MessagePanel ref="messagePanel" <MessagePanel ref="messagePanel"
hidden={ this.props.hidden } hidden={ this.props.hidden }
backPaginating={ this.state.backPaginating }
forwardPaginating={ this.state.forwardPaginating }
events={ this.state.events } events={ this.state.events }
highlightedEventId={ this.props.highlightedEventId } highlightedEventId={ this.props.highlightedEventId }
readMarkerEventId={ this.state.readMarkerEventId } readMarkerEventId={ this.state.readMarkerEventId }