97 lines
3.1 KiB
TypeScript
97 lines
3.1 KiB
TypeScript
/*
|
|
Copyright 2022 The Matrix.org Foundation C.I.C.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
import { MatrixClient, MatrixEvent, RelationType, Room } from "matrix-js-sdk";
|
|
import { Thread } from "matrix-js-sdk/src/models/thread";
|
|
|
|
import { mkMessage, MessageEventProps } from "./test-utils";
|
|
|
|
export const makeThreadEvent = ({ rootEventId, replyToEventId, ...props }: MessageEventProps & {
|
|
rootEventId: string; replyToEventId: string;
|
|
}): MatrixEvent => mkMessage({
|
|
...props,
|
|
relatesTo: {
|
|
event_id: rootEventId,
|
|
rel_type: RelationType.Thread,
|
|
['m.in_reply_to']: {
|
|
event_id: replyToEventId,
|
|
},
|
|
},
|
|
});
|
|
|
|
type MakeThreadEventsProps = {
|
|
roomId: Room["roomId"];
|
|
// root message user id
|
|
authorId: string;
|
|
// user ids of thread replies
|
|
// cycled through until thread length is fulfilled
|
|
participantUserIds: string[];
|
|
// number of messages in the thread, root message included
|
|
// optional, default 2
|
|
length?: number;
|
|
ts?: number;
|
|
// provide to set current_user_participated accurately
|
|
currentUserId?: string;
|
|
};
|
|
|
|
export const makeThreadEvents = ({
|
|
roomId, authorId, participantUserIds, length = 2, ts = 1, currentUserId,
|
|
}: MakeThreadEventsProps): { rootEvent: MatrixEvent, events: MatrixEvent[] } => {
|
|
const rootEvent = mkMessage({
|
|
user: authorId,
|
|
event: true,
|
|
room: roomId,
|
|
msg: 'root event message ' + Math.random(),
|
|
ts,
|
|
});
|
|
|
|
const rootEventId = rootEvent.getId();
|
|
const events = [rootEvent];
|
|
|
|
for (let i = 1; i < length; i++) {
|
|
const prevEvent = events[i - 1];
|
|
const replyToEventId = prevEvent.getId();
|
|
const user = participantUserIds[i % participantUserIds.length];
|
|
events.push(makeThreadEvent({
|
|
user,
|
|
room: roomId,
|
|
event: true,
|
|
msg: `reply ${i} by ${user}`,
|
|
rootEventId,
|
|
replyToEventId,
|
|
// replies are 1ms after each other
|
|
ts: ts + i,
|
|
}));
|
|
}
|
|
|
|
rootEvent.setUnsigned({
|
|
"m.relations": {
|
|
[RelationType.Thread]: {
|
|
latest_event: events[events.length - 1],
|
|
count: length,
|
|
current_user_participated: [...participantUserIds, authorId].includes(currentUserId),
|
|
},
|
|
},
|
|
});
|
|
|
|
return { rootEvent, events };
|
|
};
|
|
|
|
export const makeThread = (client: MatrixClient, room: Room, props: MakeThreadEventsProps): Thread => {
|
|
const { rootEvent, events } = makeThreadEvents(props);
|
|
return new Thread(rootEvent, { initialEvents: events, room, client });
|
|
};
|