@@ -17,18 +17,24 @@ limitations under the License.
1717import React , { ReactElement , useState } from "react" ;
1818import classNames from "classnames" ;
1919import { Room } from "matrix-js-sdk/src/models/room" ;
20+ import { RoomMember } from "matrix-js-sdk/src/matrix" ;
2021
2122import { MatrixClientPeg } from "../../../MatrixClientPeg" ;
2223import MatrixClientContext from "../../../contexts/MatrixClientContext" ;
2324import Tooltip , { Alignment } from "../elements/Tooltip" ;
2425import { usePermalink } from "../../../hooks/usePermalink" ;
2526import RoomAvatar from "../avatars/RoomAvatar" ;
2627import MemberAvatar from "../avatars/MemberAvatar" ;
28+ import { _t } from "../../../languageHandler" ;
29+ import { Icon as LinkIcon } from "../../../../res/img/element-icons/room/composer/link.svg" ;
30+ import { Icon as UserIcon } from "../../../../res/img/compound/user.svg" ;
2731
2832export enum PillType {
2933 UserMention = "TYPE_USER_MENTION" ,
3034 RoomMention = "TYPE_ROOM_MENTION" ,
3135 AtRoomMention = "TYPE_AT_ROOM_MENTION" , // '@room' mention
36+ EventInSameRoom = "TYPE_EVENT_IN_SAME_ROOM" ,
37+ EventInOtherRoom = "TYPE_EVENT_IN_OTHER_ROOM" ,
3238}
3339
3440export const pillRoomNotifPos = ( text : string ) : number => {
@@ -39,6 +45,34 @@ export const pillRoomNotifLen = (): number => {
3945 return "@room" . length ;
4046} ;
4147
48+ const PillRoomAvatar : React . FC < {
49+ shouldShowPillAvatar : boolean ;
50+ room : Room | null ;
51+ } > = ( { shouldShowPillAvatar, room } ) => {
52+ if ( ! shouldShowPillAvatar ) {
53+ return null ;
54+ }
55+
56+ if ( room ) {
57+ return < RoomAvatar room = { room } width = { 16 } height = { 16 } aria-hidden = "true" /> ;
58+ }
59+ return < LinkIcon className = "mx_Pill_LinkIcon mx_BaseAvatar mx_BaseAvatar_image" /> ;
60+ } ;
61+
62+ const PillMemberAvatar : React . FC < {
63+ shouldShowPillAvatar : boolean ;
64+ member : RoomMember | null ;
65+ } > = ( { shouldShowPillAvatar, member } ) => {
66+ if ( ! shouldShowPillAvatar ) {
67+ return null ;
68+ }
69+
70+ if ( member ) {
71+ return < MemberAvatar member = { member } width = { 16 } height = { 16 } aria-hidden = "true" hideTitle /> ;
72+ }
73+ return < UserIcon className = "mx_Pill_UserIcon mx_BaseAvatar mx_BaseAvatar_image" /> ;
74+ } ;
75+
4276export interface PillProps {
4377 // The Type of this Pill. If url is given, this is auto-detected.
4478 type ?: PillType ;
@@ -70,6 +104,7 @@ export const Pill: React.FC<PillProps> = ({ type: propType, url, inMessage, room
70104 mx_SpacePill : type === "space" ,
71105 mx_UserPill : type === PillType . UserMention ,
72106 mx_UserPill_me : resourceId === MatrixClientPeg . get ( ) . getUserId ( ) ,
107+ mx_EventPill : type === PillType . EventInOtherRoom || type === PillType . EventInSameRoom ,
73108 } ) ;
74109
75110 const onMouseOver = ( ) : void => {
@@ -81,28 +116,40 @@ export const Pill: React.FC<PillProps> = ({ type: propType, url, inMessage, room
81116 } ;
82117
83118 const tip = hover && resourceId ? < Tooltip label = { resourceId } alignment = { Alignment . Right } /> : null ;
84- let avatar : ReactElement | null = null ;
119+ let content : ( ReactElement | string ) [ ] = [ ] ;
120+ const textElement = < span className = "mx_Pill_text" > { text } </ span > ;
85121
86122 switch ( type ) {
123+ case PillType . EventInOtherRoom :
124+ {
125+ const avatar = < PillRoomAvatar shouldShowPillAvatar = { shouldShowPillAvatar } room = { targetRoom } /> ;
126+ content = [ _t ( "Message in" ) , avatar || " " , textElement ] ;
127+ }
128+ break ;
129+ case PillType . EventInSameRoom :
130+ {
131+ const avatar = < PillMemberAvatar shouldShowPillAvatar = { shouldShowPillAvatar } member = { member } /> ;
132+ content = [ _t ( "Message from" ) , avatar || " " , textElement ] ;
133+ }
134+ break ;
87135 case PillType . AtRoomMention :
88136 case PillType . RoomMention :
89137 case "space" :
90- avatar = targetRoom ? < RoomAvatar room = { targetRoom } width = { 16 } height = { 16 } aria-hidden = "true" /> : null ;
138+ {
139+ const avatar = < PillRoomAvatar shouldShowPillAvatar = { shouldShowPillAvatar } room = { targetRoom } /> ;
140+ content = [ avatar , textElement ] ;
141+ }
91142 break ;
92143 case PillType . UserMention :
93- avatar = < MemberAvatar member = { member } width = { 16 } height = { 16 } aria-hidden = "true" hideTitle /> ;
144+ {
145+ const avatar = < PillMemberAvatar shouldShowPillAvatar = { shouldShowPillAvatar } member = { member } /> ;
146+ content = [ avatar , textElement ] ;
147+ }
94148 break ;
95149 default :
96150 return null ;
97151 }
98152
99- const content = (
100- < >
101- { shouldShowPillAvatar && avatar }
102- < span className = "mx_Pill_linkText" > { text } </ span >
103- </ >
104- ) ;
105-
106153 return (
107154 < bdi >
108155 < MatrixClientContext . Provider value = { MatrixClientPeg . get ( ) } >
0 commit comments