From 5dfc9785f568a8e5b3538587960d4fc3770e3ca3 Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Wed, 20 Jul 2022 21:08:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=A6=81=E8=A8=80=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/model/group.ts | 4 ++ .../components/Panel/group/MembersPanel.tsx | 71 ++++++++++++++++--- web/src/styles/antd/dark.less | 11 ++- 3 files changed, 77 insertions(+), 9 deletions(-) diff --git a/shared/model/group.ts b/shared/model/group.ts index 61e18669..96af1e2a 100644 --- a/shared/model/group.ts +++ b/shared/model/group.ts @@ -9,6 +9,10 @@ export enum GroupPanelType { export interface GroupMember { role: string; // 角色 userId: string; + /** + * 日期字符串 禁言到xxx + */ + muteUntil?: string; } export interface GroupPanel { diff --git a/web/src/components/Panel/group/MembersPanel.tsx b/web/src/components/Panel/group/MembersPanel.tsx index 9d402451..5f40f265 100644 --- a/web/src/components/Panel/group/MembersPanel.tsx +++ b/web/src/components/Panel/group/MembersPanel.tsx @@ -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 = 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 = React.memo((props) => { return ; } - const renderUser = (member: UserBaseInfo) => ( - } - /> - ); + const renderUser = (member: UserBaseInfo) => { + const muteUntil = getMembersMuteUntil(members, member._id); + + if (isGroupOwner && isDevelopment) { + return ( + + {muteUntil ? ( + {t('解除禁言')} + ) : ( + + {t('1分钟')} + {t('5分钟')} + {t('10分钟')} + {t('30分钟')} + {t('1天')} + {t('7天')} + {t('30天')} + + )} + + } + > +
+ } + /> +
+
+ ); + } else { + return ( + } + /> + ); + } + }; return (
diff --git a/web/src/styles/antd/dark.less b/web/src/styles/antd/dark.less index 347b9891..8abee0f2 100644 --- a/web/src/styles/antd/dark.less +++ b/web/src/styles/antd/dark.less @@ -120,7 +120,7 @@ } // 下拉菜单 - .ant-dropdown { + .ant-dropdown, .ant-dropdown-menu-submenu { color: rgba(255, 255, 255, 0.65); .ant-dropdown-menu { @@ -131,7 +131,12 @@ color: rgba(255, 255, 255, 0.65); &:hover { + color: rgba(255, 255, 255, 0.85); background-color: rgba(255, 255, 255, 0.08); + + .ant-dropdown-menu-submenu-arrow-icon { + color: rgba(255, 255, 255, 0.85); + } } &.ant-dropdown-menu-item-danger { @@ -142,6 +147,10 @@ background-color: #a61d24; } } + + .ant-dropdown-menu-submenu-arrow-icon { + color: rgba(255, 255, 255, 0.65); + } } } }