Skip to content

Commit 20a4a86

Browse files
committed
feat: sync room info in real time from system messages
1 parent 89e85b7 commit 20a4a86

2 files changed

Lines changed: 57 additions & 0 deletions

File tree

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { useEffect } from 'react';
2+
import { useRCContext } from '../context/RCInstance';
3+
import { useChannelStore } from '../store';
4+
5+
const useRoomInfoUpdater = () => {
6+
const { RCInstance } = useRCContext();
7+
const setChannelInfo = useChannelStore((state) => state.setChannelInfo);
8+
const setIsChannelPrivate = useChannelStore(
9+
(state) => state.setIsChannelPrivate
10+
);
11+
const setIsRoomTeam = useChannelStore((state) => state.setIsRoomTeam);
12+
const setIsChannelReadOnly = useChannelStore(
13+
(state) => state.setIsChannelReadOnly
14+
);
15+
16+
useEffect(() => {
17+
const handleMessage = async (message) => {
18+
const roomUpdateTypes = [
19+
'r',
20+
'room_changed_description',
21+
'room_changed_announcement',
22+
'room_changed_topic',
23+
'room_changed_privacy',
24+
'room_changed_avatar',
25+
];
26+
27+
if (!roomUpdateTypes.includes(message.t)) {
28+
return;
29+
}
30+
31+
try {
32+
const res = await RCInstance.channelInfo();
33+
if (res?.success) {
34+
setChannelInfo(res.room);
35+
setIsChannelPrivate(res.room.t === 'p');
36+
setIsRoomTeam(Boolean(res.room?.teamMain));
37+
setIsChannelReadOnly(Boolean(res.room.ro));
38+
}
39+
} catch (error) {
40+
console.error('Failed to update room info:', error);
41+
}
42+
};
43+
44+
RCInstance.addMessageListener(handleMessage);
45+
return () => RCInstance.removeMessageListener(handleMessage);
46+
}, [
47+
RCInstance,
48+
setChannelInfo,
49+
setIsChannelPrivate,
50+
setIsRoomTeam,
51+
setIsChannelReadOnly,
52+
]);
53+
};
54+
55+
export default useRoomInfoUpdater;

packages/react/src/views/ChatHeader/ChatHeader.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import useSettingsStore from '../../store/settingsStore';
3131
import getChatHeaderStyles from './ChatHeader.styles';
3232
import useSetExclusiveState from '../../hooks/useSetExclusiveState';
3333
import SurfaceMenu from '../SurfaceMenu/SurfaceMenu';
34+
import useRoomInfoUpdater from '../../hooks/useRoomInfoUpdater';
3435

3536
const ChatHeader = ({
3637
isClosable,
@@ -56,6 +57,7 @@ const ChatHeader = ({
5657
}) => {
5758
const { classNames, styleOverrides, configOverrides } =
5859
useComponentOverrides('ChatHeader');
60+
useRoomInfoUpdater();
5961

6062
const surfaceItems =
6163
configOverrides.optionConfig?.surfaceItems || optionConfig.surfaceItems;

0 commit comments

Comments
 (0)