EventIndex: Add a method to populate an event timeline with file events.

This commit is contained in:
Damir Jelić 2020-01-15 12:05:02 +01:00
parent 263370c9ae
commit 8a17c73b79

View file

@ -17,6 +17,12 @@ limitations under the License.
import PlatformPeg from "../PlatformPeg";
import {MatrixClientPeg} from "../MatrixClientPeg";
import Matrix from 'matrix-js-sdk';
import EventTimelineSet from 'matrix-js-sdk/lib/models/event-timeline-set';
import EventTimeline from 'matrix-js-sdk/lib/models/event-timeline';
import MatrixEvent from 'matrix-js-sdk/lib/models/event';
import RoomMember from 'matrix-js-sdk/lib/models/room-member';
/*
* Event indexing class that wraps the platform specific event indexing.
*/
@ -411,4 +417,66 @@ export default class EventIndex {
const indexManager = PlatformPeg.get().getEventIndexingManager();
return indexManager.searchEventIndex(searchArgs);
}
async populateFileTimeline(room, timelineSet) {
const client = MatrixClientPeg.get();
const indexManager = PlatformPeg.get().getEventIndexingManager();
// Get our events from the event index.
const events = await indexManager.loadFileEvents(
{
roomId: room.roomId,
limit: 10
}
);
let eventMapper = client.getEventMapper();
// Turn the events into MatrixEvent objects.
const matrixEvents = events.map(e => {
const matrixEvent = eventMapper(e.event);
const member = new RoomMember(room.roomId, matrixEvent.getSender());
// We can't really reconstruct the whole room state from our
// EventIndex to calculate the correct display name. Use the
// disambiguated form always instead.
member.name = e.profile.displayname + " (" + matrixEvent.getSender() + ")";
// This is sets the avatar URL.
const memberEvent = eventMapper(
{
content: {
membership: "join",
avatar_url: e.profile.avatar_url,
displayname: e.profile.displayname,
},
type: "m.room.member",
event_id: matrixEvent.getId() + ":eventIndex",
room_id: matrixEvent.getRoomId(),
sender: matrixEvent.getSender(),
origin_server_ts: matrixEvent.getTs(),
state_key: matrixEvent.getSender()
}
);
// We set this manually to avoid emitting RoomMember.membership and
// RoomMember.name events.
member.events.member = memberEvent;
matrixEvent.sender = member;
return matrixEvent;
});
// Add the events to the live timeline of the file panel.
matrixEvents.forEach(e => {
if (!timelineSet.eventIdToTimeline(e.getId())) {
const liveTimeline = timelineSet.getLiveTimeline();
timelineSet.addEventToTimeline(e, liveTimeline, true)
}
});
// Set the pagination token to the oldest event that we retrieved.
timelineSet.getLiveTimeline().setPaginationToken("", EventTimeline.BACKWARDS);
}
}