Skip to content

Commit 8b3738e

Browse files
committed
feat(web): 团成员列表增加了分类
区分了拥有者 主持人 成员三类
1 parent 16e12e8 commit 8b3738e

File tree

5 files changed

+83
-21
lines changed

5 files changed

+83
-21
lines changed

src/shared/i18n/langs/en-US/translation.json

+3
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
"k672fb6c8": "Please Select Search Method...",
5353
"k68022ee7": "All",
5454
"k6b8145c2": "Login Result",
55+
"k74aef1ad": "Members",
5556
"k77ee6a43": "Member Manage",
5657
"k7c232f9e": "Panel",
5758
"k8004f31b": "Tick",
@@ -101,6 +102,7 @@
101102
"kd3de39b4": "Update Success",
102103
"kd8702fdb": "No Search Result",
103104
"kda3ac7f9": "Bot",
105+
"kdc29028f": "Moderator",
104106
"kdc2b5fe0": "Login Time",
105107
"kdebc1ec9": "Select from Friends",
106108
"kdf2b27a": "Gender",
@@ -118,6 +120,7 @@
118120
"kee8ae330": "Query",
119121
"kefa5d64e": "Ensure to delete actor? Cannot recover this operation.",
120122
"kf15499b4": "Logout",
123+
"kf1fd2c49": "Owner",
121124
"kf3d7ac0e": "Searching...",
122125
"kf4567a1": "Copy Invite Link",
123126
"kf5d66247": "Panel Name",

src/shared/i18n/langs/zh-CN/translation.json

+3
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
"k672fb6c8": "请选择搜索方式...",
5353
"k68022ee7": "全部",
5454
"k6b8145c2": "登录结果",
55+
"k74aef1ad": "成员",
5556
"k77ee6a43": "成员管理",
5657
"k7c232f9e": "面板",
5758
"k8004f31b": "踢出团",
@@ -101,6 +102,7 @@
101102
"kd3de39b4": "更新成功",
102103
"kd8702fdb": "暂无搜索结果",
103104
"kda3ac7f9": "机器人",
105+
"kdc29028f": "主持人",
104106
"kdc2b5fe0": "登录时间",
105107
"kdebc1ec9": "从好友中选择",
106108
"kdf2b27a": "性别",
@@ -118,6 +120,7 @@
118120
"kee8ae330": "查询",
119121
"kefa5d64e": "你确定要删除该人物卡么?删除后无法找回",
120122
"kf15499b4": "退出登录",
123+
"kf1fd2c49": "拥有者",
121124
"kf3d7ac0e": "正在搜索中...",
122125
"kf4567a1": "复制邀请链接",
123126
"kf5d66247": "面板名",

src/shared/redux/hooks/group.ts

+16-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useCurrentUserInfo, useCurrentUserUUID } from './user';
44
import _get from 'lodash/get';
55
import _uniq from 'lodash/uniq';
66
import _isNil from 'lodash/isNil';
7+
import _without from 'lodash/without';
78
import { useMemo } from 'react';
89
import { GroupPanel } from '@shared/types/panel';
910
import { isGroupPanelVisible } from '@shared/helper/group';
@@ -91,19 +92,30 @@ export function useSelectedGroupActorInfo(
9192
}
9293

9394
/**
94-
* 获取团UUID管理员列表
95+
* 获取团管理员列表
9596
* @param groupUUID 团UUID
9697
*/
9798
export function useGroupManagerUUIDs(groupUUID: string): string[] {
98-
const group = useTRPGSelector((state) =>
99-
state.group.groups.find((g) => g.uuid === groupUUID)
100-
);
99+
const group = useJoinedGroupInfo(groupUUID);
101100
if (_isNil(group)) {
102101
return [];
103102
}
104103
return _uniq([group.owner_uuid, ...group.managers_uuid!]);
105104
}
106105

