diff --git a/.changeset/add_ability_to_click_on_usernames_in_member_and_state_events_to_view_user_info.md b/.changeset/add_ability_to_click_on_usernames_in_member_and_state_events_to_view_user_info.md new file mode 100644 index 000000000..d6f7e14ad --- /dev/null +++ b/.changeset/add_ability_to_click_on_usernames_in_member_and_state_events_to_view_user_info.md @@ -0,0 +1,5 @@ +--- +default: minor +--- + +# Add ability to click on usernames in member and state events to view user info diff --git a/src/app/hooks/timeline/useTimelineEventRenderer.tsx b/src/app/hooks/timeline/useTimelineEventRenderer.tsx index fe96b7e17..f7dca411a 100644 --- a/src/app/hooks/timeline/useTimelineEventRenderer.tsx +++ b/src/app/hooks/timeline/useTimelineEventRenderer.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useMemo } from 'react'; +import { MouseEventHandler, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useAtomValue } from 'jotai'; import { @@ -20,6 +20,7 @@ import { useMemberEventParser } from '$hooks/useMemberEventParser'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; import { useMatrixEventRenderer } from '$hooks/useMatrixEventRenderer'; +import { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile'; import { EventContent, ImageContent, @@ -58,9 +59,25 @@ import { useSableCosmetics } from '$hooks/useSableCosmetics'; function DecoratedUser({ room, userId, userName }: DecoratedUserProps) { const { color, font } = useSableCosmetics(userId, room ?? ({} as Room)); + + const openUserRoomProfile = useOpenUserRoomProfile(); + const handleUserClick: MouseEventHandler = useCallback( + (evt) => { + evt.preventDefault(); + evt.stopPropagation(); + openUserRoomProfile( + room.roomId, + undefined, + userId, + evt.currentTarget.getBoundingClientRect() + ); + }, + [room, userId, openUserRoomProfile] + ); + return ( - - {userName ?? userId} + + {userName ?? userId} ); } diff --git a/src/app/hooks/useMemberEventParser.tsx b/src/app/hooks/useMemberEventParser.tsx index 88265ad0d..2791cef4d 100644 --- a/src/app/hooks/useMemberEventParser.tsx +++ b/src/app/hooks/useMemberEventParser.tsx @@ -1,9 +1,10 @@ -import { ReactNode } from 'react'; +import { MouseEventHandler, useCallback, ReactNode } from 'react'; import { IconSrc, Icons, Text } from 'folds'; import { MatrixEvent, Room } from '$types/matrix-sdk'; import { IMemberContent, Membership } from '$types/matrix/room'; import { getMxIdLocalPart } from '$utils/matrix'; import { isMembershipChanged } from '$utils/room'; +import { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile'; import { useSableCosmetics } from './useSableCosmetics'; import { useMatrixClient } from './useMatrixClient'; @@ -17,8 +18,19 @@ function DecoratedUser({ roomId, userId, userName }: DecoratedUserProps) { const mx = useMatrixClient(); const room = mx.getRoom(roomId); const { color, font } = useSableCosmetics(userId, room ?? ({} as Room)); + + const openUserRoomProfile = useOpenUserRoomProfile(); + const handleUserClick: MouseEventHandler = useCallback( + (evt) => { + evt.preventDefault(); + evt.stopPropagation(); + openUserRoomProfile(roomId, undefined, userId, evt.currentTarget.getBoundingClientRect()); + }, + [roomId, userId, openUserRoomProfile] + ); + return ( - + {userName ?? userId} );