@@ -70,8 +70,8 @@ interface IProps extends IPosition {
7070 rightClick ?: boolean ;
7171 // The Relations model from the JS SDK for reactions to `mxEvent`
7272 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 ;
7575
7676 getRelationsForEvent ?: GetRelationsForEvent ;
7777}
@@ -227,7 +227,7 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
227227 this . closeMenu ( ) ;
228228 } ;
229229
230- private onPermalinkClick = ( e : React . MouseEvent ) : void => {
230+ private onShareClick = ( e : React . MouseEvent ) : void => {
231231 e . preventDefault ( ) ;
232232 Modal . createTrackedDialog ( 'share room message dialog' , '' , ShareDialog , {
233233 target : this . props . mxEvent ,
@@ -236,9 +236,9 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
236236 this . closeMenu ( ) ;
237237 } ;
238238
239- private onCopyPermalinkClick = ( e : ButtonEvent ) : void => {
239+ private onCopyLinkClick = ( e : ButtonEvent ) : void => {
240240 e . preventDefault ( ) ; // So that we don't open the permalink
241- copyPlaintext ( this . getPermalink ( ) ) ;
241+ copyPlaintext ( this . props . link ) ;
242242 this . closeMenu ( ) ;
243243 } ;
244244
@@ -295,11 +295,6 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
295295 } ) ;
296296 }
297297
298- private getPermalink ( ) : string {
299- if ( ! this . props . permalinkCreator ) return ;
300- return this . props . permalinkCreator . forEvent ( this . props . mxEvent . getId ( ) ) ;
301- }
302-
303298 private getUnsentReactions ( ) : MatrixEvent [ ] {
304299 return this . getReactions ( e => e . status === EventStatus . NOT_SENT ) ;
305300 }
@@ -318,11 +313,11 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
318313 public render ( ) : JSX . Element {
319314 const cli = MatrixClientPeg . get ( ) ;
320315 const me = cli . getUserId ( ) ;
321- const { mxEvent, rightClick, showPermalink , eventTileOps, reactions, collapseReplyChain } = this . props ;
316+ const { mxEvent, rightClick, link , eventTileOps, reactions, collapseReplyChain } = this . props ;
322317 const eventStatus = mxEvent . status ;
323318 const unsentReactionsCount = this . getUnsentReactions ( ) . length ;
324319 const contentActionable = isContentActionable ( mxEvent ) ;
325- const permalink = this . getPermalink ( ) ;
320+ const permalink = this . props . permalinkCreator ?. forEvent ( this . props . mxEvent . getId ( ) ) ;
326321 // status is SENT before remote-echo, null after
327322 const isSent = ! eventStatus || eventStatus === EventStatus . SENT ;
328323 const { timelineRenderingType, canReact, canSendMessages } = this . context ;
@@ -420,17 +415,13 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
420415 if ( permalink ) {
421416 permalinkButton = (
422417 < 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' ) }
429421 element = "a"
430422 {
431423 // XXX: Typescript signature for AccessibleButton doesn't work properly for non-inputs like `a`
432424 ...{
433-
434425 href : permalink ,
435426 target : "_blank" ,
436427 rel : "noreferrer noopener" ,
@@ -508,6 +499,26 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
508499 ) ;
509500 }
510501
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+
511522 let copyButton : JSX . Element ;
512523 if ( rightClick && getSelectedText ( ) ) {
513524 copyButton = (
@@ -566,10 +577,11 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
566577 }
567578
568579 let nativeItemsList : JSX . Element ;
569- if ( copyButton ) {
580+ if ( copyButton || copyLinkButton ) {
570581 nativeItemsList = (
571582 < IconizedContextMenuOptionList >
572583 { copyButton }
584+ { copyLinkButton }
573585 </ IconizedContextMenuOptionList >
574586 ) ;
575587 }
0 commit comments