1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-11-29 16:43:09 +03:00

incorporate PR feedback

This commit is contained in:
Matthew Hodgson
2016-09-08 22:38:39 +01:00
parent 7dfc4a404c
commit f959e1a134
6 changed files with 36 additions and 34 deletions

View File

@@ -53,14 +53,12 @@ if (DEBUG) {
* map from event_id to timeline and index. * map from event_id to timeline and index.
* *
* @constructor * @constructor
* @param {?String} roomId the roomId of this timelineSet's room, if any
* @param {?Room} room the optional room for this timelineSet * @param {?Room} room the optional room for this timelineSet
* @param {Object} opts hash of options inherited from Room. * @param {Object} opts hash of options inherited from Room.
* opts.timelineSupport gives whether timeline support is enabled * opts.timelineSupport gives whether timeline support is enabled
* opts.filter is the filter object, if any, for this timelineSet. * opts.filter is the filter object, if any, for this timelineSet.
*/ */
function EventTimelineSet(roomId, room, opts) { function EventTimelineSet(room, opts) {
this.roomId = roomId;
this.room = room; this.room = room;
this._timelineSupport = Boolean(opts.timelineSupport); this._timelineSupport = Boolean(opts.timelineSupport);
@@ -475,7 +473,6 @@ EventTimelineSet.prototype.addEventToTimeline = function(event, timeline,
var data = { var data = {
timeline: timeline, timeline: timeline,
liveEvent: !toStartOfTimeline && timeline == this._liveTimeline, liveEvent: !toStartOfTimeline && timeline == this._liveTimeline,
timelineSet: this,
}; };
this.emit("Room.timeline", event, this.room, this.emit("Room.timeline", event, this.room,
Boolean(toStartOfTimeline), false, data); Boolean(toStartOfTimeline), false, data);
@@ -483,7 +480,7 @@ EventTimelineSet.prototype.addEventToTimeline = function(event, timeline,
/** /**
* Replaces event with ID oldEventId with one with newEventId, if oldEventId is * Replaces event with ID oldEventId with one with newEventId, if oldEventId is
* recognised. Otherwise, add to the live timeline. * recognised. Otherwise, add to the live timeline. Used to handle remote echos.
* *
* @param {MatrixEvent} localEvent the new event to be added to the timeline * @param {MatrixEvent} localEvent the new event to be added to the timeline
* @param {String} oldEventId the ID of the original event * @param {String} oldEventId the ID of the original event
@@ -491,7 +488,7 @@ EventTimelineSet.prototype.addEventToTimeline = function(event, timeline,
* *
* @fires module:client~MatrixClient#event:"Room.timeline" * @fires module:client~MatrixClient#event:"Room.timeline"
*/ */
EventTimelineSet.prototype.replaceOrAddEvent = function(localEvent, oldEventId, EventTimelineSet.prototype.handleRemoteEcho = function(localEvent, oldEventId,
newEventId) { newEventId) {
// XXX: why don't we infer newEventId from localEvent? // XXX: why don't we infer newEventId from localEvent?
var existingTimeline = this._eventIdToTimeline[oldEventId]; var existingTimeline = this._eventIdToTimeline[oldEventId];
@@ -529,7 +526,6 @@ EventTimelineSet.prototype.removeEvent = function(eventId) {
delete this._eventIdToTimeline[eventId]; delete this._eventIdToTimeline[eventId];
var data = { var data = {
timeline: timeline, timeline: timeline,
timelineSet: this,
}; };
this.emit("Room.timeline", removed, this.room, undefined, true, data); this.emit("Room.timeline", removed, this.room, undefined, true, data);
} }

View File

@@ -30,7 +30,7 @@ var MatrixEvent = require("./event").MatrixEvent;
*/ */
function EventTimeline(eventTimelineSet) { function EventTimeline(eventTimelineSet) {
this._eventTimelineSet = eventTimelineSet; this._eventTimelineSet = eventTimelineSet;
this._roomId = eventTimelineSet.roomId; this._roomId = eventTimelineSet.room ? eventTimelineSet.room.roomId : null;
this._events = []; this._events = [];
this._baseIndex = 0; this._baseIndex = 0;
this._startState = new RoomState(this._roomId); this._startState = new RoomState(this._roomId);

View File

@@ -25,7 +25,8 @@ var RoomMember = require("./room-member");
/** /**
* Construct room state. * Construct room state.
* @constructor * @constructor
* @param {string} roomId Required. The ID of the room which has this state. * @param {?string} roomId Optional. The ID of the room which has this state.
* If none is specified it just tracks paginationTokens, useful for notifTimelineSet
* @prop {Object.<string, RoomMember>} members The room member dictionary, keyed * @prop {Object.<string, RoomMember>} members The room member dictionary, keyed
* on the user's ID. * on the user's ID.
* @prop {Object.<string, Object.<string, MatrixEvent>>} events The state * @prop {Object.<string, Object.<string, MatrixEvent>>} events The state

View File

@@ -151,7 +151,7 @@ function Room(roomId, opts) {
// all our per-room timeline sets. the first one is the unfiltered ones; // all our per-room timeline sets. the first one is the unfiltered ones;
// the subsequent ones are the filtered ones in no particular order. // the subsequent ones are the filtered ones in no particular order.
this._timelineSets = [new EventTimelineSet(roomId, this, opts)]; this._timelineSets = [new EventTimelineSet(this, opts)];
reEmit(this, this.getUnfilteredTimelineSet(), ["Room.timeline"]); reEmit(this, this.getUnfilteredTimelineSet(), ["Room.timeline"]);
this._fixUpLegacyTimelineFields(); this._fixUpLegacyTimelineFields();
@@ -465,7 +465,7 @@ Room.prototype.getOrCreateFilteredTimelineSet = function(filter) {
return this._filteredTimelineSets[filter.filterId]; return this._filteredTimelineSets[filter.filterId];
} }
var opts = Object.assign({ filter: filter }, this._opts); var opts = Object.assign({ filter: filter }, this._opts);
var timelineSet = new EventTimelineSet(this.roomId, this, opts); var timelineSet = new EventTimelineSet(this, opts);
reEmit(this, timelineSet, ["Room.timeline"]); reEmit(this, timelineSet, ["Room.timeline"]);
this._filteredTimelineSets[filter.filterId] = timelineSet; this._filteredTimelineSets[filter.filterId] = timelineSet;
this._timelineSets.push(timelineSet); this._timelineSets.push(timelineSet);
@@ -483,8 +483,14 @@ Room.prototype.getOrCreateFilteredTimelineSet = function(filter) {
timelineSet.addLiveEvent(event); timelineSet.addLiveEvent(event);
}); });
// find the earliest unfiltered timeline
var timeline = unfilteredLiveTimeline;
while (timeline.getNeighbouringTimeline(EventTimeline.BACKWARDS)) {
timeline = timeline.getNeighbouringTimeline(EventTimeline.BACKWARDS);
}
timelineSet.getLiveTimeline().setPaginationToken( timelineSet.getLiveTimeline().setPaginationToken(
unfilteredLiveTimeline.getPaginationToken(EventTimeline.BACKWARDS), timeline.getPaginationToken(EventTimeline.BACKWARDS),
EventTimeline.BACKWARDS EventTimeline.BACKWARDS
); );
@@ -527,25 +533,21 @@ Room.prototype._addLiveEvent = function(event, duplicateStrategy) {
if (event.getType() === "m.room.redaction") { if (event.getType() === "m.room.redaction") {
var redactId = event.event.redacts; var redactId = event.event.redacts;
for (i = 0; i < this._timelineSets.length; i++) { // if we know about this event, redact its contents now.
var timelineSet = this._timelineSets[i]; var redactedEvent = this.getUnfilteredTimelineSet().findEventById(redactId);
// if we know about this event, redact its contents now. if (redactedEvent) {
var redactedEvent = timelineSet.findEventById(redactId); redactedEvent.makeRedacted(event);
if (redactedEvent) { this.emit("Room.redaction", event, this);
redactedEvent.makeRedacted(event);
// FIXME: these should be emitted from EventTimelineSet probably
this.emit("Room.redaction", event, this, timelineSet);
// TODO: we stash user displaynames (among other things) in // TODO: we stash user displaynames (among other things) in
// RoomMember objects which are then attached to other events // RoomMember objects which are then attached to other events
// (in the sender and target fields). We should get those // (in the sender and target fields). We should get those
// RoomMember objects to update themselves when the events that // RoomMember objects to update themselves when the events that
// they are based on are changed. // they are based on are changed.
}
// FIXME: apply redactions to notification list
} }
// FIXME: apply redactions to notification list
// NB: We continue to add the redaction event to the timeline so // NB: We continue to add the redaction event to the timeline so
// clients can say "so and so redacted an event" if they wish to. Also // clients can say "so and so redacted an event" if they wish to. Also
// this may be needed to trigger an update. // this may be needed to trigger an update.
@@ -687,7 +689,7 @@ Room.prototype._handleRemoteEcho = function(remoteEvent, localEvent) {
var timelineSet = this._timelineSets[i]; var timelineSet = this._timelineSets[i];
// if it's already in the timeline, update the timeline map. If it's not, add it. // if it's already in the timeline, update the timeline map. If it's not, add it.
timelineSet.replaceOrAddEvent(localEvent, oldEventId, newEventId); timelineSet.handleRemoteEcho(localEvent, oldEventId, newEventId);
} }
this.emit("Room.localEchoUpdated", localEvent, this, this.emit("Room.localEchoUpdated", localEvent, this,
@@ -865,11 +867,10 @@ Room.prototype.removeEvents = function(event_ids) {
* *
* @param {String} eventId The id of the event to remove * @param {String} eventId The id of the event to remove
* *
* @return {?MatrixEvent} the removed event, or null if the event was not found * @return {bool} true if the event was removed from any of the room's timeline sets
* in this room.
*/ */
Room.prototype.removeEvent = function(eventId) { Room.prototype.removeEvent = function(eventId) {
var removedAny; var removedAny = false;
for (var i = 0; i < this._timelineSets.length; i++) { for (var i = 0; i < this._timelineSets.length; i++) {
var removed = this._timelineSets[i].removeEvent(eventId); var removed = this._timelineSets[i].removeEvent(eventId);
if (removed) { if (removed) {

View File

@@ -16,7 +16,9 @@ describe("EventTimeline", function() {
beforeEach(function() { beforeEach(function() {
utils.beforeEach(this); utils.beforeEach(this);
timeline = new EventTimeline({ roomId: roomId }); // XXX: this is a horrid hack; should use sinon or something instead
var timelineSet = { room: { roomId: roomId }};
timeline = new EventTimeline(timelineSet);
}); });
describe("construction", function() { describe("construction", function() {

View File

@@ -18,7 +18,9 @@ function createTimeline(numEvents, baseIndex) {
if (numEvents === undefined) { numEvents = 3; } if (numEvents === undefined) { numEvents = 3; }
if (baseIndex === undefined) { baseIndex = 1; } if (baseIndex === undefined) { baseIndex = 1; }
var timeline = new EventTimeline({ roomId: ROOM_ID }); // XXX: this is a horrid hack
var timelineSet = { room: { roomId: ROOM_ID }};
var timeline = new EventTimeline(timelineSet);
// add the events after the baseIndex first // add the events after the baseIndex first
addEventsToTimeline(timeline, numEvents - baseIndex, false); addEventsToTimeline(timeline, numEvents - baseIndex, false);