onRequestClose: PropTypes.func.isRequired,
};
-function ProfileViewer() {
+function useToggleDialog() {
const [isOpen, setIsOpen] = useState(false);
const [roomId, setRoomId] = useState(null);
const [userId, setUserId] = useState(null);
- const [, forceUpdate] = useForceUpdate();
-
- const mx = initMatrix.matrixClient;
- const room = roomId ? mx.getRoom(roomId) : null;
- let username = '';
- if (room !== null) {
- const roomMember = room.getMember(userId);
- if (roomMember) username = getUsernameOfRoomMember(roomMember);
- else username = getUsername(userId);
- }
useEffect(() => {
const loadProfile = (uId, rId) => {
};
}, []);
+ const closeDialog = () => setIsOpen(false);
+
+ const afterClose = () => {
+ setUserId(null);
+ setRoomId(null);
+ };
+
+ return [isOpen, roomId, userId, closeDialog, afterClose];
+}
+
+function useRerenderOnRoleChange(roomId, userId) {
+ const mx = initMatrix.matrixClient;
+ const [, forceUpdate] = useForceUpdate();
useEffect(() => {
const handlePowerLevelChange = (mEvent, member) => {
if (mEvent.getRoomId() === roomId && member.userId === userId) {
mx.removeListener('RoomMember.powerLevel', handlePowerLevelChange);
};
}, [roomId, userId]);
+}
- const handleAfterClose = () => {
- setUserId(null);
- setRoomId(null);
- };
+function ProfileViewer() {
+ const [isOpen, roomId, userId, closeDialog, handleAfterClose] = useToggleDialog();
+ useRerenderOnRoleChange(roomId, userId);
+
+ const mx = initMatrix.matrixClient;
+ const room = mx.getRoom(roomId);
- function renderProfile() {
- const member = room.getMember(userId) || mx.getUser(userId) || {};
- const avatarMxc = member.getMxcAvatarUrl?.() || member.avatarUrl;
+ let [roomMember, username] = [null, null];
- const powerLevel = member.powerLevel || 0;
+ if (roomId) {
+ roomMember = room.getMember(userId);
+ username = roomMember ? getUsernameOfRoomMember(roomMember) : getUsername(userId);
+ }
+
+ const renderProfile = () => {
+ const avatarMxc = roomMember.getMxcAvatarUrl?.() || mx.getMember(userId).avatarUrl;
+ const avatarUrl = avatarMxc ? mx.mxcUrlToHttp(avatarMxc, 80, 80, 'crop') : null;
+
+ const powerLevel = roomMember.powerLevel || 0;
const myPowerLevel = room.getMember(mx.getUserId())?.powerLevel || 0;
const canChangeRole = (
roomActions.setPowerLevel(roomId, userId, newPowerLevel);
}
};
+
const handlePowerSelector = (e) => {
openReusableContextMenu(
'bottom',
return (
<div className="profile-viewer">
<div className="profile-viewer__user">
- <Avatar
- imageSrc={!avatarMxc ? null : mx.mxcUrlToHttp(avatarMxc, 80, 80, 'crop')}
- text={username}
- bgColor={colorMXID(userId)}
- size="large"
- />
+ <Avatar imageSrc={avatarUrl} text={username} bgColor={colorMXID(userId)} size="large" />
<div className="profile-viewer__user__info">
<Text variant="s1" weight="medium">{twemojify(username)}</Text>
<Text variant="b2">{twemojify(userId)}</Text>
<ProfileFooter
roomId={roomId}
userId={userId}
- onRequestClose={() => setIsOpen(false)}
+ onRequestClose={closeDialog}
/>
)}
</div>
);
- }
+ };
return (
<Dialog
isOpen={isOpen}
title={`${username} in ${room?.name ?? ''}`}
onAfterClose={handleAfterClose}
- onRequestClose={() => setIsOpen(false)}
- contentOptions={<IconButton src={CrossIC} onClick={() => setIsOpen(false)} tooltip="Close" />}
+ onRequestClose={closeDialog}
+ contentOptions={<IconButton src={CrossIC} onClick={closeDialog} tooltip="Close" />}
>
{roomId ? renderProfile() : <div />}
</Dialog>