@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
1414limitations under the License.
1515*/
1616
17- import React from 'react' ;
17+ import React , { ReactNode , useState } from 'react' ;
1818import classNames from 'classnames' ;
1919import { RoomMember } from 'matrix-js-sdk/src/matrix' ;
2020
@@ -28,12 +28,39 @@ interface Props {
2828 roomMember ?: RoomMember ;
2929 // use member text color as background
3030 useMemberColor ?: boolean ;
31+ tooltip ?: ReactNode ;
3132}
3233
34+ /**
35+ * Wrap with tooltip handlers when
36+ * tooltip is truthy
37+ */
38+ const OptionalTooltip : React . FC < {
39+ tooltip ?: ReactNode ; children : ReactNode ;
40+ } > = ( { tooltip, children } ) => {
41+ const [ isVisible , setIsVisible ] = useState ( false ) ;
42+ if ( ! tooltip ) {
43+ return < > { children } </ > ;
44+ }
45+
46+ const show = ( ) => setIsVisible ( true ) ;
47+ const hide = ( ) => setIsVisible ( false ) ;
48+ const toggleVisibility = ( e : React . MouseEvent < HTMLDivElement , MouseEvent > ) => {
49+ // stop map from zooming in on click
50+ e . stopPropagation ( ) ;
51+ setIsVisible ( ! isVisible ) ;
52+ } ;
53+
54+ return < div onMouseEnter = { show } onClick = { toggleVisibility } onMouseLeave = { hide } >
55+ { children }
56+ { isVisible && tooltip }
57+ </ div > ;
58+ } ;
59+
3360/**
3461 * Generic location marker
3562 */
36- const Marker = React . forwardRef < HTMLDivElement , Props > ( ( { id, roomMember, useMemberColor } , ref ) => {
63+ const Marker = React . forwardRef < HTMLDivElement , Props > ( ( { id, roomMember, useMemberColor, tooltip } , ref ) => {
3764 const memberColorClass = useMemberColor && roomMember ? getUserNameColorClass ( roomMember . userId ) : '' ;
3865 return < div
3966 ref = { ref }
@@ -42,17 +69,21 @@ const Marker = React.forwardRef<HTMLDivElement, Props>(({ id, roomMember, useMem
4269 "mx_Marker_defaultColor" : ! memberColorClass ,
4370 } ) }
4471 >
45- < div className = "mx_Marker_border" >
46- { roomMember ?
47- < MemberAvatar
48- member = { roomMember }
49- width = { 36 }
50- height = { 36 }
51- viewUserOnClick = { false }
52- />
53- : < LocationIcon className = "mx_Marker_icon" />
54- }
55- </ div >
72+ < OptionalTooltip tooltip = { tooltip } >
73+ < div className = "mx_Marker_border" >
74+ { roomMember ?
75+ < MemberAvatar
76+ member = { roomMember }
77+ width = { 36 }
78+ height = { 36 }
79+ viewUserOnClick = { false }
80+ // no mxid on hover when marker has tooltip
81+ hideTitle = { ! ! tooltip }
82+ />
83+ : < LocationIcon className = "mx_Marker_icon" />
84+ }
85+ </ div >
86+ </ OptionalTooltip >
5687 </ div > ;
5788} ) ;
5889
0 commit comments