Skip to content

Commit 70bfe59

Browse files
committed
fix: move the setting of overrides in separate hook
1 parent 71dbb5f commit 70bfe59

File tree

1 file changed

+50
-31
lines changed

1 file changed

+50
-31
lines changed

package/src/components/ChannelList/ChannelList.tsx

Lines changed: 50 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -291,37 +291,56 @@ export const ChannelList = <
291291

292292
const [forceUpdate, setForceUpdate] = useState(0);
293293
const { client, enableOfflineSupport } = useChatContext<StreamChatGenerics>();
294-
const channelManager = useMemo(
295-
() =>
296-
client.createChannelManager({
297-
eventHandlerOverrides: {
298-
channelDeletedHandler: onChannelDeleted,
299-
channelHiddenHandler: onChannelHidden,
300-
channelTruncatedHandler: onChannelTruncated,
301-
channelVisibleHandler: onChannelVisible,
302-
memberUpdatedHandler: onChannelMemberUpdated
303-
? (setChannels, event) =>
304-
onChannelMemberUpdated(lockChannelOrder, setChannels, event, { filters, sort })
305-
: undefined,
306-
newMessageHandler: onNewMessage
307-
? (setChannels, event) =>
308-
onNewMessage(lockChannelOrder, setChannels, event, { filters, sort })
309-
: undefined,
310-
notificationAddedToChannelHandler: onAddedToChannel
311-
? (setChannels, event) => onAddedToChannel(setChannels, event, { filters, sort })
312-
: undefined,
313-
notificationNewMessageHandler: onNewMessageNotification
314-
? (setChannels, event) =>
315-
onNewMessageNotification(setChannels, event, { filters, sort })
316-
: undefined,
317-
notificationRemovedFromChannelHandler: onRemovedFromChannel,
318-
},
319-
options: { lockChannelOrder },
320-
}),
321-
// FIXME: Move the setting of the overrides down to the LLC too
322-
// eslint-disable-next-line react-hooks/exhaustive-deps
323-
[client],
324-
);
294+
const channelManager = useMemo(() => client.createChannelManager({}), [client]);
295+
296+
/**
297+
* This hook sets the event handler overrides in the channelManager internally
298+
* whenever they change. We do this to avoid recreating the channelManager instance
299+
* every time these change, as we want to keep it as static as possible.
300+
* This protects us from something like defining the overrides as inline functions
301+
* causing the manager instance to be recreated over and over again.
302+
*/
303+
useEffect(() => {
304+
channelManager.setEventHandlerOverrides({
305+
channelDeletedHandler: onChannelDeleted,
306+
channelHiddenHandler: onChannelHidden,
307+
channelTruncatedHandler: onChannelTruncated,
308+
channelVisibleHandler: onChannelVisible,
309+
memberUpdatedHandler: onChannelMemberUpdated
310+
? (setChannels, event) =>
311+
onChannelMemberUpdated(lockChannelOrder, setChannels, event, { filters, sort })
312+
: undefined,
313+
newMessageHandler: onNewMessage
314+
? (setChannels, event) =>
315+
onNewMessage(lockChannelOrder, setChannels, event, { filters, sort })
316+
: undefined,
317+
notificationAddedToChannelHandler: onAddedToChannel
318+
? (setChannels, event) => onAddedToChannel(setChannels, event, { filters, sort })
319+
: undefined,
320+
notificationNewMessageHandler: onNewMessageNotification
321+
? (setChannels, event) => onNewMessageNotification(setChannels, event, { filters, sort })
322+
: undefined,
323+
notificationRemovedFromChannelHandler: onRemovedFromChannel,
324+
});
325+
}, [
326+
channelManager,
327+
filters,
328+
lockChannelOrder,
329+
onAddedToChannel,
330+
onChannelDeleted,
331+
onChannelHidden,
332+
onChannelMemberUpdated,
333+
onChannelTruncated,
334+
onChannelVisible,
335+
onNewMessage,
336+
onNewMessageNotification,
337+
onRemovedFromChannel,
338+
sort,
339+
]);
340+
341+
useEffect(() => {
342+
channelManager.setOptions({ lockChannelOrder });
343+
}, [channelManager, lockChannelOrder]);
325344

326345
useEffect(() => {
327346
channelManager.registerSubscriptions();

0 commit comments

Comments
 (0)