@@ -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,55 @@ 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 | null = null ;
85120
86121 switch ( type ) {
122+ case PillType . EventInOtherRoom :
123+ {
124+ const avatar = < PillRoomAvatar shouldShowPillAvatar = { shouldShowPillAvatar } room = { targetRoom } /> ;
125+ content = (
126+ < >
127+ { _t ( "Message in" ) }
128+ { avatar || " " }
129+ { text }
130+ </ >
131+ ) ;
132+ }
133+ break ;
134+ case PillType . EventInSameRoom :
135+ {
136+ const avatar = < PillMemberAvatar shouldShowPillAvatar = { shouldShowPillAvatar } member = { member } /> ;
137+ content = (
138+ < >
139+ { _t ( "Message from" ) }
140+ { avatar || " " }
141+ { text }
142+ </ >
143+ ) ;
144+ }
145+ break ;
87146 case PillType . AtRoomMention :
88147 case PillType . RoomMention :
89148 case "space" :
90- avatar = targetRoom ? < RoomAvatar room = { targetRoom } width = { 16 } height = { 16 } aria-hidden = "true" /> : null ;
149+ content = (
150+ < >
151+ < PillRoomAvatar shouldShowPillAvatar = { shouldShowPillAvatar } room = { targetRoom } />
152+ { text }
153+ </ >
154+ ) ;
91155 break ;
92156 case PillType . UserMention :
93- avatar = < MemberAvatar member = { member } width = { 16 } height = { 16 } aria-hidden = "true" hideTitle /> ;
157+ content = (
158+ < >
159+ < PillMemberAvatar shouldShowPillAvatar = { shouldShowPillAvatar } member = { member } />
160+ { text }
161+ </ >
162+ ) ;
94163 break ;
95164 default :
96165 return null ;
97166 }
98167
99- const content = (
100- < >
101- { shouldShowPillAvatar && avatar }
102- < span className = "mx_Pill_linkText" > { text } </ span >
103- </ >
104- ) ;
105-
106168 return (
107169 < bdi >
108170 < MatrixClientContext . Provider value = { MatrixClientPeg . get ( ) } >
@@ -114,12 +176,12 @@ export const Pill: React.FC<PillProps> = ({ type: propType, url, inMessage, room
114176 onMouseOver = { onMouseOver }
115177 onMouseLeave = { onMouseLeave }
116178 >
117- { content }
179+ < span className = "mx_Pill_content" > { content } </ span >
118180 { tip }
119181 </ a >
120182 ) : (
121183 < span className = { classes } onMouseOver = { onMouseOver } onMouseLeave = { onMouseLeave } >
122- { content }
184+ < span className = "mx_Pill_content" > { content } </ span >
123185 { tip }
124186 </ span >
125187 ) }
0 commit comments