-
Notifications
You must be signed in to change notification settings - Fork 11.4k
/
Copy pathRoomMembersItem.tsx
74 lines (66 loc) · 2.32 KB
/
RoomMembersItem.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import type { IRoom, IUser } from '@rocket.chat/core-typings';
import {
Option,
OptionAvatar,
OptionColumn,
OptionDescription,
OptionMenu,
OptionContent,
Icon,
IconButton,
OptionSkeleton,
} from '@rocket.chat/fuselage';
import { usePrefersReducedMotion } from '@rocket.chat/fuselage-hooks';
import { UserAvatar } from '@rocket.chat/ui-avatar';
import type { ReactElement, MouseEvent } from 'react';
import { useState } from 'react';
import UserActions from './RoomMembersActions';
import { getUserDisplayNames } from '../../../../../lib/getUserDisplayNames';
import { ReactiveUserStatus } from '../../../../components/UserStatus';
import { usePreventPropagation } from '../../../../hooks/usePreventPropagation';
type RoomMembersItemProps = {
onClickView: (e: MouseEvent<HTMLElement>) => void;
rid: IRoom['_id'];
reload: () => void;
useRealName: boolean;
} & Pick<IUser, 'federated' | 'username' | 'name' | '_id' | 'freeSwitchExtension'>;
const RoomMembersItem = ({
_id,
name,
username,
federated,
freeSwitchExtension,
onClickView,
rid,
reload,
useRealName,
}: RoomMembersItemProps): ReactElement => {
const [showButton, setShowButton] = useState();
const isReduceMotionEnabled = usePrefersReducedMotion();
const handleMenuEvent = {
[isReduceMotionEnabled ? 'onMouseEnter' : 'onTransitionEnd']: setShowButton,
};
const preventPropagation = usePreventPropagation();
const [nameOrUsername, displayUsername] = getUserDisplayNames(name, username, useRealName);
return (
<Option data-username={username} data-userid={_id} onClick={onClickView} style={{ paddingInline: 24 }} {...handleMenuEvent}>
<OptionAvatar>
<UserAvatar username={username || ''} size='x28' />
</OptionAvatar>
<OptionColumn>{federated ? <Icon name='globe' size='x16' /> : <ReactiveUserStatus uid={_id} />}</OptionColumn>
<OptionContent data-qa={`MemberItem-${username}`}>
{nameOrUsername} {displayUsername && <OptionDescription>({displayUsername})</OptionDescription>}
</OptionContent>
<OptionMenu onClick={preventPropagation}>
{showButton ? (
<UserActions username={username} name={name} rid={rid} _id={_id} freeSwitchExtension={freeSwitchExtension} reload={reload} />
) : (
<IconButton tiny icon='kebab' />
)}
</OptionMenu>
</Option>
);
};
export default Object.assign(RoomMembersItem, {
Skeleton: OptionSkeleton,
});