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:
commit
c72646130c
2 changed files with 60 additions and 70 deletions
|
|
@ -258,7 +258,7 @@ export default {
|
|||
}
|
||||
this.updateVisualization();
|
||||
if (this.currentAudioEvent) {
|
||||
this.$emit("mark-read", this.currentAudioEvent.getId(), this.currentAudioEvent.getId());
|
||||
this.$emit("mark-read", [this.currentAudioEvent]);
|
||||
}
|
||||
},
|
||||
audioPlaybackPaused() {
|
||||
|
|
|
|||
|
|
@ -1941,80 +1941,62 @@ export default {
|
|||
if (this.$matrix.currentRoomBeingPurged) {
|
||||
return;
|
||||
}
|
||||
|
||||
let eventIdFirst = null;
|
||||
let eventIdLast = null;
|
||||
if (!this.useVoiceMode && !this.useFileModeNonAdmin) {
|
||||
const container = this.chatContainer;
|
||||
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);
|
||||
this.rrTimer = setTimeout(() => { this.rrTimerElapsed() }, READ_RECEIPT_TIMEOUT);
|
||||
}
|
||||
},
|
||||
|
||||
rrTimerElapsed(eventIdFirst, eventIdLast) {
|
||||
rrTimerElapsed() {
|
||||
this.rrTimer = null;
|
||||
this.sendRR(eventIdFirst, eventIdLast);
|
||||
this.sendRR();
|
||||
this.restartRRTimer();
|
||||
},
|
||||
|
||||
sendRR(eventIdFirst, eventIdLast) {
|
||||
console.log("SEND RR", eventIdFirst, eventIdLast);
|
||||
if (eventIdLast && this.room) {
|
||||
var event = this.room.findEventById(eventIdLast);
|
||||
const index = this.events.indexOf(event);
|
||||
sendRR(onlyTheseEvents) {
|
||||
let lastTimestamp = 0;
|
||||
if (this.lastRR) {
|
||||
lastTimestamp = this.lastRR.getTs();
|
||||
}
|
||||
|
||||
// Walk backwards through visible events to the first one that is incoming
|
||||
//
|
||||
var lastTimestamp = 0;
|
||||
if (this.lastRR) {
|
||||
lastTimestamp = this.lastRR.getTs();
|
||||
}
|
||||
let eventsToConsider = onlyTheseEvents;
|
||||
if (!eventsToConsider) {
|
||||
// If events to consider is not given (used by Audio layout) then consider all visible events (with some restrictions).
|
||||
let visibleEventIds = util.findVisibleElements(this.chatContainer).filter(el => el.hasAttribute("eventId")).map(el => el.getAttribute("eventId"));
|
||||
|
||||
for (var i = index; i >= 0; i--) {
|
||||
event = this.events[i];
|
||||
if (event == this.lastRR || event.getTs() <= lastTimestamp) {
|
||||
// Already sent this or too old...
|
||||
break;
|
||||
}
|
||||
// Make sure it's not a local echo event...
|
||||
if (!event.getId().startsWith("~")) {
|
||||
// Send read receipt
|
||||
this.$matrix.matrixClient
|
||||
.sendReadReceipt(event)
|
||||
.then(() => {
|
||||
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
|
||||
eventsToConsider = this.events.filter(e => {
|
||||
if (e.getTs() > lastTimestamp &&
|
||||
// Make sure it's not a local echo event...
|
||||
!e.getId().startsWith("~")) {
|
||||
if (e.isRelation()) {
|
||||
return visibleEventIds.includes(e.getAssociatedId());
|
||||
} else if (e.getType() == "m.room.pinned_events") {
|
||||
// Ignore the pin event. If we pin an older message it does not automatically mean we have read the
|
||||
// messages between.
|
||||
return false;
|
||||
} else {
|
||||
return visibleEventIds.includes(e.getId());
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
// Stop iterating at first visible
|
||||
if (event.getId() == eventIdFirst) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
eventsToConsider.sort((a, b) => b.getTs() - a.getTs());
|
||||
if (eventsToConsider.length > 0 && eventsToConsider[0] != this.lastRR) {
|
||||
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) {
|
||||
if (!this.useVoiceMode) { // Voice mode has own autoplay handling inside "AudioLayout"!
|
||||
// Auto play consecutive audio messages, either incoming or sent.
|
||||
const filteredEvents = this.filteredEvents;
|
||||
const event = filteredEvents.find(e => e.getId() === matrixEventId);
|
||||
if (event && event.nextDisplayedEvent) {
|
||||
const nextEvent = event.nextDisplayedEvent;
|
||||
if (nextEvent.getContent().msgtype === "m.audio") {
|
||||
// Yes, audio event!
|
||||
this.$audioPlayer.play(nextEvent, this.timelineSet);
|
||||
let event = this.events.find(e => e.getId() === matrixEventId);
|
||||
if (event) {
|
||||
event = event.parentThread ? event.parentThread : event;
|
||||
if (event.nextDisplayedEvent) {
|
||||
const nextEvent = event.nextDisplayedEvent;
|
||||
if (nextEvent.getContent().msgtype === "m.audio") {
|
||||
// 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