Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 99543a7

Browse files
Implement changes to MSC2285 (private read receipts) (#7993)
1 parent eca8494 commit 99543a7

File tree

4 files changed

+16
-9
lines changed

4 files changed

+16
-9
lines changed

src/components/structures/MessagePanel.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { MatrixEvent } from 'matrix-js-sdk/src/models/event';
2323
import { Relations } from "matrix-js-sdk/src/models/relations";
2424
import { logger } from 'matrix-js-sdk/src/logger';
2525
import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state";
26+
import { ReceiptType } from "matrix-js-sdk/src/@types/read_receipts";
2627
import { M_BEACON_INFO } from 'matrix-js-sdk/src/@types/beacon';
2728

2829
import shouldHideEvent from '../../shouldHideEvent';
@@ -847,7 +848,7 @@ export default class MessagePanel extends React.Component<IProps, IState> {
847848
}
848849
const receipts: IReadReceiptProps[] = [];
849850
room.getReceiptsForEvent(event).forEach((r) => {
850-
if (!r.userId || r.type !== "m.read" || r.userId === myUserId) {
851+
if (!r.userId || ![ReceiptType.Read, ReceiptType.ReadPrivate].includes(r.type) || r.userId === myUserId) {
851852
return; // ignore non-read receipts and receipts from self.
852853
}
853854
if (MatrixClientPeg.get().isUserIgnored(r.userId)) {

src/components/structures/TimelinePanel.tsx

+4-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { debounce } from 'lodash';
2828
import { logger } from "matrix-js-sdk/src/logger";
2929
import { ClientEvent } from "matrix-js-sdk/src/client";
3030
import { Thread } from 'matrix-js-sdk/src/models/thread';
31+
import { ReceiptType } from "matrix-js-sdk/src/@types/read_receipts";
3132

3233
import SettingsStore from "../../settings/SettingsStore";
3334
import { Layout } from "../../settings/enums/Layout";
@@ -862,14 +863,14 @@ class TimelinePanel extends React.Component<IProps, IState> {
862863
MatrixClientPeg.get().setRoomReadMarkers(
863864
roomId,
864865
this.state.readMarkerEventId,
865-
lastReadEvent, // Could be null, in which case no RR is sent
866-
{ hidden: hiddenRR },
866+
hiddenRR ? null : lastReadEvent, // Could be null, in which case no RR is sent
867+
lastReadEvent, // Could be null, in which case no private RR is sent
867868
).catch((e) => {
868869
// /read_markers API is not implemented on this HS, fallback to just RR
869870
if (e.errcode === 'M_UNRECOGNIZED' && lastReadEvent) {
870871
return MatrixClientPeg.get().sendReadReceipt(
871872
lastReadEvent,
872-
{},
873+
hiddenRR ? ReceiptType.ReadPrivate : ReceiptType.Read,
873874
).catch((e) => {
874875
logger.error(e);
875876
this.lastRRSentEventId = undefined;

src/utils/Receipt.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17+
import { ReceiptType } from "matrix-js-sdk/src/@types/read_receipts";
1718
import { MatrixEvent } from "matrix-js-sdk/src/models/event";
1819

1920
/**
@@ -29,9 +30,8 @@ export function findReadReceiptFromUserId(receiptEvent: MatrixEvent, userId: str
2930
const receiptKeys = Object.keys(receiptEvent.getContent());
3031
for (let i = 0; i < receiptKeys.length; ++i) {
3132
const rcpt = receiptEvent.getContent()[receiptKeys[i]];
32-
if (rcpt['m.read'] && rcpt['m.read'][userId]) {
33-
return rcpt;
34-
}
33+
if (rcpt[ReceiptType.Read]?.[userId]) return rcpt;
34+
if (rcpt[ReceiptType.ReadPrivate]?.[userId]) return rcpt;
3535
}
3636

3737
return null;

src/utils/read-receipts.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ limitations under the License.
1616

1717
import { MatrixEvent } from "matrix-js-sdk/src/models/event";
1818
import { MatrixClient } from "matrix-js-sdk/src/client";
19+
import { ReceiptType } from "matrix-js-sdk/src/@types/read_receipts";
1920

2021
/**
2122
* Determines if a read receipt update event includes the client's own user.
@@ -26,8 +27,12 @@ import { MatrixClient } from "matrix-js-sdk/src/client";
2627
export function readReceiptChangeIsFor(event: MatrixEvent, client: MatrixClient): boolean {
2728
const myUserId = client.getUserId();
2829
for (const eventId of Object.keys(event.getContent())) {
29-
const receiptUsers = Object.keys(event.getContent()[eventId]['m.read'] || {});
30-
if (receiptUsers.includes(myUserId)) {
30+
const readReceiptUsers = Object.keys(event.getContent()[eventId][ReceiptType.Read] || {});
31+
if (readReceiptUsers.includes(myUserId)) {
32+
return true;
33+
}
34+
const readPrivateReceiptUsers = Object.keys(event.getContent()[eventId][ReceiptType.ReadPrivate] || {});
35+
if (readPrivateReceiptUsers.includes(myUserId)) {
3136
return true;
3237
}
3338
}

0 commit comments

Comments
 (0)