106+
/**
107+
* 获取团普通成员列表
108+
* @param groupUUID 团UUID
109+
*/
110+
export function useGroupNormalMembers(groupUUID: string): string[] {
111+
const group = useJoinedGroupInfo(groupUUID);
112+
if (_isNil(group)) {
113+
return [];
114+
}
115+
116+
return _uniq(_without(group.group_members, ...(group.managers_uuid ?? [])));
117+
}
118+
107119
/**
108120
* 检测一个用户是否是团管理员
109121
* @param groupUUID 团UUID

src/web/routes/Main/Content/Group/GroupPanel/GroupChatPanel.tsx

+2-17
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@ import { Iconfont } from '@web/components/Iconfont';
55
import styled from 'styled-components';
66
import { useJoinedGroupInfo } from '@redux/hooks/group';
77
import _isNil from 'lodash/isNil';
8-
import { UserListItem } from '@web/components/UserListItem';
98
import { GroupActorSelector } from './GroupActorSelector';
10-
import { TPopover } from '@web/components/popover';
11-
import PopoverUserInfo from '@web/components/popover/UserInfo';
9+
import { GroupMembers } from './GroupMembers';
1210

1311
const Root = styled.div`
1412
display: flex;
@@ -28,19 +26,6 @@ export const GroupChatPanel: React.FC<GroupChatPanelProps> = TMemo((props) => {
2826
return null;
2927
}
3028

31-
const members = (groupInfo.group_members ?? []).map((uuid) => (
32-
<TPopover
33-
key={uuid}
34-
placement="left"
35-
trigger="click"
36-
content={<PopoverUserInfo userUUID={uuid} />}
37-
>
38-
<div>
39-
<UserListItem userUUID={uuid} />
40-
</div>
41-
</TPopover>
42-
));
43-
4429
return (
4530
<Root>
4631
<ChatContainer
@@ -56,7 +41,7 @@ export const GroupChatPanel: React.FC<GroupChatPanelProps> = TMemo((props) => {
5641
&#xe603;
5742
</Iconfont>,
5843
]}
59-
rightPanel={showMembers && <div>{members}</div>}
44+
rightPanel={showMembers && <GroupMembers groupUUID={groupUUID} />}
6045
/>
6146
</Root>
6247
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import React from 'react';
2+
import { TMemo } from '@shared/components/TMemo';
3+
import { useTranslation } from '@shared/i18n';
4+
import {
5+
useGroupManagerUUIDs,
6+
useJoinedGroupInfo,
7+
useGroupNormalMembers,
8+
} from '@redux/hooks/group';
9+
import _isNil from 'lodash/isNil';
10+
import _without from 'lodash/without';
11+
import { TPopover } from '@web/components/popover';
12+
import PopoverUserInfo from '@web/components/popover/UserInfo';
13+
import { UserListItem } from '@web/components/UserListItem';
14+
15+
function renderMemberList(uuids: string[]) {
16+
return uuids.map((uuid) => (
17+
<TPopover
18+
key={uuid}
19+
placement="left"
20+
trigger="click"
21+
content={<PopoverUserInfo userUUID={uuid} />}
22+
>
23+
<div>
24+
<UserListItem userUUID={uuid} />
25+
</div>
26+
</TPopover>
27+
));
28+
}
29+
30+
interface GroupMembersProps {
31+
groupUUID: string;
32+
}
33+
export const GroupMembers: React.FC<GroupMembersProps> = TMemo((props) => {
34+
const { groupUUID } = props;
35+
const { t } = useTranslation();
36+
const groupInfo = useJoinedGroupInfo(groupUUID);
37+
const allManagers = useGroupManagerUUIDs(groupUUID);
38+
const normalMembers = useGroupNormalMembers(groupUUID);
39+
const filterManagers = _without<string>(
40+
allManagers,
41+
groupInfo?.owner_uuid ?? ''
42+
);
43+
44+
if (_isNil(groupInfo)) {
45+
return null;
46+
}
47+
48+
return (
49+
<div>
50+
<div>{t('拥有者')}</div>
51+
{renderMemberList([groupInfo.owner_uuid])}
52+
<div>{t('主持人')}</div>
53+
{renderMemberList(filterManagers)}
54+
<div>{t('成员')}</div>
55+
{renderMemberList(normalMembers)}
56+
</div>
57+
);
58+
});
59+
GroupMembers.displayName = 'GroupMembers';

0 commit comments

Comments
 (0)