@@ -14,6 +14,7 @@ import { Flex } from "../../../utils/Flex";
14
14
import { RoomListItemMenuView } from "./RoomListItemMenuView" ;
15
15
import { NotificationDecoration } from "../NotificationDecoration" ;
16
16
import { RoomAvatarView } from "../../avatars/RoomAvatarView" ;
17
+ import { useRovingTabIndex } from "../../../../accessibility/RovingTabIndex" ;
17
18
18
19
interface RoomListItemViewProps extends React . HTMLAttributes < HTMLButtonElement > {
19
20
/**
@@ -34,22 +35,27 @@ export const RoomListItemView = memo(function RoomListItemView({
34
35
isSelected,
35
36
...props
36
37
} : RoomListItemViewProps ) : JSX . Element {
38
+ const [ onFocus , isActive , ref ] = useRovingTabIndex ( ) ;
37
39
const vm = useRoomListItemViewModel ( room ) ;
38
40
39
41
const [ isHover , setIsHover ] = useState ( false ) ;
40
42
const [ isMenuOpen , setIsMenuOpen ] = useState ( false ) ;
41
43
// The compound menu in RoomListItemMenuView needs to be rendered when the hover menu is shown
42
44
// Using display: none; and then display:flex when hovered in CSS causes the menu to be misaligned
43
- const showHoverDecoration = ( isMenuOpen || isHover ) && vm . showHoverMenu ;
45
+ const showHoverDecoration = isMenuOpen || isHover ;
46
+ const showHoverMenu = showHoverDecoration && vm . showHoverMenu ;
44
47
45
- const isNotificationDecorationVisible = ! showHoverDecoration && vm . showNotificationDecoration ;
48
+ const isInvitation = vm . notificationState . invited ;
49
+ const isNotificationDecorationVisible = isInvitation || ( ! showHoverDecoration && vm . showNotificationDecoration ) ;
46
50
47
51
return (
48
52
< button
53
+ ref = { ref }
49
54
className = { classNames ( "mx_RoomListItemView" , {
50
55
mx_RoomListItemView_empty : ! isNotificationDecorationVisible && ! showHoverDecoration ,
51
56
mx_RoomListItemView_notification_decoration : isNotificationDecorationVisible ,
52
- mx_RoomListItemView_menu_open : showHoverDecoration ,
57
+ mx_RoomListItemView_hover : showHoverDecoration ,
58
+ mx_RoomListItemView_menu_open : showHoverMenu ,
53
59
mx_RoomListItemView_selected : isSelected ,
54
60
mx_RoomListItemView_bold : vm . isBold ,
55
61
} ) }
@@ -59,8 +65,12 @@ export const RoomListItemView = memo(function RoomListItemView({
59
65
onClick = { ( ) => vm . openRoom ( ) }
60
66
onMouseOver = { ( ) => setIsHover ( true ) }
61
67
onMouseOut = { ( ) => setIsHover ( false ) }
62
- onFocus = { ( ) => setIsHover ( true ) }
68
+ onFocus = { ( ) => {
69
+ setIsHover ( true ) ;
70
+ onFocus ( ) ;
71
+ } }
63
72
onBlur = { ( ) => setIsHover ( false ) }
73
+ tabIndex = { isActive ? 0 : - 1 }
64
74
{ ...props }
65
75
>
66
76
{ /* We need this extra div between the button and the content in order to add a padding which is not messing with the virtualized list */ }
@@ -79,7 +89,7 @@ export const RoomListItemView = memo(function RoomListItemView({
79
89
</ div >
80
90
< div className = "mx_RoomListItemView_messagePreview" > { vm . messagePreview } </ div >
81
91
</ div >
82
- { showHoverDecoration ? (
92
+ { showHoverMenu ? (
83
93
< RoomListItemMenuView
84
94
room = { room }
85
95
setMenuOpen = { ( isOpen ) => {
0 commit comments