@@ -24,10 +24,13 @@ import {
24
24
MatrixClient ,
25
25
MatrixEvent ,
26
26
MatrixEventEvent ,
27
+ RelationType ,
27
28
Room ,
29
+ RoomEvent ,
28
30
} from "../../src" ;
29
- import { Thread } from "../../src/models/thread" ;
31
+ import { FeatureSupport , Thread } from "../../src/models/thread" ;
30
32
import { ReEmitter } from "../../src/ReEmitter" ;
33
+ import { eventMapperFor } from "../../src/event-mapper" ;
31
34
32
35
describe ( "EventTimelineSet" , ( ) => {
33
36
const roomId = "!foo:bar" ;
@@ -202,6 +205,88 @@ describe("EventTimelineSet", () => {
202
205
expect ( liveTimeline . getEvents ( ) . length ) . toStrictEqual ( 0 ) ;
203
206
} ) ;
204
207
208
+ it ( "should allow edits to be added to thread timeline" , async ( ) => {
209
+ jest . spyOn ( client , "supportsExperimentalThreads" ) . mockReturnValue ( true ) ;
210
+ jest . spyOn ( client , "getEventMapper" ) . mockReturnValue ( eventMapperFor ( client , { } ) ) ;
211
+ Thread . hasServerSideSupport = FeatureSupport . Stable ;
212
+
213
+ const sender = "@alice:matrix.org" ;
214
+
215
+ const root = utils . mkEvent ( {
216
+ event : true ,
217
+ content : {
218
+ body : "Thread root" ,
219
+ } ,
220
+ type : EventType . RoomMessage ,
221
+ sender,
222
+ } ) ;
223
+ room . addLiveEvents ( [ root ] ) ;
224
+
225
+ const threadReply = utils . mkEvent ( {
226
+ event : true ,
227
+ content : {
228
+ "body" : "Thread reply" ,
229
+ "m.relates_to" : {
230
+ event_id : root . getId ( ) ! ,
231
+ rel_type : RelationType . Thread ,
232
+ } ,
233
+ } ,
234
+ type : EventType . RoomMessage ,
235
+ sender,
236
+ } ) ;
237
+
238
+ root . setUnsigned ( {
239
+ "m.relations" : {
240
+ [ RelationType . Thread ] : {
241
+ count : 1 ,
242
+ latest_event : {
243
+ content : threadReply . getContent ( ) ,
244
+ origin_server_ts : 5 ,
245
+ room_id : room . roomId ,
246
+ sender,
247
+ type : EventType . RoomMessage ,
248
+ event_id : threadReply . getId ( ) ! ,
249
+ user_id : sender ,
250
+ age : 1 ,
251
+ } ,
252
+ current_user_participated : true ,
253
+ } ,
254
+ } ,
255
+ } ) ;
256
+
257
+ const editToThreadReply = utils . mkEvent ( {
258
+ event : true ,
259
+ content : {
260
+ "body" : " * edit" ,
261
+ "m.new_content" : {
262
+ "body" : "edit" ,
263
+ "msgtype" : "m.text" ,
264
+ "org.matrix.msc1767.text" : "edit" ,
265
+ } ,
266
+ "m.relates_to" : {
267
+ event_id : threadReply . getId ( ) ! ,
268
+ rel_type : RelationType . Replace ,
269
+ } ,
270
+ } ,
271
+ type : EventType . RoomMessage ,
272
+ sender,
273
+ } ) ;
274
+
275
+ jest . spyOn ( client , "paginateEventTimeline" ) . mockImplementation ( async ( ) => {
276
+ thread . timelineSet . getLiveTimeline ( ) . addEvent ( threadReply , { toStartOfTimeline : true } ) ;
277
+ return true ;
278
+ } ) ;
279
+ jest . spyOn ( client , "relations" ) . mockResolvedValue ( {
280
+ events : [ ] ,
281
+ } ) ;
282
+
283
+ const thread = room . createThread ( root . getId ( ) ! , root , [ threadReply , editToThreadReply ] , false ) ;
284
+ thread . once ( RoomEvent . TimelineReset , ( ) => {
285
+ const lastEvent = thread . timeline . at ( - 1 ) ! ;
286
+ expect ( lastEvent . getContent ( ) . body ) . toBe ( " * edit" ) ;
287
+ } ) ;
288
+ } ) ;
289
+
205
290
describe ( "non-room timeline" , ( ) => {
206
291
it ( "Adds event to timeline" , ( ) => {
207
292
const nonRoomEventTimelineSet = new EventTimelineSet (
0 commit comments