Skip to content

Commit adc9a66

Browse files
committed
feat: Chatroom component displays the number of people in the chat room
1 parent 9d8420b commit adc9a66

File tree

7 files changed

+114
-26
lines changed

7 files changed

+114
-26
lines changed

module/chat/Chat.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export interface ChatProps {
7070
renderRepliedMessage?: (repliedMessage: ChatSDK.MessageBody | null) => ReactNode; // 自定义渲染Input上面的被回复的消息
7171
// Header 的 props
7272
headerProps?: Omit<HeaderProps, 'suffixIcon'> & {
73-
suffixIcon: ('PIN' | 'THREAD' | 'AUDIO' | 'VIDEO' | ReactNode)[];
73+
suffixIcon?: ('PIN' | 'THREAD' | 'AUDIO' | 'VIDEO' | ReactNode)[];
7474
};
7575
messageListProps?: MsgListProps;
7676
messageInputProps?: MessageInputProps;

module/chatroomMember/ChatroomMember.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ const ChatroomMember = (props: ChatroomMemberProps) => {
7575
const globalConfig = features?.chatroomMember;
7676
const themeMode = theme?.mode || 'light';
7777
const { addressStore } = rootStore;
78-
const { getConversationList } = useChatroomMember(chatroomId);
78+
const { getChatroomMembers } = useChatroomMember(chatroomId);
7979
useEffect(() => {
8080
if (!rootStore.loginState || !chatroomId) return;
8181
const chatroomData = addressStore.chatroom.filter(item => item.id === chatroomId)[0];
@@ -85,14 +85,14 @@ const ChatroomMember = (props: ChatroomMemberProps) => {
8585
.then(res => {
8686
// @ts-ignore TODO: getChatRoomDetails 类型错误 data 是数组
8787
rootStore.addressStore.setChatroom(res.data as ChatSDK.GetChatRoomDetailsResult);
88-
getConversationList();
88+
getChatroomMembers();
8989
eventHandler.dispatchSuccess('getChatRoomDetails');
9090
})
9191
.catch(err => {
9292
eventHandler.dispatchError('getChatRoomDetails', err);
9393
});
9494
} else {
95-
getConversationList();
95+
getChatroomMembers();
9696
}
9797
}, [rootStore.loginState, chatroomId]);
9898

@@ -201,7 +201,7 @@ const ChatroomMember = (props: ChatroomMemberProps) => {
201201
data={allDataToRender}
202202
scrollDirection="down"
203203
loadMoreItems={() => {
204-
getConversationList();
204+
getChatroomMembers();
205205
}}
206206
renderItem={
207207
memberListProps?.renderItem

module/chatroomMessage/ChatroomMessage.tsx

Lines changed: 59 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { Tooltip } from '../../component/tooltip/Tooltip';
1212
import { useTranslation } from 'react-i18next';
1313
import { renderTxt } from '../textMessage/TextMessage';
1414
import { eventHandler } from '../../eventHandler';
15+
import { usePinnedMessage } from '../hooks/usePinnedMessage';
1516
export interface ChatroomMessageProps {
1617
prefix?: string;
1718
className?: string;
@@ -48,6 +49,13 @@ const ChatroomMessage = (props: ChatroomMessageProps) => {
4849
let customAction;
4950
let menuNode: ReactNode | undefined;
5051
let moreAction: CustomAction = { visible: false };
52+
const { pinMessage, unpinMessage, clearPinnedMessages, getPinnedMessages, list } =
53+
usePinnedMessage({
54+
conversation: {
55+
conversationType: 'chatRoom',
56+
conversationId: message.to,
57+
},
58+
});
5159

5260
const [textToShow, setTextToShow] = useState((message as ChatSDK.TextMsgBody).msg);
5361

@@ -76,6 +84,10 @@ const ChatroomMessage = (props: ChatroomMessageProps) => {
7684
};
7785
}
7886
if (owner === rootStore.client.user) {
87+
moreAction.actions?.unshift({
88+
content: 'PIN',
89+
onClick: () => {},
90+
});
7991
message.from != rootStore.client.user &&
8092
moreAction.actions?.unshift({
8193
content: 'MUTE',
@@ -153,6 +165,41 @@ const ChatroomMessage = (props: ChatroomMessageProps) => {
153165
setIsPopoverOpen(false);
154166
};
155167

168+
const handlePinMessage = () => {
169+
console.log('pin message', message, list);
170+
171+
// list.forEach(item => {
172+
// console.log('------->listItem', item);
173+
// // @ts-ignore
174+
// unpinMessage(item.message.mid || item.message.id);
175+
// });
176+
// // @ts-ignore
177+
// pinMessage(message.mid || message.id).then(() => {
178+
// rootStore.pinnedMessagesStore.pushPinnedMessage('chatRoom', message.to, {
179+
// operatorId: rootStore.client.user,
180+
// pinTime: Date.now(),
181+
// message,
182+
// });
183+
// });
184+
185+
const promiseList = list.map(item => {
186+
// @ts-ignore
187+
return unpinMessage(item.message.mid || item.message.id);
188+
});
189+
Promise.all(promiseList).then(() => {
190+
// @ts-ignore
191+
pinMessage(message.mid || message.id).then(() => {
192+
rootStore.pinnedMessagesStore.pushPinnedMessage('chatRoom', message.to, {
193+
operatorId: rootStore.client.user,
194+
pinTime: Date.now(),
195+
message,
196+
});
197+
});
198+
});
199+
200+
setIsPopoverOpen(false);
201+
};
202+
156203
const morePrefixCls = getPrefixCls('moreAction', customizePrefixCls);
157204
const moreClassString = classNames(morePrefixCls, {
158205
[`${morePrefixCls}-${themeMode}`]: !!themeMode,
@@ -165,28 +212,23 @@ const ChatroomMessage = (props: ChatroomMessageProps) => {
165212
if (item.content === 'RECALL') {
166213
return (
167214
<li key={index} onClick={recallMessage}>
168-
<Icon type="ARROW_BACK" width={16} height={16} color="#5270AD"></Icon>
215+
<Icon type="ARROW_BACK" width={16} height={16}></Icon>
169216
{t('unsend')}
170217
</li>
171218
);
172219
} else if (item.content === 'TRANSLATE') {
173220
return (
174221
message?.type === 'txt' && (
175222
<li key={index} onClick={translateMessage}>
176-
<Icon type="TRANSLATION" width={16} height={16} color="#5270AD"></Icon>
223+
<Icon type="TRANSLATION" width={16} height={16}></Icon>
177224
{t('translate')}
178225
</li>
179226
)
180227
);
181228
} else if (item.content === 'MUTE') {
182229
return (
183230
<li key={isMuted ? index : -index} onClick={muteMember}>
184-
<Icon
185-
type={isMuted ? 'BELL' : 'BELL_SLASH'}
186-
width={16}
187-
height={16}
188-
color="#5270AD"
189-
></Icon>
231+
<Icon type={isMuted ? 'BELL' : 'BELL_SLASH'} width={16} height={16}></Icon>
190232
{isMuted ? t('unmute') : t('mute')}
191233
</li>
192234
);
@@ -196,10 +238,17 @@ const ChatroomMessage = (props: ChatroomMessageProps) => {
196238
}
197239
return (
198240
<li key={index} onClick={reportMessage}>
199-
<Icon type="ENVELOPE" width={16} height={16} color="#5270AD"></Icon>
241+
<Icon type="ENVELOPE" width={16} height={16}></Icon>
200242
{t('report')}
201243
</li>
202244
);
245+
} else if (item.content === 'PIN') {
246+
return (
247+
<li key={index} onClick={handlePinMessage}>
248+
<Icon type="PIN" width={16} height={16}></Icon>
249+
{t('Pin')}
250+
</li>
251+
);
203252
}
204253
return (
205254
<li
@@ -290,7 +339,7 @@ const ChatroomMessage = (props: ChatroomMessageProps) => {
290339
>
291340
<Icon
292341
type="ELLIPSIS"
293-
color="#33B1FF"
342+
color="var(--cui-primary-color5)"
294343
className={`${prefixCls}-body-action`}
295344
height={20}
296345
></Icon>

module/conversation/ConversationList.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,14 @@ const Conversations: FC<ConversationListProps> = props => {
9393

9494
const handleItemClick = (cvs: ConversationData[0], index: number) => () => {
9595
setActiveCvsId(cvs.conversationId);
96-
cvsStore.setCurrentCvs({
97-
chatType: cvs.chatType,
98-
conversationId: cvs.conversationId,
99-
name: cvs.name,
100-
unreadCount: 0,
101-
});
96+
if (cvsStore.currentCvs.conversationId !== cvs.conversationId) {
97+
cvsStore.setCurrentCvs({
98+
chatType: cvs.chatType,
99+
conversationId: cvs.conversationId,
100+
name: cvs.name,
101+
unreadCount: 0,
102+
});
103+
}
102104
onItemClick?.(cvs);
103105
};
104106

module/hooks/chat.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,24 @@ const useEventHandler = (props: ProviderProps) => {
149149
noticeType: 'pin',
150150
time,
151151
});
152+
// Only one message is allowed to be pinned in the chat room
153+
if (conversationType === 'chatRoom') {
154+
const pinedMsg = getStore().messageStore.message[conversationType][
155+
conversationId
156+
//@ts-ignore
157+
].find(item => (item.mid === messageId || item.id === messageId) && item);
158+
if (pinedMsg) {
159+
getStore().pinnedMessagesStore.clearPinnedMessages(
160+
conversationType,
161+
conversationId,
162+
);
163+
getStore().pinnedMessagesStore.pushPinnedMessage(conversationType, conversationId, {
164+
operatorId: operatorId,
165+
pinTime: time,
166+
message: pinedMsg as ChatSDK.TextMsgBody,
167+
});
168+
}
169+
}
152170
break;
153171
case 'unpin':
154172
getStore().pinnedMessagesStore.deletePinnedMessage(
@@ -360,6 +378,12 @@ const useEventHandler = (props: ProviderProps) => {
360378
);
361379
}
362380
},
381+
onChatroomEvent: message => {
382+
if (message.operation === 'memberPresence') {
383+
const count = message.memberCount as number;
384+
typeof count === 'number' && addressStore.updateChatroomMemberCount(message.id, count);
385+
}
386+
},
363387
});
364388

365389
return () => {

module/hooks/useChatroomMember.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import { useContext } from 'react';
22
import { RootContext } from '../store/rootContext';
33
import { getUsersInfo } from '../utils';
4+
import { runInAction } from 'mobx';
45
const pageSize = 20;
56
let pageNum = 1;
67
const useChatroomMember = (chatroomId: string) => {
78
const rootStore = useContext(RootContext).rootStore;
89
const { client } = rootStore;
910
let next = true;
10-
const getConversationList = () => {
11+
const getChatroomMembers = () => {
1112
client
1213
.listChatRoomMembers({
1314
chatRoomId: chatroomId,
@@ -31,6 +32,8 @@ const useChatroomMember = (chatroomId: string) => {
3132
return !(user in appUserInfo);
3233
});
3334
rootStore.addressStore.setChatroomMemberIds(chatroomId, members);
35+
rootStore.addressStore.updateChatroomMemberCount(chatroomId, res.count);
36+
3437
if (getInfoMembers.length > 0) {
3538
getUsersInfo({ userIdList: getInfoMembers, withPresence: false });
3639
}
@@ -40,7 +43,7 @@ const useChatroomMember = (chatroomId: string) => {
4043
});
4144
};
4245

43-
return { getConversationList, next };
46+
return { getChatroomMembers, next };
4447
};
4548

4649
const clearPageNum = () => {

module/store/AddressStore.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ class AddressStore {
118118
getBlockList: action,
119119
addUsersToBlocklist: action,
120120
removeUserFromBlocklist: action,
121+
updateChatroomMemberCount: action,
121122
});
122123
}
123124

@@ -364,6 +365,13 @@ class AddressStore {
364365
// this.groups = [...this.groups, ...filteredGroups];
365366
}
366367

368+
updateChatroomMemberCount(roomId: string, count: number) {
369+
const idx = this.chatroom.findIndex(item => item.id === roomId);
370+
if (idx > -1) {
371+
this.chatroom[idx].affiliations_count = count;
372+
}
373+
}
374+
367375
setChatroomAdmins = (chatroomId: string, admins: string[]) => {
368376
const idx = this.chatroom.findIndex(item => item.id === chatroomId);
369377
if (idx > -1) {
@@ -451,9 +459,11 @@ class AddressStore {
451459
setChatroomMemberIds = (chatroomId: string, membersId: string[]) => {
452460
const idx = this.chatroom.findIndex(item => item.id === chatroomId);
453461
if (idx > -1) {
454-
this.chatroom[idx].membersId = [
455-
...new Set([...(this.chatroom[idx].membersId || []), ...membersId]),
456-
];
462+
runInAction(() => {
463+
this.chatroom[idx].membersId = [
464+
...new Set([...(this.chatroom[idx].membersId || []), ...membersId]),
465+
];
466+
});
457467
}
458468
};
459469

0 commit comments

Comments
 (0)