add presence badge in member list

Potential performance issues:
- In large rooms, we should only update the presence for the users shown in the scrollcontainer
This commit is contained in:
anavoi 2025-08-27 12:10:36 +02:00
commit 2a30d18bd0

View file

@ -59,6 +59,8 @@ import { useSpaceOptionally } from '../../hooks/useSpace';
import { ContainerColor } from '../../styles/ContainerColor.css'; import { ContainerColor } from '../../styles/ContainerColor.css';
import { useFlattenPowerTagMembers, useGetMemberPowerTag } from '../../hooks/useMemberPowerTag'; import { useFlattenPowerTagMembers, useGetMemberPowerTag } from '../../hooks/useMemberPowerTag';
import { useRoomCreators } from '../../hooks/useRoomCreators'; import { useRoomCreators } from '../../hooks/useRoomCreators';
import { useUserPresence } from '../../hooks/useUserPresence';
import { AvatarPresence, PresenceBadge } from '../../components/presence';
type MemberDrawerHeaderProps = { type MemberDrawerHeaderProps = {
room: Room; room: Room;
@ -125,6 +127,7 @@ function MemberItem({
const avatarUrl = avatarMxcUrl const avatarUrl = avatarMxcUrl
? mx.mxcUrlToHttp(avatarMxcUrl, 100, 100, 'crop', undefined, false, useAuthentication) ? mx.mxcUrlToHttp(avatarMxcUrl, 100, 100, 'crop', undefined, false, useAuthentication)
: undefined; : undefined;
const presence = useUserPresence(member.userId)
return ( return (
<MenuItem <MenuItem
@ -135,6 +138,10 @@ function MemberItem({
radii="400" radii="400"
onClick={onClick} onClick={onClick}
before={ before={
<AvatarPresence
badge={
presence && <PresenceBadge presence={presence.presence} status={presence.status} size="200" />
}>
<Avatar size="200"> <Avatar size="200">
<UserAvatar <UserAvatar
userId={member.userId} userId={member.userId}
@ -143,6 +150,7 @@ function MemberItem({
renderFallback={() => <Icon size="50" src={Icons.User} filled />} renderFallback={() => <Icon size="50" src={Icons.User} filled />}
/> />
</Avatar> </Avatar>
</AvatarPresence>
} }
after={ after={
typing && ( typing && (
@ -346,8 +354,7 @@ export function MembersDrawer({ room, members }: MembersDrawerProps) {
}} }}
after={<Icon size="50" src={Icons.Cross} />} after={<Icon size="50" src={Icons.Cross} />}
> >
<Text size="B300">{`${result.items.length || 'No'} ${ <Text size="B300">{`${result.items.length || 'No'} ${result.items.length === 1 ? 'Result' : 'Results'
result.items.length === 1 ? 'Result' : 'Results'
}`}</Text> }`}</Text>
</Chip> </Chip>
) )