diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js
index a7520de94f..2e649b71c0 100644
--- a/src/components/structures/RoomView.js
+++ b/src/components/structures/RoomView.js
@@ -412,6 +412,12 @@ module.exports = React.createClass({
}
},
+ // return true if there's more messages in the backlog which we aren't displaying
+ _canPaginate: function() {
+ return (this.state.messageCap < this.state.room.timeline.length) ||
+ this.state.room.oldState.paginationToken;
+ },
+
onResendAllClick: function() {
var eventsToResend = this._getUnsentMessages(this.state.room);
eventsToResend.forEach(function(event) {
@@ -534,6 +540,7 @@ module.exports = React.createClass({
searchResults: [],
searchHighlights: [],
searchCount: null,
+ searchCanPaginate: null,
});
this.savedSearchScrollState = {atBottom: true};
@@ -592,6 +599,7 @@ module.exports = React.createClass({
searchHighlights: highlights,
searchResults: events,
searchCount: results.count,
+ searchCanPaginate: !!(results.next_batch),
});
self.nextSearchBatch = results.next_batch;
}, function(error) {
@@ -652,6 +660,20 @@ module.exports = React.createClass({
var lastRoomId;
+ if (this.state.searchCanPaginate === false) {
+ if (this.state.searchResults.length == 0) {
+ ret.push(
+ No results
+
+ );
+ } else {
+ ret.push(
+ No more results
+
+ );
+ }
+ }
+
for (var i = this.state.searchResults.length - 1; i >= 0; i--) {
var result = this.state.searchResults[i];
var mxEv = new Matrix.MatrixEvent(result.result);
@@ -694,7 +716,10 @@ module.exports = React.createClass({
return ret;
}
- for (var i = this.state.room.timeline.length-1; i >= 0 && count < this.state.messageCap; --i) {
+
+ var prevEvent = null; // the last event we showed
+ var startIdx = Math.max(0, this.state.room.timeline.length - this.state.messageCap);
+ for (var i = startIdx; i < this.state.room.timeline.length; i++) {
var mxEv = this.state.room.timeline[i];
if (!EventTile.haveTileForEvent(mxEv)) {
@@ -707,49 +732,45 @@ module.exports = React.createClass({
}
}
+ // is this a continuation of the previous message?
var continuation = false;
- var last = false;
- var dateSeparator = null;
- if (i == this.state.room.timeline.length - 1) {
- last = true;
- }
- if (i > 0 && count < this.state.messageCap - 1) {
- if (this.state.room.timeline[i].sender &&
- this.state.room.timeline[i - 1].sender &&
- (this.state.room.timeline[i].sender.userId ===
- this.state.room.timeline[i - 1].sender.userId) &&
- (this.state.room.timeline[i].getType() ==
- this.state.room.timeline[i - 1].getType())
+ if (prevEvent !== null) {
+ if (mxEv.sender &&
+ prevEvent.sender &&
+ (mxEv.sender.userId === prevEvent.sender.userId) &&
+ (mxEv.getType() == prevEvent.getType())
)
{
continuation = true;
}
-
- var ts0 = this.state.room.timeline[i - 1].getTs();
- var ts1 = this.state.room.timeline[i].getTs();
- if (new Date(ts0).toDateString() !== new Date(ts1).toDateString()) {
- dateSeparator = ;
- continuation = false;
- }
}
- if (i === 1) { // n.b. 1, not 0, as the 0th event is an m.room.create and so doesn't show on the timeline
- var ts1 = this.state.room.timeline[i].getTs();
- dateSeparator = ;
+ // do we need a date separator since the last event?
+ var ts1 = mxEv.getTs();
+ if ((prevEvent == null && !this._canPaginate()) ||
+ (prevEvent != null &&
+ new Date(prevEvent.getTs()).toDateString() !== new Date(ts1).toDateString())) {
+ var dateSeparator = ;
+ ret.push(dateSeparator);
continuation = false;
}
+ var last = false;
+ if (i == this.state.room.timeline.length - 1) {
+ // XXX: we might not show a tile for the last event.
+ last = true;
+ }
+
var eventId = mxEv.getId();
- ret.unshift(
+ ret.push(
);
- if (dateSeparator) {
- ret.unshift(dateSeparator);
- }
- ++count;
+
+ prevEvent = mxEv;
}
+
return ret;
},
diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js
index 95b3616b40..acfdd55694 100644
--- a/src/components/views/rooms/MessageComposer.js
+++ b/src/components/views/rooms/MessageComposer.js
@@ -348,6 +348,9 @@ module.exports = React.createClass({
if (isEmote) {
contentText = contentText.substring(4);
}
+ else if (contentText[0] === '/') {
+ contentText = contentText.substring(1);
+ }
var htmlText;
if (this.markdownEnabled && (htmlText = mdownToHtml(contentText)) !== contentText) {