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