You've already forked matrix-js-sdk
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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user