import classNames from 'classnames' import React from 'react' import type { Channel } from 'stream-chat' import { ChannelList as StreamChannelList, InfiniteScroll, } from 'stream-chat-react' import { restorePendingMessages } from '../../hooks/useRestorePendingMessages' import { useMessagingContext } from '../../providers/MessagingProvider' import type { ChannelListProps } from '../../types' import { ChannelListProvider } from './ChannelListContext' import CustomChannelPreview from './CustomChannelPreview' const DEFAULT_SORT = { last_message_at: -1 } as const /** * Channel list component with customizable header and actions */ export const ChannelList = React.memo( ({ onChannelSelect, selectedChannel, filters, allowNewMessagesFromUnfilteredChannels = false, channelRenderFilterFn, sort = DEFAULT_SORT, className, customEmptyStateIndicator, channelListPaginator: Paginator = InfiniteScroll, channelPreview, renderMessagePreview, viewerLanguage, lockChannelOrder, onMessageNewHandler, onMessageNew, onChannelVisible, onAddedToChannel, onChannelUpdated, }) => { // Track renders const renderCountRef = React.useRef(0) renderCountRef.current++ // Get debug flag from context const { debug = false } = useMessagingContext() // Wrap channelRenderFilterFn to restore pending messages for all channels // as soon as they are loaded, without waiting for the user to click into each one. const wrappedChannelRenderFilterFn = React.useCallback( (channels: Channel[]) => { for (const channel of channels) { restorePendingMessages(channel) } return channelRenderFilterFn ? channelRenderFilterFn(channels) : channels }, [channelRenderFilterFn] ) if (debug) { console.log('📺 [ChannelList] 🔄 RENDER START', { renderCount: renderCountRef.current, selectedChannelId: selectedChannel?.id, filters, }) } const contextValue = React.useMemo( () => ({ selectedChannel, onChannelSelect, debug, channelPreview, renderMessagePreview, viewerLanguage, }), [ selectedChannel, onChannelSelect, debug, channelPreview, renderMessagePreview, viewerLanguage, ] ) return (
{/* Channel List */}
) } ) ChannelList.displayName = 'ChannelList'