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.
*
* @constructor
* @param {?String} roomId the roomId of this timelineSet's room, if any
* @param {?Room} room the optional room for this timelineSet
* @param {Object} opts hash of options inherited from Room.
* opts.timelineSupport gives whether timeline support is enabled
* opts.filter is the filter object, if any, for this timelineSet.
*/
function EventTimelineSet(roomId, room, opts) {
this.roomId = roomId;
function EventTimelineSet(room, opts) {
this.room = room;
this._timelineSupport = Boolean(opts.timelineSupport);
@@ -475,7 +473,6 @@ EventTimelineSet.prototype.addEventToTimeline = function(event, timeline,
var data = {
timeline: timeline,
liveEvent: !toStartOfTimeline && timeline == this._liveTimeline,
timelineSet: this,
};
this.emit("Room.timeline", event, this.room,
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
* 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 {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"
*/
EventTimelineSet.prototype.replaceOrAddEvent = function(localEvent, oldEventId,
EventTimelineSet.prototype.handleRemoteEcho = function(localEvent, oldEventId,
newEventId) {
// XXX: why don't we infer newEventId from localEvent?
var existingTimeline = this._eventIdToTimeline[oldEventId];
@@ -529,7 +526,6 @@ EventTimelineSet.prototype.removeEvent = function(eventId) {
delete this._eventIdToTimeline[eventId];
var data = {
timeline: timeline,
timelineSet: this,
};
this.emit("Room.timeline", removed, this.room, undefined, true, data);
}

View File

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

View File

@@ -25,7 +25,8 @@ var RoomMember = require("./room-member");
/**
* Construct room state.
* @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
* on the user's ID.
* @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;
// 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"]);
this._fixUpLegacyTimelineFields();
@@ -465,7 +465,7 @@ Room.prototype.getOrCreateFilteredTimelineSet = function(filter) {
return this._filteredTimelineSets[filter.filterId];
}
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"]);
this._filteredTimelineSets[filter.filterId] = timelineSet;
this._timelineSets.push(timelineSet);
@@ -483,8 +483,14 @@ Room.prototype.getOrCreateFilteredTimelineSet = function(filter) {
timelineSet.addLiveEvent(event);
});
// find the earliest unfiltered timeline
var timeline = unfilteredLiveTimeline;
while (timeline.getNeighbouringTimeline(EventTimeline.BACKWARDS)) {
timeline = timeline.getNeighbouringTimeline(EventTimeline.BACKWARDS);
}
timelineSet.getLiveTimeline().setPaginationToken(
unfilteredLiveTimeline.getPaginationToken(EventTimeline.BACKWARDS),
timeline.getPaginationToken(EventTimeline.BACKWARDS),
EventTimeline.BACKWARDS
);
@@ -527,25 +533,21 @@ Room.prototype._addLiveEvent = function(event, duplicateStrategy) {
if (event.getType() === "m.room.redaction") {
var redactId = event.event.redacts;
for (i = 0; i < this._timelineSets.length; i++) {
var timelineSet = this._timelineSets[i];
// if we know about this event, redact its contents now.
var redactedEvent = timelineSet.findEventById(redactId);
if (redactedEvent) {
redactedEvent.makeRedacted(event);
// FIXME: these should be emitted from EventTimelineSet probably
this.emit("Room.redaction", event, this, timelineSet);
// if we know about this event, redact its contents now.
var redactedEvent = this.getUnfilteredTimelineSet().findEventById(redactId);
if (redactedEvent) {
redactedEvent.makeRedacted(event);
this.emit("Room.redaction", event, this);
// TODO: we stash user displaynames (among other things) in
// RoomMember objects which are then attached to other events
// (in the sender and target fields). We should get those
// RoomMember objects to update themselves when the events that
// they are based on are changed.
}
// FIXME: apply redactions to notification list
// TODO: we stash user displaynames (among other things) in
// RoomMember objects which are then attached to other events
// (in the sender and target fields). We should get those
// RoomMember objects to update themselves when the events that
// they are based on are changed.
}
// FIXME: apply redactions to notification list
// 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
// this may be needed to trigger an update.
@@ -687,7 +689,7 @@ Room.prototype._handleRemoteEcho = function(remoteEvent, localEvent) {
var timelineSet = this._timelineSets[i];
// 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,
@@ -865,11 +867,10 @@ Room.prototype.removeEvents = function(event_ids) {
*
* @param {String} eventId The id of the event to remove
*
* @return {?MatrixEvent} the removed event, or null if the event was not found
* in this room.
* @return {bool} true if the event was removed from any of the room's timeline sets
*/
Room.prototype.removeEvent = function(eventId) {
var removedAny;
var removedAny = false;
for (var i = 0; i < this._timelineSets.length; i++) {
var removed = this._timelineSets[i].removeEvent(eventId);
if (removed) {

View File

@@ -16,7 +16,9 @@ describe("EventTimeline", function() {
beforeEach(function() {
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() {

View File

@@ -18,7 +18,9 @@ function createTimeline(numEvents, baseIndex) {
if (numEvents === undefined) { numEvents = 3; }
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
addEventsToTimeline(timeline, numEvents - baseIndex, false);