fix: clean up call nav/call view console warnings

This commit is contained in:
hazre 2026-02-11 15:18:16 +01:00
parent 47f1d1183a
commit 9dbe53a36a
No known key found for this signature in database
4 changed files with 94 additions and 91 deletions

View file

@ -209,9 +209,13 @@ export function CallView({ room }: { room: Room }) {
}} }}
> >
<CallViewUserGrid> <CallViewUserGrid>
{callMembers {callMembers.slice(0, 6).map((callMember) => (
.map((callMember) => <CallViewUser room={room} callMembership={callMember} />) <CallViewUser
.slice(0, 6)} key={callMember.membershipID}
room={room}
callMembership={callMember}
/>
))}
</CallViewUserGrid> </CallViewUserGrid>
<Box <Box

View file

@ -21,8 +21,8 @@ import {
} from 'folds'; } from 'folds';
import { useFocusWithin, useHover } from 'react-aria'; import { useFocusWithin, useHover } from 'react-aria';
import FocusTrap from 'focus-trap-react'; import FocusTrap from 'focus-trap-react';
import { useParams } from 'react-router-dom'; import { useNavigate, useParams } from 'react-router-dom';
import { NavButton, NavItem, NavItemContent, NavItemOptions, NavLink } from '../../components/nav'; import { NavButton, NavItem, NavItemContent, NavItemOptions } from '../../components/nav';
import { UnreadBadge, UnreadBadgeCenter } from '../../components/unread-badge'; import { UnreadBadge, UnreadBadgeCenter } from '../../components/unread-badge';
import { RoomAvatar, RoomIcon } from '../../components/room-avatar'; import { RoomAvatar, RoomIcon } from '../../components/room-avatar';
import { getDirectRoomAvatarUrl, getRoomAvatarUrl } from '../../utils/room'; import { getDirectRoomAvatarUrl, getRoomAvatarUrl } from '../../utils/room';
@ -256,6 +256,7 @@ export function RoomNavItem({
const isActiveCall = isActiveCallReady && activeCallRoomId === room.roomId; const isActiveCall = isActiveCallReady && activeCallRoomId === room.roomId;
const callMemberships = useCallMembers(mx, room.roomId); const callMemberships = useCallMembers(mx, room.roomId);
const { navigateRoom } = useRoomNavigate(); const { navigateRoom } = useRoomNavigate();
const navigate = useNavigate();
const { roomIdOrAlias: viewedRoomId } = useParams(); const { roomIdOrAlias: viewedRoomId } = useParams();
const screenSize = useScreenSizeContext(); const screenSize = useScreenSizeContext();
const isMobile = screenSize === ScreenSize.Mobile; const isMobile = screenSize === ScreenSize.Mobile;
@ -275,13 +276,6 @@ export function RoomNavItem({
}; };
const handleNavItemClick: MouseEventHandler<HTMLElement> = (evt) => { const handleNavItemClick: MouseEventHandler<HTMLElement> = (evt) => {
const target = evt.target as HTMLElement;
const chatButton = (evt.currentTarget as HTMLElement).querySelector(
'[data-testid="chat-button"]'
);
if (chatButton && chatButton.contains(target)) {
return;
}
if (room.isCallRoom()) { if (room.isCallRoom()) {
if (!isMobile) { if (!isMobile) {
if (!isActiveCall) { if (!isActiveCall) {
@ -308,6 +302,7 @@ export function RoomNavItem({
evt.stopPropagation(); evt.stopPropagation();
if (!isChatOpen) toggleChat(); if (!isChatOpen) toggleChat();
setViewedCallRoomId(room.roomId); setViewedCallRoomId(room.roomId);
navigate(linkPath);
}; };
const optionsVisible = hover || !!menuAnchor; const optionsVisible = hover || !!menuAnchor;
@ -398,86 +393,88 @@ export function RoomNavItem({
)} )}
</Box> </Box>
</NavItemContent> </NavItemContent>
{optionsVisible && (
<NavItemOptions>
<PopOut
id={`menu-${room.roomId}`}
aria-expanded={!!menuAnchor}
anchor={menuAnchor}
offset={menuAnchor?.width === 0 ? 0 : undefined}
alignOffset={menuAnchor?.width === 0 ? 0 : -5}
position="Bottom"
align={menuAnchor?.width === 0 ? 'Start' : 'End'}
content={
<FocusTrap
focusTrapOptions={{
initialFocus: false,
returnFocusOnDeactivate: false,
onDeactivate: () => setMenuAnchor(undefined),
clickOutsideDeactivates: true,
isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown',
isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp',
escapeDeactivates: stopPropagation,
}}
>
<RoomNavItemMenu
room={room}
requestClose={() => setMenuAnchor(undefined)}
notificationMode={notificationMode}
/>
</FocusTrap>
}
>
{room.isCallRoom() && (
<TooltipProvider
position="Bottom"
offset={4}
tooltip={
<Tooltip>
<Text>Open Chat</Text>
</Tooltip>
}
>
{(triggerRef) => (
<IconButton
ref={triggerRef}
data-testid="chat-button"
onClick={handleChatButtonClick}
aria-pressed={isChatOpen && selected}
aria-label="Open Chat"
variant="Background"
fill="None"
size="300"
radii="300"
>
<NavLink to={linkPath}>
<Icon size="50" src={Icons.Message} />
</NavLink>
</IconButton>
)}
</TooltipProvider>
)}
<IconButton
onClick={handleOpenMenu}
aria-pressed={!!menuAnchor}
aria-controls={`menu-${room.roomId}`}
aria-label="More Options"
variant="Background"
fill="None"
size="300"
radii="300"
>
<Icon size="50" src={Icons.VerticalDots} />
</IconButton>
</PopOut>
</NavItemOptions>
)}
</NavButton> </NavButton>
{optionsVisible && (
<NavItemOptions>
<PopOut
id={`menu-${room.roomId}`}
aria-expanded={!!menuAnchor}
anchor={menuAnchor}
offset={menuAnchor?.width === 0 ? 0 : undefined}
alignOffset={menuAnchor?.width === 0 ? 0 : -5}
position="Bottom"
align={menuAnchor?.width === 0 ? 'Start' : 'End'}
content={
<FocusTrap
focusTrapOptions={{
initialFocus: false,
returnFocusOnDeactivate: false,
onDeactivate: () => setMenuAnchor(undefined),
clickOutsideDeactivates: true,
isKeyForward: (evt: KeyboardEvent) => evt.key === 'ArrowDown',
isKeyBackward: (evt: KeyboardEvent) => evt.key === 'ArrowUp',
escapeDeactivates: stopPropagation,
}}
>
<RoomNavItemMenu
room={room}
requestClose={() => setMenuAnchor(undefined)}
notificationMode={notificationMode}
/>
</FocusTrap>
}
>
{room.isCallRoom() && (
<TooltipProvider
position="Bottom"
offset={4}
tooltip={
<Tooltip>
<Text>Open Chat</Text>
</Tooltip>
}
>
{(triggerRef) => (
<IconButton
ref={triggerRef}
data-testid="chat-button"
onClick={handleChatButtonClick}
aria-pressed={isChatOpen && selected}
aria-label="Open Chat"
variant="Background"
fill="None"
size="300"
radii="300"
>
<Icon size="50" src={Icons.Message} />
</IconButton>
)}
</TooltipProvider>
)}
<IconButton
onClick={handleOpenMenu}
aria-pressed={!!menuAnchor}
aria-controls={`menu-${room.roomId}`}
aria-label="More Options"
variant="Background"
fill="None"
size="300"
radii="300"
>
<Icon size="50" src={Icons.VerticalDots} />
</IconButton>
</PopOut>
</NavItemOptions>
)}
</NavItem> </NavItem>
{room.isCallRoom() && ( {room.isCallRoom() && (
<Box direction="Column" style={{ paddingLeft: config.space.S200 }}> <Box direction="Column" style={{ paddingLeft: config.space.S200 }}>
{callMemberships.map((callMembership) => ( {callMemberships.map((callMembership) => (
<RoomNavUser room={room} callMembership={callMembership} /> <RoomNavUser
key={callMembership.membershipID}
room={room}
callMembership={callMembership}
/>
))} ))}
</Box> </Box>
)} )}

View file

@ -40,9 +40,9 @@ export function RoomNavUser({ room, callMembership }: RoomNavUserProps) {
return ( return (
<NavItem variant="Background" radii="400"> <NavItem variant="Background" radii="400">
<NavButton onClick={handleNavUserClick} aria-label={ariaLabel}> <NavButton onClick={handleNavUserClick} aria-label={ariaLabel}>
<NavItemContent> <NavItemContent as="div">
<Box direction="Column" grow="Yes" gap="200" justifyContent="Stretch"> <Box direction="Column" grow="Yes" gap="200" justifyContent="Stretch">
<Box as="span" alignItems="Center" gap="200"> <Box alignItems="Center" gap="200">
<Avatar size="200"> <Avatar size="200">
<UserAvatar <UserAvatar
userId={userId} userId={userId}
@ -51,7 +51,7 @@ export function RoomNavUser({ room, callMembership }: RoomNavUserProps) {
renderFallback={() => <Icon size="50" src={Icons.User} filled />} renderFallback={() => <Icon size="50" src={Icons.User} filled />}
/> />
</Avatar> </Avatar>
<Text size="B400" priority="300" truncate> <Text as="span" size="B400" priority="300" truncate>
{getName} {getName}
</Text> </Text>
</Box> </Box>

View file

@ -257,9 +257,11 @@ export function CallProvider({ children }: CallProviderProps) {
setIsActiveCallReady(true); setIsActiveCallReady(true);
}; };
sendWidgetAction(WIDGET_MEDIA_STATE_UPDATE_ACTION, { void sendWidgetAction(WIDGET_MEDIA_STATE_UPDATE_ACTION, {
audio_enabled: isAudioEnabled, audio_enabled: isAudioEnabled,
video_enabled: isVideoEnabled, video_enabled: isVideoEnabled,
}).catch(() => {
// Widget transport may reject while call/session setup is still in progress.
}); });
activeClientWidgetApi.on(`action:${WIDGET_HANGUP_ACTION}`, handleHangup); activeClientWidgetApi.on(`action:${WIDGET_HANGUP_ACTION}`, handleHangup);