From f4761a9418374f265aaf2ba9aa7a13a01ef8c8fd Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 24 Jul 2025 10:09:12 +0530 Subject: [PATCH] render common rooms in user profile --- .../user-profile/UserRoomProfile.tsx | 155 ++++++++++++++++-- 1 file changed, 142 insertions(+), 13 deletions(-) diff --git a/src/app/components/user-profile/UserRoomProfile.tsx b/src/app/components/user-profile/UserRoomProfile.tsx index db00f6e3..f0be38fc 100644 --- a/src/app/components/user-profile/UserRoomProfile.tsx +++ b/src/app/components/user-profile/UserRoomProfile.tsx @@ -1,4 +1,5 @@ import { + Avatar, Box, Button, Chip, @@ -10,8 +11,10 @@ import { MenuItem, PopOut, RectCords, + Scroll, Spinner, Text, + toRem, } from 'folds'; import React, { MouseEventHandler, useState } from 'react'; import { useNavigate } from 'react-router-dom'; @@ -19,7 +22,13 @@ import FocusTrap from 'focus-trap-react'; import { isKeyHotkey } from 'is-hotkey'; import { UserHero, UserHeroName } from './UserHero'; import { getMxIdServer, mxcUrlToHttp } from '../../utils/matrix'; -import { getMemberAvatarMxc, getMemberDisplayName } from '../../utils/room'; +import { + getDirectRoomAvatarUrl, + getMemberAvatarMxc, + getMemberDisplayName, + getRoomAvatarUrl, + joinRuleToIconSrc, +} from '../../utils/room'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; import { PowerColorBadge, PowerIcon } from '../power'; @@ -36,6 +45,12 @@ import { useOpenRoomSettings } from '../../state/hooks/roomSettings'; import { RoomSettingsPage } from '../../state/roomSettings'; import { useRoom } from '../../hooks/useRoom'; import { useSpaceOptionally } from '../../hooks/useSpace'; +import { useAllJoinedRoomsSet, useGetRoom } from '../../hooks/useGetRoom'; +import { useRoomNavigate } from '../../hooks/useRoomNavigate'; +import { factoryRoomIdByAtoZ } from '../../utils/sort'; +import { useDirectRooms } from '../../pages/client/direct/useDirectRooms'; +import { RoomAvatar, RoomIcon } from '../room-avatar'; +import { nameInitials } from '../../utils/common'; function ServerChip({ server }: { server: string }) { const mx = useMatrixClient(); @@ -249,27 +264,141 @@ function MutualRoomsChip({ userId }: { userId: string }) { const mx = useMatrixClient(); const mutualRoomSupported = useMutualRoomsSupport(); const mutualRoomsState = useMutualRooms(userId); + const { navigateRoom, navigateSpace } = useRoomNavigate(); + const closeUserRoomProfile = useCloseUserRoomProfile(); + const directs = useDirectRooms(); + const useAuthentication = useMediaAuthentication(); + + const allJoinedRooms = useAllJoinedRoomsSet(); + const getRoom = useGetRoom(allJoinedRooms); + + const [cords, setCords] = useState(); + + const open: MouseEventHandler = (evt) => { + setCords(evt.currentTarget.getBoundingClientRect()); + }; + + const close = () => setCords(undefined); if ( userId === mx.getSafeUserId() || !mutualRoomSupported || mutualRoomsState.status === AsyncStatus.Error - ) + ) { return null; + } return ( - } - disabled={mutualRoomsState.status !== AsyncStatus.Success} + isKeyHotkey('arrowdown', evt), + isKeyBackward: (evt: KeyboardEvent) => isKeyHotkey('arrowup', evt), + }} + > + + + + + {mutualRoomsState.data + .sort(factoryRoomIdByAtoZ(mx)) + .map((roomId) => getRoom(roomId)) + .map((room) => { + if (!room) return null; + const { roomId } = room; + const dm = directs.includes(roomId); + + return ( + { + if (room.isSpaceRoom()) { + navigateSpace(roomId); + } else { + navigateRoom(roomId); + } + closeUserRoomProfile(); + }} + before={ + + {dm || room.isSpaceRoom() ? ( + ( + + {nameInitials(room.name)} + + )} + /> + ) : ( + + )} + + } + > + + {room.name} + + + ); + })} + + + + + + ) : null + } > - - {mutualRoomsState.status === AsyncStatus.Success && - `${mutualRoomsState.data.length} Mutual Rooms`} - {mutualRoomsState.status === AsyncStatus.Loading && 'Mutual Rooms'} - - + } + disabled={mutualRoomsState.status !== AsyncStatus.Success} + onClick={open} + aria-pressed={!!cords} + > + + {mutualRoomsState.status === AsyncStatus.Success && + `${mutualRoomsState.data.length} Mutual Rooms`} + {mutualRoomsState.status === AsyncStatus.Loading && 'Mutual Rooms'} + + + ); }