1
1
/*
2
- Copyright 2021 The Matrix.org Foundation C.I.C.
2
+ Copyright 2021, 2023 The Matrix.org Foundation C.I.C.
3
3
4
4
Licensed under the Apache License, Version 2.0 (the "License");
5
5
you may not use this file except in compliance with the License.
@@ -66,7 +66,7 @@ export default class HTMLExporter extends Exporter {
66
66
}
67
67
68
68
protected async getRoomAvatar ( ) : Promise < ReactNode > {
69
- let blob : Blob ;
69
+ let blob : Blob | undefined = undefined ;
70
70
const avatarUrl = Avatar . avatarUrlForRoom ( this . room , 32 , 32 , "crop" ) ;
71
71
const avatarPath = "room.png" ;
72
72
if ( avatarUrl ) {
@@ -85,7 +85,7 @@ export default class HTMLExporter extends Exporter {
85
85
height = { 32 }
86
86
name = { this . room . name }
87
87
title = { this . room . name }
88
- url = { blob ? avatarPath : null }
88
+ url = { blob ? avatarPath : "" }
89
89
resizeMethod = "crop"
90
90
/>
91
91
) ;
@@ -96,9 +96,9 @@ export default class HTMLExporter extends Exporter {
96
96
const roomAvatar = await this . getRoomAvatar ( ) ;
97
97
const exportDate = formatFullDateNoDayNoTime ( new Date ( ) ) ;
98
98
const creator = this . room . currentState . getStateEvents ( EventType . RoomCreate , "" ) ?. getSender ( ) ;
99
- const creatorName = this . room ? .getMember ( creator ) ?. rawDisplayName || creator ;
100
- const exporter = this . client . getUserId ( ) ;
101
- const exporterName = this . room ? .getMember ( exporter ) ?. rawDisplayName ;
99
+ const creatorName = ( creator ? this . room . getMember ( creator ) ?. rawDisplayName : creator ) || creator ;
100
+ const exporter = this . client . getUserId ( ) ! ;
101
+ const exporterName = this . room . getMember ( exporter ) ?. rawDisplayName ;
102
102
const topic = this . room . currentState . getStateEvents ( EventType . RoomTopic , "" ) ?. getContent ( ) ?. topic || "" ;
103
103
const createdText = _t ( "%(creatorName)s created this room." , {
104
104
creatorName,
@@ -217,20 +217,19 @@ export default class HTMLExporter extends Exporter {
217
217
</html>` ;
218
218
}
219
219
220
- protected getAvatarURL ( event : MatrixEvent ) : string {
220
+ protected getAvatarURL ( event : MatrixEvent ) : string | undefined {
221
221
const member = event . sender ;
222
- return (
223
- member . getMxcAvatarUrl ( ) && mediaFromMxc ( member . getMxcAvatarUrl ( ) ) . getThumbnailOfSourceHttp ( 30 , 30 , "crop" )
224
- ) ;
222
+ const avatarUrl = member ?. getMxcAvatarUrl ( ) ;
223
+ return avatarUrl ? mediaFromMxc ( avatarUrl ) . getThumbnailOfSourceHttp ( 30 , 30 , "crop" ) : undefined ;
225
224
}
226
225
227
226
protected async saveAvatarIfNeeded ( event : MatrixEvent ) : Promise < void > {
228
- const member = event . sender ;
227
+ const member = event . sender ! ;
229
228
if ( ! this . avatars . has ( member . userId ) ) {
230
229
try {
231
230
const avatarUrl = this . getAvatarURL ( event ) ;
232
231
this . avatars . set ( member . userId , true ) ;
233
- const image = await fetch ( avatarUrl ) ;
232
+ const image = await fetch ( avatarUrl ! ) ;
234
233
const blob = await image . blob ( ) ;
235
234
this . addFile ( `users/${ member . userId . replace ( / : / g, "-" ) } .png` , blob ) ;
236
235
} catch ( err ) {
@@ -243,15 +242,15 @@ export default class HTMLExporter extends Exporter {
243
242
const ts = event . getTs ( ) ;
244
243
const dateSeparator = (
245
244
< li key = { ts } >
246
- < DateSeparator forExport = { true } key = { ts } roomId = { event . getRoomId ( ) } ts = { ts } />
245
+ < DateSeparator forExport = { true } key = { ts } roomId = { event . getRoomId ( ) ! } ts = { ts } />
247
246
</ li >
248
247
) ;
249
248
return renderToStaticMarkup ( dateSeparator ) ;
250
249
}
251
250
252
- protected async needsDateSeparator ( event : MatrixEvent , prevEvent : MatrixEvent ) : Promise < boolean > {
253
- if ( prevEvent == null ) return true ;
254
- return wantsDateSeparator ( prevEvent . getDate ( ) , event . getDate ( ) ) ;
251
+ protected async needsDateSeparator ( event : MatrixEvent , prevEvent : MatrixEvent | null ) : Promise < boolean > {
252
+ if ( ! prevEvent ) return true ;
253
+ return wantsDateSeparator ( prevEvent . getDate ( ) || undefined , event . getDate ( ) || undefined ) ;
255
254
}
256
255
257
256
public getEventTile ( mxEv : MatrixEvent , continuation : boolean ) : JSX . Element {
@@ -264,9 +263,7 @@ export default class HTMLExporter extends Exporter {
264
263
isRedacted = { mxEv . isRedacted ( ) }
265
264
replacingEventId = { mxEv . replacingEventId ( ) }
266
265
forExport = { true }
267
- readReceipts = { null }
268
266
alwaysShowTimestamps = { true }
269
- readReceiptMap = { null }
270
267
showUrlPreview = { false }
271
268
checkUnmounting = { ( ) => false }
272
269
isTwelveHour = { false }
@@ -275,7 +272,6 @@ export default class HTMLExporter extends Exporter {
275
272
permalinkCreator = { this . permalinkCreator }
276
273
lastSuccessful = { false }
277
274
isSelectedEvent = { false }
278
- getRelationsForEvent = { null }
279
275
showReactions = { false }
280
276
layout = { Layout . Group }
281
277
showReadReceipts = { false }
@@ -286,7 +282,8 @@ export default class HTMLExporter extends Exporter {
286
282
}
287
283
288
284
protected async getEventTileMarkup ( mxEv : MatrixEvent , continuation : boolean , filePath ?: string ) : Promise < string > {
289
- const hasAvatar = ! ! this . getAvatarURL ( mxEv ) ;
285
+ const avatarUrl = this . getAvatarURL ( mxEv ) ;
286
+ const hasAvatar = ! ! avatarUrl ;
290
287
if ( hasAvatar ) await this . saveAvatarIfNeeded ( mxEv ) ;
291
288
const EventTile = this . getEventTile ( mxEv , continuation ) ;
292
289
let eventTileMarkup : string ;
@@ -312,8 +309,8 @@ export default class HTMLExporter extends Exporter {
312
309
eventTileMarkup = eventTileMarkup . replace ( / < s p a n c l a s s = " m x _ M F i l e B o d y _ i n f o _ i c o n " .* ?> .* ?< \/ s p a n > / , "" ) ;
313
310
if ( hasAvatar ) {
314
311
eventTileMarkup = eventTileMarkup . replace (
315
- encodeURI ( this . getAvatarURL ( mxEv ) ) . replace ( / & / g, "&" ) ,
316
- `users/${ mxEv . sender . userId . replace ( / : / g, "-" ) } .png` ,
312
+ encodeURI ( avatarUrl ) . replace ( / & / g, "&" ) ,
313
+ `users/${ mxEv . sender ! . userId . replace ( / : / g, "-" ) } .png` ,
317
314
) ;
318
315
}
319
316
return eventTileMarkup ;
@@ -403,7 +400,7 @@ export default class HTMLExporter extends Exporter {
403
400
if ( this . cancelled ) return this . cleanUp ( ) ;
404
401
if ( ! haveRendererForEvent ( event , false ) ) continue ;
405
402
406
- content += this . needsDateSeparator ( event , prevEvent ) ? this . getDateSeparator ( event ) : "" ;
403
+ content += ( await this . needsDateSeparator ( event , prevEvent ) ) ? this . getDateSeparator ( event ) : "" ;
407
404
const shouldBeJoined =
408
405
! this . needsDateSeparator ( event , prevEvent ) &&
409
406
shouldFormContinuation ( prevEvent , event , false , this . threadsEnabled ) ;
0 commit comments