Improved read receipt handling
Also, fix audio auto play of consecutive messages, even if they are in threads.
This commit is contained in:
parent
254eb72870
commit
24e119c150
2 changed files with 60 additions and 70 deletions
|
|
@ -258,7 +258,7 @@ export default {
|
||||||
}
|
}
|
||||||
this.updateVisualization();
|
this.updateVisualization();
|
||||||
if (this.currentAudioEvent) {
|
if (this.currentAudioEvent) {
|
||||||
this.$emit("mark-read", this.currentAudioEvent.getId(), this.currentAudioEvent.getId());
|
this.$emit("mark-read", [this.currentAudioEvent]);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
audioPlaybackPaused() {
|
audioPlaybackPaused() {
|
||||||
|
|
|
||||||
|
|
@ -1941,80 +1941,62 @@ export default {
|
||||||
if (this.$matrix.currentRoomBeingPurged) {
|
if (this.$matrix.currentRoomBeingPurged) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let eventIdFirst = null;
|
|
||||||
let eventIdLast = null;
|
|
||||||
if (!this.useVoiceMode && !this.useFileModeNonAdmin) {
|
if (!this.useVoiceMode && !this.useFileModeNonAdmin) {
|
||||||
const container = this.chatContainer;
|
this.rrTimer = setTimeout(() => { this.rrTimerElapsed() }, READ_RECEIPT_TIMEOUT);
|
||||||
const elFirst = util.getFirstVisibleElement(container, (item) => item.hasAttribute("eventId"));
|
|
||||||
const elLast = util.getLastVisibleElement(container, (item) => item.hasAttribute("eventId"));
|
|
||||||
if (elFirst && elLast) {
|
|
||||||
if (this.reverseOrder) {
|
|
||||||
// For reverse order, the "first visible" is actually later in time, so swap them
|
|
||||||
eventIdFirst = elLast.getAttribute("eventId");
|
|
||||||
eventIdLast = elFirst.getAttribute("eventId");
|
|
||||||
} else {
|
|
||||||
eventIdFirst = elFirst.getAttribute("eventId");
|
|
||||||
eventIdLast = elLast.getAttribute("eventId");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (eventIdFirst && eventIdLast) {
|
|
||||||
this.rrTimer = setTimeout(() => { this.rrTimerElapsed(eventIdFirst, eventIdLast) }, READ_RECEIPT_TIMEOUT);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
rrTimerElapsed(eventIdFirst, eventIdLast) {
|
rrTimerElapsed() {
|
||||||
this.rrTimer = null;
|
this.rrTimer = null;
|
||||||
this.sendRR(eventIdFirst, eventIdLast);
|
this.sendRR();
|
||||||
this.restartRRTimer();
|
this.restartRRTimer();
|
||||||
},
|
},
|
||||||
|
|
||||||
sendRR(eventIdFirst, eventIdLast) {
|
sendRR(onlyTheseEvents) {
|
||||||
console.log("SEND RR", eventIdFirst, eventIdLast);
|
let lastTimestamp = 0;
|
||||||
if (eventIdLast && this.room) {
|
if (this.lastRR) {
|
||||||
var event = this.room.findEventById(eventIdLast);
|
lastTimestamp = this.lastRR.getTs();
|
||||||
const index = this.events.indexOf(event);
|
}
|
||||||
|
|
||||||
// Walk backwards through visible events to the first one that is incoming
|
let eventsToConsider = onlyTheseEvents;
|
||||||
//
|
if (!eventsToConsider) {
|
||||||
var lastTimestamp = 0;
|
// If events to consider is not given (used by Audio layout) then consider all visible events (with some restrictions).
|
||||||
if (this.lastRR) {
|
let visibleEventIds = util.findVisibleElements(this.chatContainer).filter(el => el.hasAttribute("eventId")).map(el => el.getAttribute("eventId"));
|
||||||
lastTimestamp = this.lastRR.getTs();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = index; i >= 0; i--) {
|
eventsToConsider = this.events.filter(e => {
|
||||||
event = this.events[i];
|
if (e.getTs() > lastTimestamp &&
|
||||||
if (event == this.lastRR || event.getTs() <= lastTimestamp) {
|
// Make sure it's not a local echo event...
|
||||||
// Already sent this or too old...
|
!e.getId().startsWith("~")) {
|
||||||
break;
|
if (e.isRelation()) {
|
||||||
}
|
return visibleEventIds.includes(e.getAssociatedId());
|
||||||
// Make sure it's not a local echo event...
|
} else if (e.getType() == "m.room.pinned_events") {
|
||||||
if (!event.getId().startsWith("~")) {
|
// Ignore the pin event. If we pin an older message it does not automatically mean we have read the
|
||||||
// Send read receipt
|
// messages between.
|
||||||
this.$matrix.matrixClient
|
return false;
|
||||||
.sendReadReceipt(event)
|
} else {
|
||||||
.then(() => {
|
return visibleEventIds.includes(e.getId());
|
||||||
this.$matrix.matrixClient.setRoomReadMarkers(this.room.roomId, event.getId());
|
}
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
console.log("RR sent for event: " + event.getId());
|
|
||||||
this.lastRR = event;
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
console.log("Failed to update read marker: ", err);
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
this.restartRRTimer();
|
|
||||||
});
|
|
||||||
return; // Bail out here
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Stop iterating at first visible
|
eventsToConsider.sort((a, b) => b.getTs() - a.getTs());
|
||||||
if (event.getId() == eventIdFirst) {
|
if (eventsToConsider.length > 0 && eventsToConsider[0] != this.lastRR) {
|
||||||
break;
|
const eventToSendRRFor = eventsToConsider[0];
|
||||||
}
|
|
||||||
}
|
// Send read receipt
|
||||||
|
this.$matrix.matrixClient.setRoomReadMarkers(this.room.roomId, eventToSendRRFor.getId(), eventToSendRRFor)
|
||||||
|
.then(() => {
|
||||||
|
console.log("RR sent for event", eventToSendRRFor.getId(), eventToSendRRFor.getType());
|
||||||
|
this.lastRR = eventToSendRRFor;
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.log("Failed to update read marker: ", err);
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
this.restartRRTimer();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -2109,13 +2091,21 @@ export default {
|
||||||
audioPlaybackEnded(matrixEventId) {
|
audioPlaybackEnded(matrixEventId) {
|
||||||
if (!this.useVoiceMode) { // Voice mode has own autoplay handling inside "AudioLayout"!
|
if (!this.useVoiceMode) { // Voice mode has own autoplay handling inside "AudioLayout"!
|
||||||
// Auto play consecutive audio messages, either incoming or sent.
|
// Auto play consecutive audio messages, either incoming or sent.
|
||||||
const filteredEvents = this.filteredEvents;
|
let event = this.events.find(e => e.getId() === matrixEventId);
|
||||||
const event = filteredEvents.find(e => e.getId() === matrixEventId);
|
if (event) {
|
||||||
if (event && event.nextDisplayedEvent) {
|
event = event.parentThread ? event.parentThread : event;
|
||||||
const nextEvent = event.nextDisplayedEvent;
|
if (event.nextDisplayedEvent) {
|
||||||
if (nextEvent.getContent().msgtype === "m.audio") {
|
const nextEvent = event.nextDisplayedEvent;
|
||||||
// Yes, audio event!
|
if (nextEvent.getContent().msgtype === "m.audio") {
|
||||||
this.$audioPlayer.play(nextEvent, this.timelineSet);
|
// Yes, audio event!
|
||||||
|
this.$audioPlayer.play(nextEvent, this.timelineSet);
|
||||||
|
} else if (nextEvent.isMxThread) {
|
||||||
|
const children = this.timelineSet.relations.getAllChildEventsForEvent(nextEvent.getId());
|
||||||
|
if (children && children.length > 0 && children[0].getContent().msgtype === "m.audio") {
|
||||||
|
// Yes, audio event!
|
||||||
|
this.$audioPlayer.play(children[0], this.timelineSet);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue