Merge branch '614-channel-room-in-room-list-shows-2-new-messages-but-can-t-clear' into 'dev'

Resolve "channel room in room list shows "2 new messages" but can't clear"

See merge request keanuapp/keanuapp-weblite!320
This commit is contained in:
N Pex 2024-10-25 10:51:14 +00:00
commit c72646130c
2 changed files with 60 additions and 70 deletions

View file

@ -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() {

View file

@ -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);
}
}
} }
} }
} }