@@ -70,8 +70,8 @@ interface IProps extends IPosition {
70
70
rightClick ?: boolean ;
71
71
// The Relations model from the JS SDK for reactions to `mxEvent`
72
72
reactions ?: Relations ;
73
- // A permalink to the event
74
- showPermalink ?: boolean ;
73
+ // A permalink to this event or an href of an anchor element the user has clicked
74
+ link ?: string ;
75
75
76
76
getRelationsForEvent ?: GetRelationsForEvent ;
77
77
}
@@ -227,7 +227,7 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
227
227
this . closeMenu ( ) ;
228
228
} ;
229
229
230
- private onPermalinkClick = ( e : React . MouseEvent ) : void => {
230
+ private onShareClick = ( e : React . MouseEvent ) : void => {
231
231
e . preventDefault ( ) ;
232
232
Modal . createTrackedDialog ( 'share room message dialog' , '' , ShareDialog , {
233
233
target : this . props . mxEvent ,
@@ -236,9 +236,9 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
236
236
this . closeMenu ( ) ;
237
237
} ;
238
238
239
- private onCopyPermalinkClick = ( e : ButtonEvent ) : void => {
239
+ private onCopyLinkClick = ( e : ButtonEvent ) : void => {
240
240
e . preventDefault ( ) ; // So that we don't open the permalink
241
- copyPlaintext ( this . getPermalink ( ) ) ;
241
+ copyPlaintext ( this . props . link ) ;
242
242
this . closeMenu ( ) ;
243
243
} ;
244
244
@@ -295,11 +295,6 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
295
295
} ) ;
296
296
}
297
297
298
- private getPermalink ( ) : string {
299
- if ( ! this . props . permalinkCreator ) return ;
300
- return this . props . permalinkCreator . forEvent ( this . props . mxEvent . getId ( ) ) ;
301
- }
302
-
303
298
private getUnsentReactions ( ) : MatrixEvent [ ] {
304
299
return this . getReactions ( e => e . status === EventStatus . NOT_SENT ) ;
305
300
}
@@ -318,11 +313,11 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
318
313
public render ( ) : JSX . Element {
319
314
const cli = MatrixClientPeg . get ( ) ;
320
315
const me = cli . getUserId ( ) ;
321
- const { mxEvent, rightClick, showPermalink , eventTileOps, reactions, collapseReplyChain } = this . props ;
316
+ const { mxEvent, rightClick, link , eventTileOps, reactions, collapseReplyChain } = this . props ;
322
317
const eventStatus = mxEvent . status ;
323
318
const unsentReactionsCount = this . getUnsentReactions ( ) . length ;
324
319
const contentActionable = isContentActionable ( mxEvent ) ;
325
- const permalink = this . getPermalink ( ) ;
320
+ const permalink = this . props . permalinkCreator ?. forEvent ( this . props . mxEvent . getId ( ) ) ;
326
321
// status is SENT before remote-echo, null after
327
322
const isSent = ! eventStatus || eventStatus === EventStatus . SENT ;
328
323
const { timelineRenderingType, canReact, canSendMessages } = this . context ;
@@ -420,17 +415,13 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
420
415
if ( permalink ) {
421
416
permalinkButton = (
422
417
< IconizedContextMenuOption
423
- iconClassName = { showPermalink
424
- ? "mx_MessageContextMenu_iconCopy"
425
- : "mx_MessageContextMenu_iconPermalink"
426
- }
427
- onClick = { showPermalink ? this . onCopyPermalinkClick : this . onPermalinkClick }
428
- label = { showPermalink ? _t ( 'Copy link' ) : _t ( 'Share' ) }
418
+ iconClassName = "mx_MessageContextMenu_iconPermalink"
419
+ onClick = { this . onShareClick }
420
+ label = { _t ( 'Share' ) }
429
421
element = "a"
430
422
{
431
423
// XXX: Typescript signature for AccessibleButton doesn't work properly for non-inputs like `a`
432
424
...{
433
-
434
425
href : permalink ,
435
426
target : "_blank" ,
436
427
rel : "noreferrer noopener" ,
@@ -508,6 +499,26 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
508
499
) ;
509
500
}
510
501
502
+ let copyLinkButton : JSX . Element ;
503
+ if ( link ) {
504
+ copyLinkButton = (
505
+ < IconizedContextMenuOption
506
+ iconClassName = "mx_MessageContextMenu_iconCopy"
507
+ onClick = { this . onCopyLinkClick }
508
+ label = { _t ( 'Copy link' ) }
509
+ element = "a"
510
+ {
511
+ // XXX: Typescript signature for AccessibleButton doesn't work properly for non-inputs like `a`
512
+ ...{
513
+ href : link ,
514
+ target : "_blank" ,
515
+ rel : "noreferrer noopener" ,
516
+ }
517
+ }
518
+ />
519
+ ) ;
520
+ }
521
+
511
522
let copyButton : JSX . Element ;
512
523
if ( rightClick && getSelectedText ( ) ) {
513
524
copyButton = (
@@ -566,10 +577,11 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
566
577
}
567
578
568
579
let nativeItemsList : JSX . Element ;
569
- if ( copyButton ) {
580
+ if ( copyButton || copyLinkButton ) {
570
581
nativeItemsList = (
571
582
< IconizedContextMenuOptionList >
572
583
{ copyButton }
584
+ { copyLinkButton }
573
585
</ IconizedContextMenuOptionList >
574
586
) ;
575
587
}
0 commit comments