From ac0353ea28c4390c0e7d42d08149a9c2304fd9fb Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Sun, 10 Aug 2025 21:32:15 +0530 Subject: [PATCH] add member item component in member drawer --- src/app/features/room/MembersDrawer.css.ts | 4 +- src/app/features/room/MembersDrawer.tsx | 136 +++++++++++++-------- 2 files changed, 84 insertions(+), 56 deletions(-) diff --git a/src/app/features/room/MembersDrawer.css.ts b/src/app/features/room/MembersDrawer.css.ts index a1f4153e..860ceda0 100644 --- a/src/app/features/room/MembersDrawer.css.ts +++ b/src/app/features/room/MembersDrawer.css.ts @@ -1,10 +1,8 @@ import { keyframes, style } from '@vanilla-extract/css'; -import { color, config, toRem } from 'folds'; +import { config, toRem } from 'folds'; export const MembersDrawer = style({ width: toRem(266), - backgroundColor: color.Background.Container, - color: color.Background.OnContainer, }); export const MembersDrawerHeader = style({ diff --git a/src/app/features/room/MembersDrawer.tsx b/src/app/features/room/MembersDrawer.tsx index bdb0eb3d..f8c826d9 100644 --- a/src/app/features/room/MembersDrawer.tsx +++ b/src/app/features/room/MembersDrawer.tsx @@ -26,7 +26,7 @@ import { TooltipProvider, config, } from 'folds'; -import { Room, RoomMember } from 'matrix-js-sdk'; +import { MatrixClient, Room, RoomMember } from 'matrix-js-sdk'; import { useVirtualizer } from '@tanstack/react-virtual'; import classNames from 'classnames'; @@ -57,6 +57,67 @@ import { MembershipFilterMenu } from '../../components/MembershipFilterMenu'; import { MemberSortMenu } from '../../components/MemberSortMenu'; import { useOpenUserRoomProfile, useUserRoomProfileState } from '../../state/hooks/userRoomProfile'; import { useSpaceOptionally } from '../../hooks/useSpace'; +import { ContainerColor } from '../../styles/ContainerColor.css'; + +type MemberItemProps = { + mx: MatrixClient; + useAuthentication: boolean; + room: Room; + member: RoomMember; + onClick: MouseEventHandler; + pressed?: boolean; + typing?: boolean; +}; +function MemberItem({ + mx, + useAuthentication, + room, + member, + onClick, + pressed, + typing, +}: MemberItemProps) { + const name = + getMemberDisplayName(room, member.userId) ?? getMxIdLocalPart(member.userId) ?? member.userId; + const avatarMxcUrl = member.getMxcAvatarUrl(); + const avatarUrl = avatarMxcUrl + ? mx.mxcUrlToHttp(avatarMxcUrl, 100, 100, 'crop', undefined, false, useAuthentication) + : undefined; + + return ( + + } + /> + + } + after={ + typing && ( + + + + ) + } + > + + + {name} + + + + ); +} const SEARCH_OPTIONS: UseAsyncSearchOptions = { limit: 1000, @@ -140,9 +201,6 @@ export function MembersDrawer({ room, members }: MembersDrawerProps) { { wait: 200 } ); - const getName = (member: RoomMember) => - getMemberDisplayName(room, member.userId) ?? getMxIdLocalPart(member.userId) ?? member.userId; - const handleMemberClick: MouseEventHandler = (evt) => { const btn = evt.currentTarget as HTMLButtonElement; const userId = btn.getAttribute('data-user-id'); @@ -151,7 +209,11 @@ export function MembersDrawer({ room, members }: MembersDrawerProps) { }; return ( - +
@@ -334,60 +396,28 @@ export function MembersDrawer({ room, members }: MembersDrawerProps) { ); } - const member = tagOrMember; - const name = getName(member); - const avatarMxcUrl = member.getMxcAvatarUrl(); - const avatarUrl = avatarMxcUrl - ? mx.mxcUrlToHttp( - avatarMxcUrl, - 100, - 100, - 'crop', - undefined, - false, - useAuthentication - ) - : undefined; - return ( - - } - /> - - } - after={ - typingMembers.find((receipt) => receipt.userId === member.userId) && ( - - - - ) - } + data-index={vItem.index} + key={`${room.roomId}-${tagOrMember.userId}`} + ref={virtualizer.measureElement} > - - - {name} - - - + receipt.userId === tagOrMember.userId + )} + /> + ); })}