1- import React , { useEffect , useState } from 'react' ;
1+ import React from 'react' ;
22
3- import type { Channel , ChannelState , Event , MessageResponse } from 'stream-chat' ;
3+ import type { Channel } from 'stream-chat' ;
44
55import { useLatestMessagePreview } from './hooks/useLatestMessagePreview' ;
66
@@ -11,6 +11,8 @@ import {
1111import { ChatContextValue , useChatContext } from '../../contexts/chatContext/ChatContext' ;
1212
1313import type { DefaultStreamChatGenerics } from '../../types/types' ;
14+ import { useChannelPreviewData } from './hooks/useChannelPreviewData' ;
15+ import { useIsChannelMuted } from './hooks/useIsChannelMuted' ;
1416
1517export type ChannelPreviewPropsWithContext <
1618 StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ,
@@ -31,87 +33,19 @@ const ChannelPreviewWithContext = <
3133> (
3234 props : ChannelPreviewPropsWithContext < StreamChatGenerics > ,
3335) => {
34- const { channel, client, forceUpdate : channelListForceUpdate , Preview } = props ;
35-
36- const [ lastMessage , setLastMessage ] = useState <
37- | ReturnType < ChannelState < StreamChatGenerics > [ 'formatMessage' ] >
38- | MessageResponse < StreamChatGenerics >
39- | undefined
40- > ( channel . state . messages [ channel . state . messages . length - 1 ] ) ;
41-
42- const [ forceUpdate , setForceUpdate ] = useState ( 0 ) ;
43- const [ unread , setUnread ] = useState ( channel . countUnread ( ) ) ;
44-
36+ const { forceUpdate, channel, client, Preview } = props ;
37+ const { muted } = useIsChannelMuted ( channel ) ;
38+ const { lastMessage, unread } = useChannelPreviewData ( channel , client , forceUpdate , muted ) ;
4539 const latestMessagePreview = useLatestMessagePreview ( channel , forceUpdate , lastMessage ) ;
4640
47- const channelLastMessage = channel . lastMessage ( ) ;
48- const channelLastMessageString = `${ channelLastMessage ?. id } ${ channelLastMessage ?. updated_at } ` ;
49-
50- useEffect ( ( ) => {
51- const { unsubscribe } = client . on ( 'notification.mark_read' , ( ) => {
52- setUnread ( channel . countUnread ( ) ) ;
53- } ) ;
54- return unsubscribe ;
55- // eslint-disable-next-line react-hooks/exhaustive-deps
56- } , [ ] ) ;
57-
58- useEffect ( ( ) => {
59- if (
60- channelLastMessage &&
61- ( channelLastMessage . id !== lastMessage ?. id ||
62- channelLastMessage . updated_at !== lastMessage ?. updated_at )
63- ) {
64- setLastMessage ( channelLastMessage ) ;
65- }
66-
67- const newUnreadCount = channel . countUnread ( ) ;
68- setUnread ( newUnreadCount ) ;
69- // eslint-disable-next-line react-hooks/exhaustive-deps
70- } , [ channelLastMessageString , channelListForceUpdate ] ) ;
71-
72- useEffect ( ( ) => {
73- const handleNewMessageEvent = ( event : Event < StreamChatGenerics > ) => {
74- const message = event . message ;
75- if ( message && ( ! message . parent_id || message . show_in_channel ) ) {
76- setLastMessage ( event . message ) ;
77- setUnread ( channel . countUnread ( ) ) ;
78- }
79- } ;
80-
81- const handleUpdatedOrDeletedMessage = ( event : Event < StreamChatGenerics > ) => {
82- setLastMessage ( ( prevLastMessage ) => {
83- if ( prevLastMessage ?. id === event . message ?. id ) {
84- return event . message ;
85- }
86- return prevLastMessage ;
87- } ) ;
88- } ;
89-
90- const listeners = [
91- channel . on ( 'message.new' , handleNewMessageEvent ) ,
92- channel . on ( 'message.updated' , handleUpdatedOrDeletedMessage ) ,
93- channel . on ( 'message.deleted' , handleUpdatedOrDeletedMessage ) ,
94- ] ;
95-
96- return ( ) => listeners . forEach ( ( l ) => l . unsubscribe ( ) ) ;
97- // eslint-disable-next-line react-hooks/exhaustive-deps
98- } , [ ] ) ;
99-
100- useEffect ( ( ) => {
101- const handleReadEvent = ( event : Event < StreamChatGenerics > ) => {
102- if ( event . user ?. id === client . userID ) {
103- setUnread ( 0 ) ;
104- } else if ( event . user ?. id ) {
105- setForceUpdate ( ( prev ) => prev + 1 ) ;
106- }
107- } ;
108-
109- const listener = channel . on ( 'message.read' , handleReadEvent ) ;
110- return ( ) => listener . unsubscribe ( ) ;
111- // eslint-disable-next-line react-hooks/exhaustive-deps
112- } , [ ] ) ;
113-
114- return < Preview channel = { channel } latestMessagePreview = { latestMessagePreview } unread = { unread } /> ;
41+ return (
42+ < Preview
43+ channel = { channel }
44+ latestMessagePreview = { latestMessagePreview }
45+ muted = { muted }
46+ unread = { unread }
47+ />
48+ ) ;
11549} ;
11650
11751export type ChannelPreviewProps <
0 commit comments