ChannelHeader
ChannelHeader shows the channel from useChannel(): its title, a subtitle with who's typing or who's online, and its avatar, between a back button and a close button. Channel UI explains each part.
Best practices
- Render it inside
Channel, above the message list. - Change it through its props.
ChannelHeaderhas no override key: you render it yourself, so you can render something else instead. - A component passed as
StartContentorEndContentreplaces the back or the close button. To keep the button, render it inside your component. - For a different header altogether, write your own component. It reads the channel with
useChannel(), and the title and image withuseChannelPreviewInfo().
Basic usage
import {
Channel,
ChannelHeader,
MessageComposer,
MessageList,
} from "stream-chat-react";
export const ChannelPanel = () => (
<Channel channel={channel}>
<ChannelHeader />
<MessageList />
<MessageComposer />
</Channel>
);Default behavior
From start to end, the header renders:
StartContent, by defaultWorkspaceNavigationBackButton. It shows only while the channel is stacked over other content in its panel.- The title: the channel's name. A channel without one shows the other member's name in a direct message, and members' names in a group.
- The subtitle: "Cleo is typing" while other users type in the channel, through
TypingIndicatorHeader. Otherwise "Online" or "Offline" in a direct message, and "12 members · 3 online" in a group, where online counts the channel's watchers. Typing shows only while typing events are on for the channel. - The avatar:
ChannelAvatarwith the channel image, or the members' avatars when the channel has no image. EndContent, by defaultWorkspaceNavigationCloseButton. It shows only when the channel's panel can be closed.
Both buttons come from the layout: without one, neither renders. Moving between channels, threads and messages explains back and close.
UI customization
This header adds a menu button and keeps the back button, and opens channel details from the avatar:
import {
ChannelHeader,
WorkspaceNavigationBackButton,
} from "stream-chat-react";
import { AvatarWithChannelDetail } from "stream-chat-react/channel-detail";
const HeaderStart = () => (
<>
<WorkspaceNavigationBackButton />
<button onClick={() => console.log("Open the menu")} type="button">
Menu
</button>
</>
);
export const AppChannelHeader = () => (
<ChannelHeader Avatar={AvatarWithChannelDetail} StartContent={HeaderStart} />
);AvatarWithChannelDetail needs the channel-detail.css stylesheet; see Channel details.
A header of your own can reuse the parts of the default one:
import {
ChannelAvatar,
TypingIndicatorHeader,
useChannel,
useChannelPreviewInfo,
} from "stream-chat-react";
export const CompactChannelHeader = () => {
const channel = useChannel();
const { displayImage, displayTitle, groupChannelDisplayInfo } =
useChannelPreviewInfo({ channel });
return (
<div className="compact-channel-header">
<ChannelAvatar
displayMembers={groupChannelDisplayInfo.members}
imageUrl={displayImage}
size="md"
userName={displayTitle}
/>
<strong>{displayTitle}</strong>
<TypingIndicatorHeader />
</div>
);
};TypingIndicatorHeader renders nothing while nobody is typing. The Channel header recipe builds a complete header.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
Avatar |
ComponentType<ChannelAvatarProps> |
ChannelAvatar |
Renders the avatar. It receives displayMembers, imageUrl, userName, size="lg" and the class str-chat__avatar--channel-header. |
EndContent |
ComponentType |
WorkspaceNavigationCloseButton |
Rendered at the end, after the avatar. A component you pass replaces the close button. |
image |
string |
the channel's display image | Replaces the image the avatar shows. |
StartContent |
ComponentType |
WorkspaceNavigationBackButton |
Rendered at the start. A component you pass replaces the back button. |
title |
string |
the channel's display title | Replaces the title. The avatar's userName is the title too. |
Related hooks
| Hook | Returns |
|---|---|
useChannel() |
the channel the header shows |
useChannelPreviewInfo({ channel }) |
displayTitle, displayImage and groupChannelDisplayInfo, the members a group avatar shows |
useMessageComposerController() |
the composer whose text composer state holds who's typing |
The typing data is explained in Typing indicator, and the channel hooks are on Channel and thread hooks.