@@ -2,13 +2,39 @@ import React from 'react';
22
33import { IconLayoutAlignLeft } from '../Icons/icons' ;
44import { type ChannelAvatarProps , ChannelAvatar as DefaultAvatar } from '../Avatar' ;
5+ import { TypingIndicatorHeader } from '../TypingIndicator/TypingIndicatorHeader' ;
56import { useChannelHeaderOnlineStatus } from './hooks/useChannelHeaderOnlineStatus' ;
67import { useChannelPreviewInfo } from '../ChannelPreview/hooks/useChannelPreviewInfo' ;
78import { useChannelStateContext } from '../../context/ChannelStateContext' ;
89import { useChatContext } from '../../context/ChatContext' ;
10+ import { useTypingContext } from '../../context/TypingContext' ;
911import clsx from 'clsx' ;
1012import { ToggleSidebarButton } from '../Button/ToggleSidebarButton' ;
1113
14+ const ChannelHeaderSubtitle = ( ) => {
15+ const { channelConfig } = useChannelStateContext ( 'ChannelHeaderSubtitle' ) ;
16+ const { client } = useChatContext ( 'ChannelHeaderSubtitle' ) ;
17+ const { typing = { } } = useTypingContext ( 'ChannelHeaderSubtitle' ) ;
18+ const onlineStatusText = useChannelHeaderOnlineStatus ( ) ;
19+ const typingInChannel = Object . values ( typing ) . filter (
20+ ( { parent_id, user } ) => user ?. id !== client . user ?. id && ! parent_id ,
21+ ) ;
22+ const hasTyping = channelConfig ?. typing_events !== false && typingInChannel . length > 0 ;
23+
24+ if ( ! hasTyping && ! onlineStatusText ) return null ;
25+
26+ return (
27+ < div className = 'str-chat__channel-header__data__subtitle' >
28+ < span
29+ className = 'str-chat__subtitle-content-transition'
30+ key = { hasTyping ? 'typing' : 'default' }
31+ >
32+ { hasTyping ? < TypingIndicatorHeader /> : onlineStatusText }
33+ </ span >
34+ </ div >
35+ ) ;
36+ } ;
37+
1238export type ChannelHeaderProps = {
1339 /** UI component to display an avatar, defaults to [Avatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/Avatar.tsx) component and accepts the same props as: [ChannelAvatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/ChannelAvatar.tsx) */
1440 Avatar ?: React . ComponentType < ChannelAvatarProps > ;
@@ -38,7 +64,6 @@ export const ChannelHeader = (props: ChannelHeaderProps) => {
3864 overrideImage,
3965 overrideTitle,
4066 } ) ;
41- const onlineStatusText = useChannelHeaderOnlineStatus ( ) ;
4267
4368 return (
4469 < div
@@ -51,11 +76,7 @@ export const ChannelHeader = (props: ChannelHeaderProps) => {
5176 </ ToggleSidebarButton >
5277 < div className = 'str-chat__channel-header__data' >
5378 < div className = 'str-chat__channel-header__data__title' > { displayTitle } </ div >
54- { onlineStatusText != null && (
55- < div className = 'str-chat__channel-header__data__subtitle' >
56- { onlineStatusText }
57- </ div >
58- ) }
79+ < ChannelHeaderSubtitle />
5980 </ div >
6081 < Avatar
6182 className = 'str-chat__avatar--channel-header'
0 commit comments