Skip to content

Commit 46bc211

Browse files
authored
fix: Handle all chances of command not recieved error (#230)
* Handle chances of command not recieved error in markAsRead * Experimental markasread handling -> longer times, no more call after unmount * Move typing handler in channellist into local variable
1 parent cd3298c commit 46bc211

File tree

8 files changed

+90
-45
lines changed

8 files changed

+90
-45
lines changed

src/lib/hooks/useOnlineStatus.js

+24-19
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,30 @@ function useConnectionStatus(sdk, logger) {
88

99
useEffect(() => {
1010
const uniqueHandlerId = uuidv4();
11-
logger.warning('sdk changed', uniqueHandlerId);
12-
const handler = new ConnectionHandler();
13-
14-
handler.onReconnectStarted = () => {
15-
setIsOnline(false);
16-
logger.warning('onReconnectStarted', { isOnline });
17-
};
18-
handler.onReconnectSucceeded = () => {
19-
setIsOnline(true);
20-
logger.warning('onReconnectSucceeded', { isOnline });
21-
};
22-
handler.onReconnectFailed = () => {
23-
sdk.reconnect();
24-
logger.warning('onReconnectFailed');
25-
};
26-
logger.info('Added ConnectionHandler', uniqueHandlerId);
27-
28-
if (sdk?.addConnectionHandler) {
29-
sdk.addConnectionHandler(uniqueHandlerId, handler);
11+
try {
12+
logger.warning('sdk changed', uniqueHandlerId);
13+
const handler = new ConnectionHandler();
14+
handler.onDisconnected = () => {
15+
logger.warning('onDisconnected', { isOnline });
16+
};
17+
handler.onReconnectStarted = () => {
18+
setIsOnline(false);
19+
logger.warning('onReconnectStarted', { isOnline });
20+
};
21+
handler.onReconnectSucceeded = () => {
22+
setIsOnline(true);
23+
logger.warning('onReconnectSucceeded', { isOnline });
24+
};
25+
handler.onReconnectFailed = () => {
26+
sdk.reconnect();
27+
logger.warning('onReconnectFailed');
28+
};
29+
logger.info('Added ConnectionHandler', uniqueHandlerId);
30+
if (sdk?.addConnectionHandler) {
31+
sdk.addConnectionHandler(uniqueHandlerId, handler);
32+
}
33+
} catch {
34+
//
3035
}
3136
return () => {
3237
try {

src/smart-components/Channel/components/ChannelUI/index.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,11 @@ const ChannelUI: React.FC<ChannelUIProps> = ({
117117
if (scrollRef?.current?.scrollTop) {
118118
scrollRef.current.scrollTop = scrollRef?.current?.scrollHeight - scrollRef?.current?.offsetHeight;
119119
}
120-
currentGroupChannel?.markAsRead();
120+
try {
121+
currentGroupChannel?.markAsRead();
122+
} catch {
123+
//
124+
}
121125
messagesDispatcher({
122126
type: messageActionTypes.MARK_AS_READ,
123127
payload: { channel: currentGroupChannel },

src/smart-components/Channel/components/MessageList/index.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,11 @@ const MessageList: React.FC<MessageListProps> = (props: MessageListProps) => {
9595
type: messageActionTypes.MARK_AS_READ,
9696
payload: { channel: currentGroupChannel },
9797
});
98-
currentGroupChannel?.markAsRead();
98+
try {
99+
currentGroupChannel?.markAsRead();
100+
} catch {
101+
//
102+
}
99103
}
100104
}, 500);
101105
};

src/smart-components/Channel/context/hooks/useGetChannel.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ function useSetChannel({ channelUrl, sdkInit }, {
2020

2121
logger.info('Channel: Mark as read', groupChannel);
2222
// this order is important - this mark as read should update the event handler up above
23-
groupChannel.markAsRead();
23+
try {
24+
groupChannel.markAsRead();
25+
} catch {
26+
//
27+
}
2428
})
2529
.catch((e) => {
2630
logger.warning('Channel | useSetChannel fetch channel failed', { channelUrl, e });

src/smart-components/Channel/context/hooks/useHandleReconnect.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,11 @@ function useHandleReconnect(
8888
payload: { currentGroupChannel },
8989
});
9090
})
91-
.finally(() => {
91+
try {
9292
currentGroupChannel?.markAsRead?.();
93-
});
93+
} catch {
94+
//
95+
}
9496
});
9597
}
9698
};

src/smart-components/ChannelList/components/ChannelListUI/index.tsx

+21-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import './channel-list-ui.scss';
22

3-
import React, { useState } from 'react';
3+
import React, { useState, useEffect } from 'react';
44
import type { GroupChannel, Member, SendbirdGroupChat } from '@sendbird/chat/groupChannel';
55
import type { User } from '@sendbird/chat';
66

@@ -74,6 +74,25 @@ const ChannelListUI: React.FC<ChannelListUIProps> = (props: ChannelListUIProps)
7474
const sdkError = sdkStore?.error;
7575
const sdkIntialized = sdkStore?.initialized || false;
7676

77+
const [channelsTomarkAsRead, setChannelsToMarkAsRead] = useState([]);
78+
useEffect(() => {
79+
// https://stackoverflow.com/a/60907638
80+
let isMounted = true;
81+
if (channelsTomarkAsRead?.length > 0) {
82+
channelsTomarkAsRead?.forEach((c, idx) => {
83+
// Plan-based rate limits - minimum limit is 5 requests per second
84+
setTimeout(() => {
85+
if (isMounted) {
86+
c?.markAsDelivered();
87+
}
88+
}, 2000 * idx);
89+
});
90+
}
91+
return () => {
92+
isMounted = false;
93+
}
94+
}, [channelsTomarkAsRead]);
95+
7796
return (
7897
<>
7998
<div className="sendbird-channel-list__header">
@@ -124,12 +143,7 @@ const ChannelListUI: React.FC<ChannelListUIProps> = (props: ChannelListUIProps)
124143
if (canSetMarkAsDelivered) {
125144
logger.info('ChannelList: Marking all channels as read');
126145
// eslint-disable-next-line no-unused-expressions
127-
channelList?.forEach((c, idx) => {
128-
// Plan-based rate limits - minimum limit is 5 requests per second
129-
setTimeout(() => {
130-
c?.markAsDelivered();
131-
}, 300 * idx);
132-
});
146+
setChannelsToMarkAsRead(channelList);
133147
}
134148
}).catch((err) => {
135149
logger.info('ChannelList: Fetching channels failed', err);

src/smart-components/ChannelList/context/ChannelListProvider.tsx

+24-5
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,27 @@ const ChannelListProvider: React.FC<ChannelListProviderProps> = (props: ChannelL
174174

175175
const [channelSource, setChannelSource] = useState<GroupChannelListQuerySb>();
176176
const [sdkChannelHandlerId, setSdkChannelHandlerId] = useState<string | null>(null);
177-
const [typingHandlerId, setTypingHandlerId] = useState<string | null>(null);
178177
const [typingChannels, setTypingChannels] = useState<Array<GroupChannel>>([]);
179178

179+
const [channelsTomarkAsRead, setChannelsToMarkAsRead] = useState([]);
180+
useEffect(() => {
181+
// https://stackoverflow.com/a/60907638
182+
let isMounted = true;
183+
if (channelsTomarkAsRead?.length > 0) {
184+
channelsTomarkAsRead?.forEach((c, idx) => {
185+
// Plan-based rate limits - minimum limit is 5 requests per second
186+
setTimeout(() => {
187+
if (isMounted) {
188+
c?.markAsDelivered();
189+
}
190+
}, 2000 * idx);
191+
});
192+
}
193+
return () => {
194+
isMounted = false;
195+
}
196+
}, [channelsTomarkAsRead]);
197+
180198
useEffect(() => {
181199
const subscriber = pubSubHandler(pubSub, channelListDispatcher);
182200
return () => {
@@ -198,6 +216,7 @@ const ChannelListProvider: React.FC<ChannelListProviderProps> = (props: ChannelL
198216
logger,
199217
sortChannelList,
200218
disableAutoSelect,
219+
setChannelsToMarkAsRead,
201220
});
202221
} else {
203222
logger.info('ChannelList: Removing channelHandlers');
@@ -222,8 +241,9 @@ const ChannelListProvider: React.FC<ChannelListProviderProps> = (props: ChannelL
222241
}, [sdkIntialized, userFilledChannelListQuery, sortChannelList]);
223242

224243
useEffect(() => {
244+
let typingHandlerId = null;
225245
if (sdk?.groupChannel?.addGroupChannelHandler) {
226-
const handlerId = uuidv4()
246+
typingHandlerId = uuidv4();
227247
const handler = new GroupChannelHandler({
228248
onTypingStatusUpdated: (channel) => {
229249
const typingMemberCount = channel?.getTypingUsers()?.length
@@ -273,11 +293,10 @@ const ChannelListProvider: React.FC<ChannelListProviderProps> = (props: ChannelL
273293
});
274294
},
275295
});
276-
sdk?.groupChannel?.addGroupChannelHandler(handlerId, handler)
277-
setTypingHandlerId(handlerId)
296+
sdk?.groupChannel?.addGroupChannelHandler(typingHandlerId, handler);
278297
}
279298
return () => {
280-
if (sdk?.groupChannel?.removeGroupChannelHandler) {
299+
if (sdk?.groupChannel?.removeGroupChannelHandler && typingHandlerId) {
281300
sdk.groupChannel.removeGroupChannelHandler(typingHandlerId);
282301
}
283302
}

src/smart-components/ChannelList/utils.js

+2-9
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ function setupChannelList({
157157
logger,
158158
sortChannelList,
159159
disableAutoSelect,
160+
setChannelsToMarkAsRead,
160161
}) {
161162
if (sdk?.groupChannel) {
162163
createEventHandler({
@@ -211,15 +212,7 @@ function setupChannelList({
211212
?.find((feature) => (feature === DELIVERY_RECIPT));
212213

213214
if (canSetMarkAsDelivered) {
214-
logger.info('ChannelList: Marking all channels as read');
215-
// eslint-disable-next-line no-unused-expressions
216-
channelList.forEach((c, idx) => {
217-
// Plan-based rate limits - minimum limit is 5 requests per second
218-
setTimeout(() => {
219-
// eslint-disable-next-line no-unused-expressions
220-
c.markAsDelivered();
221-
}, 300 * idx);
222-
});
215+
setChannelsToMarkAsRead(sortedChannelList);
223216
}
224217
}).catch((err) => {
225218
if (err) {

0 commit comments

Comments
 (0)