|
|
|
@ -1,12 +1,16 @@
|
|
|
|
|
import { Icon } from '@/components/Icon';
|
|
|
|
|
import { GroupUserPopover } from '@/components/popover/GroupUserPopover';
|
|
|
|
|
import { UserListItem } from '@/components/UserListItem';
|
|
|
|
|
import { Divider, Input, Skeleton } from 'antd';
|
|
|
|
|
import { Divider, Dropdown, Input, Menu, Skeleton } from 'antd';
|
|
|
|
|
import React, { useMemo } from 'react';
|
|
|
|
|
import {
|
|
|
|
|
GroupMember,
|
|
|
|
|
isDevelopment,
|
|
|
|
|
t,
|
|
|
|
|
useAsyncRequest,
|
|
|
|
|
useCachedOnlineStatus,
|
|
|
|
|
useGroupInfo,
|
|
|
|
|
useIsGroupOwner,
|
|
|
|
|
UserBaseInfo,
|
|
|
|
|
useSearch,
|
|
|
|
|
} from 'tailchat-shared';
|
|
|
|
@ -16,6 +20,19 @@ interface MembersPanelProps {
|
|
|
|
|
groupId: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getMembersMuteUntil(
|
|
|
|
|
members: GroupMember[],
|
|
|
|
|
userId: string
|
|
|
|
|
): string | undefined {
|
|
|
|
|
const member = members.find((m) => m.userId === userId);
|
|
|
|
|
|
|
|
|
|
if (!member) {
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return member.muteUntil;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用户面板
|
|
|
|
|
*/
|
|
|
|
@ -26,6 +43,7 @@ export const MembersPanel: React.FC<MembersPanelProps> = React.memo((props) => {
|
|
|
|
|
const membersOnlineStatus = useCachedOnlineStatus(
|
|
|
|
|
members.map((m) => m.userId)
|
|
|
|
|
);
|
|
|
|
|
const isGroupOwner = useIsGroupOwner(props.groupId);
|
|
|
|
|
|
|
|
|
|
const {
|
|
|
|
|
searchText,
|
|
|
|
@ -59,13 +77,50 @@ export const MembersPanel: React.FC<MembersPanelProps> = React.memo((props) => {
|
|
|
|
|
return <Skeleton />;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const renderUser = (member: UserBaseInfo) => (
|
|
|
|
|
<UserListItem
|
|
|
|
|
key={member._id}
|
|
|
|
|
userId={member._id}
|
|
|
|
|
popover={<GroupUserPopover userInfo={member} />}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
const renderUser = (member: UserBaseInfo) => {
|
|
|
|
|
const muteUntil = getMembersMuteUntil(members, member._id);
|
|
|
|
|
|
|
|
|
|
if (isGroupOwner && isDevelopment) {
|
|
|
|
|
return (
|
|
|
|
|
<Dropdown
|
|
|
|
|
key={member._id}
|
|
|
|
|
trigger={['contextMenu']}
|
|
|
|
|
overlay={
|
|
|
|
|
<Menu>
|
|
|
|
|
{muteUntil ? (
|
|
|
|
|
<Menu.Item>{t('解除禁言')}</Menu.Item>
|
|
|
|
|
) : (
|
|
|
|
|
<Menu.SubMenu title={t('禁言')}>
|
|
|
|
|
<Menu.Item>{t('1分钟')}</Menu.Item>
|
|
|
|
|
<Menu.Item>{t('5分钟')}</Menu.Item>
|
|
|
|
|
<Menu.Item>{t('10分钟')}</Menu.Item>
|
|
|
|
|
<Menu.Item>{t('30分钟')}</Menu.Item>
|
|
|
|
|
<Menu.Item>{t('1天')}</Menu.Item>
|
|
|
|
|
<Menu.Item>{t('7天')}</Menu.Item>
|
|
|
|
|
<Menu.Item>{t('30天')}</Menu.Item>
|
|
|
|
|
</Menu.SubMenu>
|
|
|
|
|
)}
|
|
|
|
|
</Menu>
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
<div>
|
|
|
|
|
<UserListItem
|
|
|
|
|
userId={member._id}
|
|
|
|
|
popover={<GroupUserPopover userInfo={member} />}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</Dropdown>
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
return (
|
|
|
|
|
<UserListItem
|
|
|
|
|
key={member._id}
|
|
|
|
|
userId={member._id}
|
|
|
|
|
popover={<GroupUserPopover userInfo={member} />}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div>
|
|
|
|
|