Repository navigation
feat: add smooth scrolling to MessageList - #3027
Merged
Merged
Conversation
Contributor
|
Size Change: +3.1 kB (+0.71%) Total Size: 437 kB
ℹ️ View Unchanged
|
github-actions Bot
pushed a commit
that referenced
this pull request
Mar 23, 2026
## [14.0.0-beta.1](v13.13.1...v14.0.0-beta.1) (2026-03-23) ### ⚠ BREAKING CHANGES * All `str-chat__channel-preview*` CSS classes have been renamed to `str-chat__channel-list-item*` (e.g. `.str-chat__channel-preview-container` → `.str-chat__channel-list-item-container`); `.str-chat__message-input-cooldown` has been renamed to `.str-chat__message-composer-cooldown`; `.str-chat__message-simple-name` has been renamed to `.str-chat__message-metadata__name`; `.str-chat__simple-message--error-failed` has been renamed to `.str-chat__message-inner--error`; `.str-chat__message-simple-timestamp` has been renamed to `.str-chat__message-metadata__timestamp`. Removed `.str-chat__message-simple` and `.str-chat__message-simple--me` root class names from `MessageUI` and `MessageBlocked` components. Component `MessageActionsWrapper` has been dropped. * replace MessageListNotifications with NotificationList * remove PauseIcon, PlayTriangleIcon, GeolocationIcon * replace openButtonProps with TriggerComponent in DropdownProps * remove dialogId from DropdownProps * the BaseImage component uses ImageFallback component instead of CSS masl to display fallback on error * replaced addNotification from ChannelStateContenxt with client.notifications API * NotificationList was moved with new parent now being MessageListMainPanel * rename MessageListNotificationsProps to NotificationListProps * `useAudioController` has been removed from the public API. Migrate custom audio playback code to `useAudioPlayer`. ### 🛠 Implementation details - delete `src/components/Attachment/hooks/useAudioController.ts` - remove the public export from `src/components/Attachment/index.ts` - decouple `WaveProgressBar` from the deleted hook file by giving it its own UI-level seek callback type - keep the current audio playback components compatible with `audioPlayer.seek` - validated with `yarn types` ### 🎨 UI Changes None. * ChannelSearch component set has been dropped, use Search instead. * useChannelPreviewInfo now always returns a defined `groupChannelDisplayInfo` (object with `members` and `overflowCount`). For 1:1 or ≤2 members it returns `{ members: [], overflowCount: undefined }`. Code that treated `groupChannelDisplayInfo == null` as “not a group” should use e.g. `groupChannelDisplayInfo.members.length >= 2` instead. * close modals from within modal contents using ModalContextValue.close * removed Modal component and kept only GlobalModal component * removed div with class str-chat_modal-inner * remove support for "live" label * remove support for displaying channel.data.subtitle under the title * replace str-chat__channel-header-end with str-chat__channel-header__data * remove MessageIsThreadReplyInChannelButtonIndicator from ComponentContext * replace MessageIsThreadReplyInChannelButtonIndicator with MessageAlsoSentInChannelIndicator * remove CSS variables for --str-chat__jump-to-latest-message-* * rename MessageNotification to NewMessageNotification * rename ScrollToBottomButton to ScrollToLatestMessageButton * introduce ScrollToLatestMessageButton by default into message list * change the markup of ScrollToLatestMessageButton * change the markup of UnreadMessagesSeparator * `MessageReactionsDetail`'s (formerly `ReactionsListModal`) composition (markup) has changed, class names have been renamed or removed (see table bellow). It no longer renders in a modal but rather in a dialog - this change required a container-agnostic rename. | Change Type | Old Class Name | New Class Name | | -------------------- | ------------------------------------------------------------- | * replaced isOnlyEmojis util function with messageTextHasEmojisOnly * replaced component MessageDeleted with MessageDeletedBubble. * in Message, the MessageDeleted does not have default component. Instead, message deleted is now rendered within message bubble using MessageDeletedBubble. Thus the default deleted message UI now shows message annotations, metadata and replies button. * remove FixedHeightMessage component * change props for VirtualMessage in ComponentContext from FixedHeightMessageProps to MessageUIComponentProps * Remove legacy high-order context wrappers (`with*Context`) from `stream-chat-react` since the docs and internal usage are hook-based (`use*Context`). ### 🛠 Implementation details - Removed the following exported HOCs from context modules: - `withChannelActionContext` - `withChannelStateContext` - `withChatContext` - `withComponentContext` - `withMessageContext` - `withTranslationContext` - `withTypingContext` - Kept provider/hook APIs intact (`*Provider` and `use*Context`). - Removed now-unused imports/types tied to HOC implementations (including `UnknownType` usages in these files). - Deleted now-unused helper `src/context/utils/getDisplayName.ts`. ### 🎨 UI Changes N/A (no UI changes). * change the signature of MessageContextValue['handleDelete'] * remove props endOfGroup, firstOfGroup and groupedByUser from MessageProps as their purpose is unknown and message grouping should be done by Message prop groupStyles * order of actions in MessageActions has changed * removed CSS variables --str-chat__message-bounce-* * remove RemindMeActionButton and RemindMeActionButtonProps * remove QuotedPoll component and isQuoted prop from Poll * str-chat__message-composer-container now wraps the message composer * date separator does not contain separation lines * 1 or more images and giphy attachment are now rendered with ModalGallery component * ModalGallery component is now user to render the image preview in message bubble and Gallery in full-screen mode if clicked on the attachment in the bubble * Assets rendered in Gallery have to be of a new type GalleryItem * Overriding ModalGallery in ComponentContext means overriding the attachment preview as well as the Gallery on Modal view * Overriding Gallery in ComponentContext means overriding a component that renders media assets in slideshow and provides the slideshow navigation API * `GroupAvatar` component now renders a singular `Avatar` component without any wrappers if the `groupChannelDisplayInfo` contains only a single entry. Some class names have been removed, see the table bellow: | Change Type | Old Class Name | New Class Name | | ----------- | ------------------------------------ | -------------- | | Removed | `str-chat__avatar--single` | - | | Removed | `str-chat__avatar-group--three-part` | - | * Certain element classes have been renamed, some have been removed, see the table of the actual changes bellow: | Change Type | Old Class Name | New Class Name | | ----------- | --------------------------------------- | --------------------------------------------------- | | Changed | `str-chat__reaction-list` | `str-chat__message-reactions` | | Removed | `str-chat__message-reactions-container` | - | | Removed | `str-chat__reaction-list--reverse` | - | | Changed | `str-chat__message-reactions` | `str-chat__message-reactions__list` | | Changed | `str-chat__message-reaction` | `str-chat__message-reactions__list-item` | | Removed | `str-chat__message-reaction-own` | - | | Changed | `str-chat__message-reaction-emoji` | `str-chat__message-reactions__item-icon` | | Changed | `str-chat__message-reaction-count` | `str-chat__message-reactions__item-count` | | Changed | `str-chat__reaction-list--counter` | `str-chat__message-reactions__total-count` | * replace specific components in MessageActions with general purpose ContextMenu components * MessageOptions, CustomMessageActions, CustomMessageActionsList, MessageActionsBox are no longer available, use MessageActions functionality instead. * suggestion list and suggestion list items were re-implemented with new ContextMenu API. * the suggestion list and suggestion list items have changed the markup * `Avatar` component no longer takes `user` prop, prop `image` has been renamed to `imageUrl` and prop `name` has been renamed to `userName`. * Props `Avatar`, `detailedView`, `latest_reactions`, `reaction_counts`, `reaction_groups`, `reactionOptions` & `reverse` have been removed from `ReactionSelector` component. The reason is that some of them were deprecated and some of them weren't being used in a way the component was set up by default. The component's class names have also changed, see table. | Change Type | Old Class Name | New Class Name | | ----------- | * `Channel` component no longer supports component overrides, use `WithComponents` instead. ### chore * remove with*Context HOC wrappers ([#2962](#2962)) ([e0cd4f2](e0cd4f2)) ### Bug Fixes * add integration guide md file to help AI assistant's work ([8441f5b](8441f5b)) * add integration guide md file to help AI assistant's work ([#2911](#2911)) ([2efd30e](2efd30e)) * add temporarily CSS v2 palette-variables ([#3040](#3040)) ([48d4647](48d4647)) * adjust ChatView.Selector buttons styles ([#2990](#2990)) ([7907f51](7907f51)) * **ai:** stop typewriter animation on `ai_indicator.stop` ([#2918](#2918)) ([7777721](7777721)) * align chat view sidebars and attachment preview remove icon ([#3004](#3004)) ([08dc4b6](08dc4b6)) * align message list width constraints ([#2965](#2965)) ([02c9b8d](02c9b8d)) * allow forwarding `unsafeHTML` to system messages (`EventComponent`) ([#2973](#2973)) ([99c3960](99c3960)) * change class names to reflect component renames ([#3035](#3035)) ([7c978a9](7c978a9)) * component renames ([#3030](#3030)) ([a563248](a563248)) * **demo:** remove archived filter param ([46da3f8](46da3f8)) * **demo:** remove pinned_at sort param ([0bc9ed6](0bc9ed6)) * don't expose giphy arg in quoted message preview and channel preview ([21b905c](21b905c)) * exit search on blur [REACT-855] ([#3013](#3013)) ([97f485d](97f485d)) * focus outline visual glitch for input ([212e449](212e449)) * giphy and command ui fixes ([#3025](#3025)) ([aa36a4d](aa36a4d)) * hide buttons in message input if a command is selected ([22d32d4](22d32d4)) * improve md file to guide AI assistants used by our integrators ([7339614](7339614)) * improve md file to guide AI assistants used by our integrators ([#2912](#2912)) ([c249ef7](c249ef7)) * isDayjs import usage for ESM ([#2924](#2924)) ([73f8767](73f8767)) * make poll forms submitable ([#2989](#2989)) ([7dc82ca](7dc82ca)) * make the full option list container take the available height ([da77bf3](da77bf3)) * make vite example channel selection bookmarkable ([#2997](#2997)) ([1fbbfd1](1fbbfd1)) * move show all options button to PollOptionList component ([e75ca3a](e75ca3a)) * only categorize giphy type as giphy attachment ([f032187](f032187)) * poll UI fixes ([#3034](#3034)) ([885b7a6](885b7a6)) * prevent increasing unread count by useMarkRead hook if read-events are disabled ([#2925](#2925)) ([d0e7b5f](d0e7b5f)) * prevent mobile sidebar overlays from shifting chat content ([#2995](#2995)) ([35f4282](35f4282)) * recert interactive flag, make Giphy use BaseImage ([59163cc](59163cc)) * remove Channel component propagation ([#2904](#2904)) ([cd6001f](cd6001f)) * remove customMessageData from handleSubmit type declaration ([#2950](#2950)) ([fc547be](fc547be)) * remove MessageEditedTimestamp component ([7cbe67e](7cbe67e)) * remove the tooltip from PollVote ([ca11f90](ca11f90)) * remove unnecessary CSS ([3fc6f3f](3fc6f3f)) * rename ChannelListMessenger to ChannelListUI ([#3036](#3036)) ([d251338](d251338)) * revert changes to EndPollAlert ([c364b0b](c364b0b)) * show ToggleSidebarButton in threads view's ThreadHeader ([#3020](#3020)) ([53d5639](53d5639)) * single checkmark color in dark mode ([283fad8](283fad8)) * single checkmark color in dark mode ([#3032](#3032)) ([b3858c8](b3858c8)) * sort command menus consistently ([#2967](#2967)) ([64fd76b](64fd76b)) * stabilize all test suites after v14 breaking changes ([#3039](#3039)) ([91c1602](91c1602)) * suggesting a poll option shouldn't vote for it ([e0659f3](e0659f3)) * turn off interactions for giphy ([d403eee](d403eee)) * unified SummarizedMessagePreview, cover more cases ([#2977](#2977)) ([1589481](1589481)) * unify poll modal: title casing for EN; placeholders; button placement ([33fed1e](33fed1e)) * update ChatView selector icons ([#2985](#2985)) ([ea814c3](ea814c3)) * voice recorder button not shown when quoting a message ([3a5dcdd](3a5dcdd)) * voice recorder button not shown when quoting a message ([#3015](#3015)) ([dbd6648](dbd6648)) * wrap attachment previews in message composer ([#2994](#2994)) ([a401978](a401978)) ### Features * add AvatarStack component + message replies button redesign ([#2938](#2938)) ([f7ad774](f7ad774)), closes [#2937](#2937) * add Button component and styles ([#2914](#2914)) ([f4675c6](f4675c6)) * add CSS variables ([#2913](#2913)) ([4bc9ac4](4bc9ac4)) * add dark theme support to stream-chat-react ([#3002](#3002)) ([fbe28d0](fbe28d0)) * add EventComponent (system message) redesign ([#3007](#3007)) ([c17fc99](c17fc99)) * add message translation indicator ([#2958](#2958)) ([5c3a996](5c3a996)) * add MessageEditedIndicator component ([cfbe346](cfbe346)) * add MessageEditedIndicator component ([#3019](#3019)) ([7e9637a](7e9637a)) * add new giphy and audio attachment widget designs and attachment grouping redesign ([#2934](#2934)) ([e990c06](e990c06)) * add ReactionSelector styling + cleanup ([#2916](#2916)) ([24a1169](24a1169)) * add sidebar display control ([#2978](#2978)) ([b77d995](b77d995)) * add smooth scrolling to MessageList ([#3027](#3027)) ([cdf35d2](cdf35d2)) * adjust media gallery viewer ([#3006](#3006)) ([6ea7a78](6ea7a78)) * adjust vertical and horizontal message spacing ([#2954](#2954)) ([ba65752](ba65752)) * align iconOnly API and unread badge styling ([#2982](#2982)) ([c28b8ff](c28b8ff)) * align web sidebar nav icons with mobile tab bar ([#2979](#2979)) ([370caea](370caea)) * channel preview redesign ([#2974](#2974)) ([5ef9027](5ef9027)) * convert ChatView into a general purpose sidebar ([#2939](#2939)) ([cd7a030](cd7a030)) * extended reaction selector ([#2972](#2972)) ([80c14e5](80c14e5)) * implement pinned message redesign ([#2952](#2952)) ([3af135f](3af135f)) * import all the icons that belong to Stream design system ([#2949](#2949)) ([55c9a1a](55c9a1a)) * introduce button variant props ([#2969](#2969)) ([2a4eabd](2a4eabd)) * introduce channelActionSet ([#3026](#3026)) ([199797e](199797e)) * introduce Search component redesign ([#2981](#2981)) ([c0b6230](c0b6230)) * introduce thread preview redesign ([#2975](#2975)) ([90fdfe5](90fdfe5)) * message reactions (`ReactionsList`) redesign ([#2933](#2933)) ([ce087fa](ce087fa)) * message reactions detail redesign ([#2963](#2963)) ([a941ed2](a941ed2)) * migrate MessageActions to use ContextMenu ([#2932](#2932)) ([1d28279](1d28279)) * new Avatar component design & adjustments ([#2926](#2926)) ([2eb04ee](2eb04ee)) * new GroupAvatar component design & adjustments ([#2930](#2930)) ([e307882](e307882)) * poll actions modals adjustments ([#2993](#2993)) ([cc44c3f](cc44c3f)) * promote experimental `MessageActions` to stable ([#2908](#2908)) ([1467b5c](1467b5c)) * promote Search to stable, drop ChannelSearch [REACT-894] ([#3014](#3014)) ([9a7b7a2](9a7b7a2)) * redesign ChannelHeader ([#2970](#2970)) ([57f8a91](57f8a91)) * redesign ChannelList loading skeletons ([#2988](#2988)) ([e5b3b8e](e5b3b8e)) * redesign deleted message ([#2964](#2964)) ([446de99](446de99)) * redesign EmptyStateIndicator for channel message list ([#2960](#2960)) ([e745d69](e745d69)) * redesign file drag-and-drop overlay ([#2959](#2959)) ([d2a72b5](d2a72b5)) * redesign floating indicators in message lists ([#2966](#2966)) ([12d075b](12d075b)) * redesign image loading and error placeholders ([#3000](#3000)) ([3539020](3539020)) * redesign image placeholder ([#3024](#3024)) ([d34a0b8](d34a0b8)) * redesign location sharing components & port the missing component CSS ([#3031](#3031)) ([b72deda](b72deda)) * redesign message annotations ([#2956](#2956)) ([5702090](5702090)) * redesign message composer commands, mentions and emoji suggestion lists ([#2931](#2931)) ([f151abc](f151abc)) * redesign message composer for thread and allow to grow to 10 lines ([#2983](#2983)) ([6b0310a](6b0310a)) * redesign message list elements spacing ([#2937](#2937)) ([1bf815f](1bf815f)) * redesign MessageActions ([#2951](#2951)) ([256d862](256d862)) * redesign notification system ([#3018](#3018)) ([83dec93](83dec93)) * redesign poll actions modals ([#2986](#2986)) ([861d7de](861d7de)) * redesign poll in message and poll creation dialog ([#2944](#2944)) ([c8adac4](c8adac4)) * redesign SendToChannelCheckbox ([#2971](#2971)) ([1695a85](1695a85)) * redesign the LoadingChannel component ([#2991](#2991)) ([790df17](790df17)) * redesign ThreadHeader and ThreadHead ([#2987](#2987)) ([059ae6a](059ae6a)) * redesign typing indicator ([#3005](#3005)) ([d6c08ca](d6c08ca)) * refresh Message design ([#2927](#2927)) ([40525f3](40525f3)) * refresh MessageComposer design ([#2919](#2919)) ([87e89f7](87e89f7)) * remove MessageListNotifications component ([#3028](#3028)) ([e06ec62](e06ec62)) * render voice recording preview in a dedicated slot ([#2957](#2957)) ([2859c76](2859c76)) * replace MessageIsThreadReplyInChannelButtonIndicator with MessageAlsoSentInChannelIndicator ([#2968](#2968)) ([b198029](b198029)) * replace react-image-gallery with proprietary Gallery component ([#2936](#2936)) ([a52de09](a52de09)) * return modal's close button ([#2948](#2948)) ([62a27e8](62a27e8)) * return ProgressBar to Audio attachment component ([#3022](#3022)) ([d3d1e19](d3d1e19)) * reuse channel list loading skeletons for thread list ([#2992](#2992)) ([3d7a3a3](3d7a3a3)) * show only time in MessageTimestamp ([#3021](#3021)) ([da4aa92](da4aa92)) * unify channel and thread display titles ([#2998](#2998)) ([29bb396](29bb396)) * unify dialog UI system ([#2955](#2955)) ([44e2eaf](44e2eaf)) * update empty states across chat views ([#2976](#2976)) ([7eacfb7](7eacfb7)) * use server-defined default limits for channel and channel lists ([#2943](#2943)) ([6302c96](6302c96)), closes [#2940](#2940) * **vite-example:** add custom message UI showcase ([#3029](#3029)) ([629e49f](629e49f)) * **vite-example:** add resizable chat panels ([#3009](#3009)) ([0e34114](0e34114)) ### Refactors * move BaseImage out of gallery ([dfe9d77](dfe9d77)) * remove deprecated useAudioController hook ([#3016](#3016)) ([35f8a5d](35f8a5d)) * remove initialNavOpenResponsive for redundancy ([#3023](#3023)) ([1227617](1227617))
|
🎉 This PR is included in version 14.0.0-beta.1 🎉 The release is available on: Your semantic-release bot 📦🚀 |
github-actions Bot
pushed a commit
that referenced
this pull request
Apr 16, 2026
## [14.0.0](https://github.com/GetStream/stream-chat-react/compare/v13.13.1...v14.0.0) (2026-04-16)
### ⚠ BREAKING CHANGES
* remove onlySenderCanEdit from MessageProps
* - Removed legacy notification text callback props from Message props:
getDeleteMessageErrorNotification,
getFetchReactionsErrorNotification,
getFlagMessageErrorNotification,
getFlagMessageSuccessNotification,
getMarkMessageUnreadErrorNotification,
getMarkMessageUnreadSuccessNotification,
getMuteUserErrorNotification,
getMuteUserSuccessNotification,
getPinMessageErrorNotification.
Notification customization must now be done through notification
translators
(Streami18n translationBuilder topic: "notification") and/or custom
MessageActions.
* - Message action handlers no longer publish notifications internally.
Errors now propagate to call sites, which are responsible for
success/error notifications.
* - Removed ConnectionStatus component. Connection notification UI is app
responsibility now.
* externalize sidebar toggle and remove navOpen state from the SDK (#3088)
* remove deprecated APIs ahead of v14 stable (#3086)
* for existing code but changes the accepted values.
### `getGroupChannelDisplayInfo` return value changed
The utility function `getGroupChannelDisplayInfo` (from
`src/components/ChannelListItem/utils.tsx`) no longer returns
`overflowCount` in its result object.
### `AvatarProps.size` type widened to accept arbitrary strings
The `size` prop on `AvatarProps` changed from the union `'2xl' | 'xl' |
'lg' | 'md' | 'sm' | 'xs' | null` to `'2xl' | 'xl' | 'lg' | 'md' | 'sm'
| 'xs' | (string & {}) | null`. This allows passing custom size strings
while preserving autocomplete for the known values.
### `GroupAvatarProps.size` type widened to accept arbitrary strings
The `size` prop on `GroupAvatarProps` changed from `'2xl' | 'xl' | 'lg'
| null` to `'2xl' | 'xl' | 'lg' | (string & {}) | null`. This allows
passing custom size strings while preserving autocomplete for the known
values.
### New `capLimit` prop on `AvatarStack`
A new optional `capLimit` prop (type `number`, default `3`) controls the
maximum number of avatars rendered before overflow. When `displayInfo`
has more entries than `capLimit`, only the first `capLimit` items are
shown and a "+N" badge displays the remainder.
### `GroupAvatarMember` type gains optional `id` field
The `GroupAvatarMember` type now includes an optional `id?: string`
field. When present, it is used as the React `key` for rendered avatars
instead of the fallback `${userName}-${imageUrl}-${index}` pattern.
## Behavioral Changes
### `ChannelAvatar` always renders via `GroupAvatar` internally
Previously, `ChannelAvatar` conditionally chose between `<Avatar>` (for
0–1 members) and `<GroupAvatar>` (for 2+ members). It now always
delegates to `<GroupAvatar>`, which itself renders a single `<Avatar>`
when fewer than 2 members are present. The visual output is unchanged,
but the component tree structure differs.
### `GroupAvatar` auto-caps displayed members at 4 (or 2 with overflow)
Previously, callers controlled how many members to display and the
overflow count. Now `GroupAvatar` internally slices `displayMembers`:
- **4 or fewer members:** all are rendered, no badge.
- **More than 4 members:** only the first 2 are rendered, with a "+N"
badge showing the count of remaining members.
### `AvatarStack` auto-caps displayed items (default: 3, configurable
via `capLimit`)
Previously, callers controlled how many items to display and the
overflow count. Now `AvatarStack` internally slices `displayInfo` based
on the `capLimit` prop (default `3`):
- **`capLimit` or fewer items:** all are rendered, no badge.
- **More than `capLimit` items:** only the first `capLimit` are
rendered, with a "+N" badge showing the count of remaining items.
### `TypingIndicator` no longer manually slices typing users
The `TypingIndicator` component previously sliced the list of typing
users to a maximum of 3 before passing to `AvatarStack`. It now passes
all typing users, relying on `AvatarStack`'s internal capping (also at
3). The net visual result is unchanged.
* Importing styles from `stream-chat-react/dist/css/v2/*`
would no longer work, import from `stream-chat-react/dist/css/*`
instead.
* remove components ActionsIcon, ReactionIcon,
ThreadIcon, MessageErrorIcon
* replace class str-chat__message-error-icon with str-chat__message-error-indicator
* do not allow to mark own messages unread
* remove MessageErrorText component
* re-throw error from handleDelete in MessageContext
* All `str-chat__channel-preview*` CSS classes have been
renamed to `str-chat__channel-list-item*` (e.g.
`.str-chat__channel-preview-container` →
`.str-chat__channel-list-item-container`);
`.str-chat__message-input-cooldown` has been renamed to
`.str-chat__message-composer-cooldown`; `.str-chat__message-simple-name`
has been renamed to `.str-chat__message-metadata__name`;
`.str-chat__simple-message--error-failed` has been renamed to
`.str-chat__message-inner--error`; `.str-chat__message-simple-timestamp`
has been renamed to `.str-chat__message-metadata__timestamp`. Removed
`.str-chat__message-simple` and `.str-chat__message-simple--me` root
class names from `MessageUI` and `MessageBlocked` components. Component
`MessageActionsWrapper` has been dropped.
* replace MessageListNotifications with NotificationList
* remove PauseIcon, PlayTriangleIcon, GeolocationIcon
* replace openButtonProps with TriggerComponent in
DropdownProps
* remove dialogId from DropdownProps
* the BaseImage component uses ImageFallback component instead of CSS masl to display fallback on error
* replaced addNotification from ChannelStateContenxt with
client.notifications API
* NotificationList was moved with new parent now being MessageListMainPanel
* rename MessageListNotificationsProps to NotificationListProps
* `useAudioController` has been removed from the public
API. Migrate custom audio playback code to `useAudioPlayer`.
### 🛠 Implementation details
- delete `src/components/Attachment/hooks/useAudioController.ts`
- remove the public export from `src/components/Attachment/index.ts`
- decouple `WaveProgressBar` from the deleted hook file by giving it its
own UI-level seek callback type
- keep the current audio playback components compatible with
`audioPlayer.seek`
- validated with `yarn types`
### 🎨 UI Changes
None.
* ChannelSearch component set has been dropped, use
Search instead.
* useChannelPreviewInfo now always returns a defined
`groupChannelDisplayInfo` (object with `members` and `overflowCount`).
For 1:1 or ≤2 members it returns `{ members: [], overflowCount:
undefined }`. Code that treated `groupChannelDisplayInfo == null` as
“not a group” should use e.g. `groupChannelDisplayInfo.members.length >=
2` instead.
* close modals from within modal contents using
ModalContextValue.close
* removed Modal component and kept only GlobalModal
component
* removed div with class str-chat_modal-inner
* remove support for "live" label
* remove support for displaying channel.data.subtitle
under the title
* replace str-chat__channel-header-end with
str-chat__channel-header__data
* remove MessageIsThreadReplyInChannelButtonIndicator
from ComponentContext
* replace MessageIsThreadReplyInChannelButtonIndicator
with MessageAlsoSentInChannelIndicator
* remove CSS variables for
--str-chat__jump-to-latest-message-*
* rename MessageNotification to NewMessageNotification
* rename ScrollToBottomButton to
ScrollToLatestMessageButton
* introduce ScrollToLatestMessageButton by default into
message list
* change the markup of ScrollToLatestMessageButton
* change the markup of UnreadMessagesSeparator
* `MessageReactionsDetail`'s (formerly
`ReactionsListModal`) composition (markup) has changed, class names have
been renamed or removed (see table bellow). It no longer renders in a
modal but rather in a dialog - this change required a container-agnostic
rename.
| Change Type | Old Class Name | New Class Name |
| -------------------- |
------------------------------------------------------------- |
* replaced isOnlyEmojis util function with
messageTextHasEmojisOnly
* replaced component MessageDeleted with
MessageDeletedBubble.
* in Message, the MessageDeleted does not have default
component. Instead, message deleted is now rendered within message
bubble using MessageDeletedBubble. Thus the default deleted message UI
now shows message annotations, metadata and replies button.
* remove FixedHeightMessage component
* change props for VirtualMessage in ComponentContext
from FixedHeightMessageProps to MessageUIComponentProps
* Remove legacy high-order context wrappers
(`with*Context`) from `stream-chat-react` since the docs and internal
usage are hook-based (`use*Context`).
### 🛠 Implementation details
- Removed the following exported HOCs from context modules:
- `withChannelActionContext`
- `withChannelStateContext`
- `withChatContext`
- `withComponentContext`
- `withMessageContext`
- `withTranslationContext`
- `withTypingContext`
- Kept provider/hook APIs intact (`*Provider` and `use*Context`).
- Removed now-unused imports/types tied to HOC implementations
(including `UnknownType` usages in these files).
- Deleted now-unused helper `src/context/utils/getDisplayName.ts`.
### 🎨 UI Changes
N/A (no UI changes).
* change the signature of MessageContextValue['handleDelete']
* remove props endOfGroup, firstOfGroup and groupedByUser
from MessageProps as their purpose is unknown and message grouping
should be done by Message prop groupStyles
* order of actions in MessageActions has changed
* removed CSS variables --str-chat__message-bounce-*
* remove RemindMeActionButton and RemindMeActionButtonProps
* remove QuotedPoll component and isQuoted prop from Poll
* str-chat__message-composer-container now wraps the
message composer
* date separator does not contain separation lines
* 1 or more images and giphy attachment are now rendered
with ModalGallery component
* ModalGallery component is now user to render the image
preview in message bubble and Gallery in full-screen mode if clicked on
the attachment in the bubble
* Assets rendered in Gallery have to be of a new type
GalleryItem
* Overriding ModalGallery in ComponentContext means
overriding the attachment preview as well as the Gallery on Modal view
* Overriding Gallery in ComponentContext means overriding
a component that renders media assets in slideshow and provides the
slideshow navigation API
* `GroupAvatar` component now renders a singular `Avatar`
component without any wrappers if the `groupChannelDisplayInfo` contains
only a single entry. Some class names have been removed, see the table
bellow:
| Change Type | Old Class Name | New Class Name |
| ----------- | ------------------------------------ | -------------- |
| Removed | `str-chat__avatar--single` | - |
| Removed | `str-chat__avatar-group--three-part` | - |
* Certain element classes have been renamed, some have
been removed, see the table of the actual changes bellow:
| Change Type | Old Class Name | New Class Name |
| ----------- | --------------------------------------- |
--------------------------------------------------- |
| Changed | `str-chat__reaction-list` | `str-chat__message-reactions` |
| Removed | `str-chat__message-reactions-container` | - |
| Removed | `str-chat__reaction-list--reverse` | - |
| Changed | `str-chat__message-reactions` |
`str-chat__message-reactions__list` |
| Changed | `str-chat__message-reaction` |
`str-chat__message-reactions__list-item` |
| Removed | `str-chat__message-reaction-own` | - |
| Changed | `str-chat__message-reaction-emoji` |
`str-chat__message-reactions__item-icon` |
| Changed | `str-chat__message-reaction-count` |
`str-chat__message-reactions__item-count` |
| Changed | `str-chat__reaction-list--counter` |
`str-chat__message-reactions__total-count` |
* replace specific components in MessageActions with
general purpose ContextMenu components
* MessageOptions, CustomMessageActions,
CustomMessageActionsList, MessageActionsBox are no longer available, use
MessageActions functionality instead.
* suggestion list and suggestion list items were
re-implemented with new ContextMenu API.
* the suggestion list and suggestion list items have
changed the markup
* `Avatar` component no longer takes `user` prop, prop
`image` has been renamed to `imageUrl` and prop `name` has been renamed
to `userName`.
* Props `Avatar`, `detailedView`, `latest_reactions`,
`reaction_counts`, `reaction_groups`, `reactionOptions` & `reverse` have
been removed from `ReactionSelector` component. The reason is that some
of them were deprecated and some of them weren't being used in a way the
component was set up by default. The component's class names have also
changed, see table.
| Change Type | Old Class Name | New Class Name |
| ----------- |
* `Channel` component no longer supports component
overrides, use `WithComponents` instead.
### chore
* adjustmens to Avatar, GroupAvatar and ChannelAvatar ([#3087](https://github.com/GetStream/stream-chat-react/issues/3087)) ([49d576e](https://github.com/GetStream/stream-chat-react/commit/49d576e4a710472f797cd11feb3c562ebd36651b))
* remove with*Context HOC wrappers ([#2962](https://github.com/GetStream/stream-chat-react/issues/2962)) ([e0cd4f2](https://github.com/GetStream/stream-chat-react/commit/e0cd4f25429170b2485016a1a8f34af4281338ff))
### Bug Fixes
* add integration guide md file to help AI assistant's work ([8441f5b](https://github.com/GetStream/stream-chat-react/commit/8441f5b10884f52d520c14a570eebd706a4f0d9a))
* add integration guide md file to help AI assistant's work ([#2911](https://github.com/GetStream/stream-chat-react/issues/2911)) ([2efd30e](https://github.com/GetStream/stream-chat-react/commit/2efd30e59daab6b70671a215f4a7e7246953e4be))
* add temporarily CSS v2 palette-variables ([#3040](https://github.com/GetStream/stream-chat-react/issues/3040)) ([48d4647](https://github.com/GetStream/stream-chat-react/commit/48d46471955500e4c357c339b3d40c746520b7fb))
* adjust ChatView.Selector buttons styles ([#2990](https://github.com/GetStream/stream-chat-react/issues/2990)) ([7907f51](https://github.com/GetStream/stream-chat-react/commit/7907f51f2b0e912ee591a0a52904067be213a11a))
* adjust message UI for network error when sending a message ([#3042](https://github.com/GetStream/stream-chat-react/issues/3042)) ([e0207cd](https://github.com/GetStream/stream-chat-react/commit/e0207cd66a30aa3225a026f757d7f5840d04e3f5))
* adjust padding for messages containing only padding ([#3102](https://github.com/GetStream/stream-chat-react/issues/3102)) ([443b9a8](https://github.com/GetStream/stream-chat-react/commit/443b9a8a92ec16a42e4a1a3ecdb1dd70fbbdca6f))
* **ai:** stop typewriter animation on `ai_indicator.stop` ([#2918](https://github.com/GetStream/stream-chat-react/issues/2918)) ([7777721](https://github.com/GetStream/stream-chat-react/commit/7777721b2d42f5e8c16f90c4ff1a809ca7027325))
* align chat view sidebars and attachment preview remove icon ([#3004](https://github.com/GetStream/stream-chat-react/issues/3004)) ([08dc4b6](https://github.com/GetStream/stream-chat-react/commit/08dc4b6daa11365fb5d115e0810d43c829474f37))
* align message list width constraints ([#2965](https://github.com/GetStream/stream-chat-react/issues/2965)) ([02c9b8d](https://github.com/GetStream/stream-chat-react/commit/02c9b8d51884cb2abc5894b644162d1733de61dc))
* align message reactions vertically to the center of the message list ([#3064](https://github.com/GetStream/stream-chat-react/issues/3064)) ([55dd2e8](https://github.com/GetStream/stream-chat-react/commit/55dd2e81ace4f3f8d08fe0d2eb5a2726f1cd2bd1))
* align textarea placeholder and text with the surroundings ([#3052](https://github.com/GetStream/stream-chat-react/issues/3052)) ([da293f0](https://github.com/GetStream/stream-chat-react/commit/da293f09cdba3593552f8365ae01bd476b40f63f))
* allow forwarding `unsafeHTML` to system messages (`EventComponent`) ([#2973](https://github.com/GetStream/stream-chat-react/issues/2973)) ([99c3960](https://github.com/GetStream/stream-chat-react/commit/99c3960deca5776626fe6cee2f9586fdb8a4344f))
* allow useNotificationTarget to return undefined ([#3046](https://github.com/GetStream/stream-chat-react/issues/3046)) ([38b278e](https://github.com/GetStream/stream-chat-react/commit/38b278e04b8136407bf0464d19563844d5418f71))
* assorted UI/UX fixes (Giphy, polls, dialogs, composer, headers) ([#3081](https://github.com/GetStream/stream-chat-react/issues/3081)) ([6c06e04](https://github.com/GetStream/stream-chat-react/commit/6c06e0439db044f7a9b99bb0913fc819fb9c66b3))
* **AudioPlayback:** improve wave progress bar smoothness and sizing ([#3094](https://github.com/GetStream/stream-chat-react/issues/3094)) ([982cf2a](https://github.com/GetStream/stream-chat-react/commit/982cf2a17e5aa3f90f4e4ad86f8311626cbe4040))
* calculate message read status for the first message in a channel (ported from v13) ([#3056](https://github.com/GetStream/stream-chat-react/issues/3056)) ([b7c33c8](https://github.com/GetStream/stream-chat-react/commit/b7c33c804b8140bf1855494647aa9f08da59d096))
* change class names to reflect component renames ([#3035](https://github.com/GetStream/stream-chat-react/issues/3035)) ([7c978a9](https://github.com/GetStream/stream-chat-react/commit/7c978a9e559f2cb8581d65365a4eb5e932db573d))
* clean up CSS build output ([#3072](https://github.com/GetStream/stream-chat-react/issues/3072)) ([f06846d](https://github.com/GetStream/stream-chat-react/commit/f06846da4d492c0fb9ca375ee049682e6f9e48ba))
* clear message composer on unmount ([#3053](https://github.com/GetStream/stream-chat-react/issues/3053)) ([f2a79ab](https://github.com/GetStream/stream-chat-react/commit/f2a79ab1a3f6305cbbcc2040586f87d7622dd76e))
* close CSS gaps, fix ChannelList dialog portal, and clean up icons ([#3079](https://github.com/GetStream/stream-chat-react/issues/3079)) ([a47981f](https://github.com/GetStream/stream-chat-react/commit/a47981ff3f70bd2fb3b1e1ca6d46682adbe65df8))
* component renames ([#3030](https://github.com/GetStream/stream-chat-react/issues/3030)) ([a563248](https://github.com/GetStream/stream-chat-react/commit/a5632481745fb2943e1ae2a0fae84b26829b7a94))
* correct various UI glitches ([#3110](https://github.com/GetStream/stream-chat-react/issues/3110)) ([6605f63](https://github.com/GetStream/stream-chat-react/commit/6605f6361f4d44f79f9f313ed8c561faa4cf374f))
* **demo:** remove archived filter param ([46da3f8](https://github.com/GetStream/stream-chat-react/commit/46da3f8c645c98e8ea19829ccd6ba1dd472c9725))
* **demo:** remove pinned_at sort param ([0bc9ed6](https://github.com/GetStream/stream-chat-react/commit/0bc9ed616a9f3bc33b4309c910aadaae50f35c90))
* **dialog:** prevent outside-click from other dialog managers closing active dialogs ([#3112](https://github.com/GetStream/stream-chat-react/issues/3112)) ([233ec89](https://github.com/GetStream/stream-chat-react/commit/233ec89200acfacb6e1322b60e51beff8054e58c))
* don't expose giphy arg in quoted message preview and channel preview ([21b905c](https://github.com/GetStream/stream-chat-react/commit/21b905ceec072b75618543f4846128f73432227a))
* **examples:** clean up tutorial examples for v14 ([#3089](https://github.com/GetStream/stream-chat-react/issues/3089)) ([6239895](https://github.com/GetStream/stream-chat-react/commit/623989574afdaf250225f62e0627478ebb48e473))
* **examples:** enable async voice recording preview in thread composer ([#3092](https://github.com/GetStream/stream-chat-react/issues/3092)) ([6c7cd42](https://github.com/GetStream/stream-chat-react/commit/6c7cd42afffb6d341b7a3b4bf5cc5a9bcd3f98ee))
* **examples:** fix resize handle alignment and thread border gap in RTL ([#3091](https://github.com/GetStream/stream-chat-react/issues/3091)) ([2f060ae](https://github.com/GetStream/stream-chat-react/commit/2f060ae8979de5df77148c591785db730c6f533c))
* exit search on blur [REACT-855] ([#3013](https://github.com/GetStream/stream-chat-react/issues/3013)) ([97f485d](https://github.com/GetStream/stream-chat-react/commit/97f485d0910b574770b34278816585f66c140a8e))
* focus outline visual glitch for input ([212e449](https://github.com/GetStream/stream-chat-react/commit/212e449dacff89bfa9ab8a1cb73ee38291ae6fea))
* giphy and command ui fixes ([#3025](https://github.com/GetStream/stream-chat-react/issues/3025)) ([aa36a4d](https://github.com/GetStream/stream-chat-react/commit/aa36a4dd65c74481fac6c8b0dd058be3ca6a45ba))
* **Giphy:** use fixed height for giphy preview to prevent layout shifts ([#3095](https://github.com/GetStream/stream-chat-react/issues/3095)) ([30e45fa](https://github.com/GetStream/stream-chat-react/commit/30e45faf719f5bc6a12a7b39729acb17426f03d6))
* hide buttons in message input if a command is selected ([22d32d4](https://github.com/GetStream/stream-chat-react/commit/22d32d4696f60d7e834dc5b4877dfcc255b9cd4f))
* **Icons, RTL:** update icon catalog, RTL layout fixes, dark mode & thread voice recording ([#3090](https://github.com/GetStream/stream-chat-react/issues/3090)) ([a4b1c26](https://github.com/GetStream/stream-chat-react/commit/a4b1c2662400f084c3d97f07457012928edf6885)), closes [#3080](https://github.com/GetStream/stream-chat-react/issues/3080)
* **Icons:** sync icon catalog with refreshed Line SVGs ([#3080](https://github.com/GetStream/stream-chat-react/issues/3080)) ([9472f7b](https://github.com/GetStream/stream-chat-react/commit/9472f7b35bb28ec00a477c1436e928f27a5f670b))
* improve md file to guide AI assistants used by our integrators ([7339614](https://github.com/GetStream/stream-chat-react/commit/7339614a70f0bb8d7c3d07c1251e1ac89b60879d))
* improve md file to guide AI assistants used by our integrators ([#2912](https://github.com/GetStream/stream-chat-react/issues/2912)) ([c249ef7](https://github.com/GetStream/stream-chat-react/commit/c249ef7cd549da2dfbe5066610edc668412fd685))
* increase message list width ([f81cae4](https://github.com/GetStream/stream-chat-react/commit/f81cae475ea6ed7a7b416b42a63536c73e6852bf))
* increase message list width ([#3062](https://github.com/GetStream/stream-chat-react/issues/3062)) ([fdf0e15](https://github.com/GetStream/stream-chat-react/commit/fdf0e155b074f75920871185ff789e08d1abbc39))
* isDayjs import usage for ESM ([#2924](https://github.com/GetStream/stream-chat-react/issues/2924)) ([73f8767](https://github.com/GetStream/stream-chat-react/commit/73f876710863867bde7d0becb293ad8519c2b1b8))
* keep MessageList scrolled to the bottom ([#3068](https://github.com/GetStream/stream-chat-react/issues/3068)) ([91eba1b](https://github.com/GetStream/stream-chat-react/commit/91eba1b4d8853f9e19614a5522b375cde8a7b4dd))
* keep the distance of command menus constant from the invoking button ([#3049](https://github.com/GetStream/stream-chat-react/issues/3049)) ([960c1f9](https://github.com/GetStream/stream-chat-react/commit/960c1f9aa25ddc8db51e3a38f28678adec5cdf4b))
* make poll forms submitable ([#2989](https://github.com/GetStream/stream-chat-react/issues/2989)) ([7dc82ca](https://github.com/GetStream/stream-chat-react/commit/7dc82ca535aa1a230912f76791f766bf7d67ac49))
* make the full option list container take the available height ([da77bf3](https://github.com/GetStream/stream-chat-react/commit/da77bf334ab9a87bc45d13885829b3f814d5a15b))
* make vite example channel selection bookmarkable ([#2997](https://github.com/GetStream/stream-chat-react/issues/2997)) ([1fbbfd1](https://github.com/GetStream/stream-chat-react/commit/1fbbfd1821da2ab9368e56a5be889f6fa7472fc2))
* **MessageList:** make pinned message highlight extend edge-to-edge ([#3124](https://github.com/GetStream/stream-chat-react/issues/3124)) ([f131a6a](https://github.com/GetStream/stream-chat-react/commit/f131a6a2a7bbe7157d039479ff35ad8ed4c20b2d))
* **MessageList:** prevent jump-to-message snap-back from bottom autoscroll ([#3109](https://github.com/GetStream/stream-chat-react/issues/3109)) ([be8ed26](https://github.com/GetStream/stream-chat-react/commit/be8ed265f4306115fde03f4e62637c0c9f32760c))
* **MessageList:** set width on message list scroll container ([#3077](https://github.com/GetStream/stream-chat-react/issues/3077)) ([3f09362](https://github.com/GetStream/stream-chat-react/commit/3f093622835dab275dcc89d2195b11c2d833c2da))
* **MessageUI:** use isDeleted as a flag to determine message deletion ([#3113](https://github.com/GetStream/stream-chat-react/issues/3113)) ([f95f287](https://github.com/GetStream/stream-chat-react/commit/f95f287b439043e990741cb9e900117760951d21))
* move show all options button to PollOptionList component ([e75ca3a](https://github.com/GetStream/stream-chat-react/commit/e75ca3acb92bb7fb38c83b3d6909888773f03d24))
* only categorize giphy type as giphy attachment ([f032187](https://github.com/GetStream/stream-chat-react/commit/f032187a2817469421cd72ad45cd4facf85f40de))
* poll UI fixes ([#3034](https://github.com/GetStream/stream-chat-react/issues/3034)) ([885b7a6](https://github.com/GetStream/stream-chat-react/commit/885b7a64c18d7ebde3deadf9f32ccc23df4427d5))
* post-review `MessageReactionsDetail` adjustments ([#3082](https://github.com/GetStream/stream-chat-react/issues/3082)) ([a82bdcb](https://github.com/GetStream/stream-chat-react/commit/a82bdcb20a3249cd84bb379b4d56cb18319a332b))
* prevent empty message composer textarea from growing ([#3051](https://github.com/GetStream/stream-chat-react/issues/3051)) ([880d12d](https://github.com/GetStream/stream-chat-react/commit/880d12d99ce565b23e3ce53415e86a3ea03ed2e1))
* prevent hiding floating date separator in message lists ([#3119](https://github.com/GetStream/stream-chat-react/issues/3119)) ([397fadd](https://github.com/GetStream/stream-chat-react/commit/397fadd70558a3da71e6973d5ac917a07f40daac))
* prevent increasing unread count by useMarkRead hook if read-events are disabled ([#2925](https://github.com/GetStream/stream-chat-react/issues/2925)) ([d0e7b5f](https://github.com/GetStream/stream-chat-react/commit/d0e7b5f7033ec4a05cb95e2f0beaf1665b110f39))
* prevent mobile sidebar overlays from shifting chat content ([#2995](https://github.com/GetStream/stream-chat-react/issues/2995)) ([35f4282](https://github.com/GetStream/stream-chat-react/commit/35f4282e96cfd7afc227d165f63a5feb92401a84))
* prevent poll options layout shifting upon voting ([#3048](https://github.com/GetStream/stream-chat-react/issues/3048)) ([cdaf480](https://github.com/GetStream/stream-chat-react/commit/cdaf4807ca96f7f5d5ced0bc1b6cf2a5a7885786))
* recert interactive flag, make Giphy use BaseImage ([59163cc](https://github.com/GetStream/stream-chat-react/commit/59163cc8380d5328c8e322bcd712cb2b8d0b37da))
* reliably detect whether the click originated inside before closing mobile nav ([#3061](https://github.com/GetStream/stream-chat-react/issues/3061)) ([8d25ead](https://github.com/GetStream/stream-chat-react/commit/8d25ead3a52aa91b27e186c2e41fe890b74cc3c7))
* remove bottom padding from poll option with votes in poll results ([#3059](https://github.com/GetStream/stream-chat-react/issues/3059)) ([a55774d](https://github.com/GetStream/stream-chat-react/commit/a55774d69b1777be7d7d43eaf6460335d61c9399))
* remove Channel component propagation ([#2904](https://github.com/GetStream/stream-chat-react/issues/2904)) ([cd6001f](https://github.com/GetStream/stream-chat-react/commit/cd6001fd9e7d56028cceaec458ea21d9aa229248))
* remove customMessageData from handleSubmit type declaration ([#2950](https://github.com/GetStream/stream-chat-react/issues/2950)) ([fc547be](https://github.com/GetStream/stream-chat-react/commit/fc547be57622c80a789a5ef5004cc342f94c73ec))
* remove MessageEditedTimestamp component ([7cbe67e](https://github.com/GetStream/stream-chat-react/commit/7cbe67e4c72f1c8553342078496caed1f8785d90))
* remove the tooltip from PollVote ([ca11f90](https://github.com/GetStream/stream-chat-react/commit/ca11f908ddabecbc93ad8f8a8d8e179545944a0a))
* remove UI issues in poll related components ([#3118](https://github.com/GetStream/stream-chat-react/issues/3118)) ([d7870bb](https://github.com/GetStream/stream-chat-react/commit/d7870bb8bd93d15ca6de51e576ef0b8274f16116))
* remove unnecessary CSS ([3fc6f3f](https://github.com/GetStream/stream-chat-react/commit/3fc6f3fc9a65685bc569bd5e583fec681fda1b9f))
* rename ChannelListMessenger to ChannelListUI ([#3036](https://github.com/GetStream/stream-chat-react/issues/3036)) ([d251338](https://github.com/GetStream/stream-chat-react/commit/d251338327cdfe72042894c62c523bd9164c104f))
* revert changes to EndPollAlert ([c364b0b](https://github.com/GetStream/stream-chat-react/commit/c364b0b92b832251ccddc3e895b33f21f20e7617))
* show ToggleSidebarButton in threads view's ThreadHeader ([#3020](https://github.com/GetStream/stream-chat-react/issues/3020)) ([53d5639](https://github.com/GetStream/stream-chat-react/commit/53d5639aa471cf47c8352926aac3a97174752af0))
* single checkmark color in dark mode ([283fad8](https://github.com/GetStream/stream-chat-react/commit/283fad8b1f781cfb8f2d9100318117deb5258160))
* single checkmark color in dark mode ([#3032](https://github.com/GetStream/stream-chat-react/issues/3032)) ([b3858c8](https://github.com/GetStream/stream-chat-react/commit/b3858c89c3c1607a658b0b793070310efd487ef0))
* sort command menus consistently ([#2967](https://github.com/GetStream/stream-chat-react/issues/2967)) ([64fd76b](https://github.com/GetStream/stream-chat-react/commit/64fd76b57dc0dbd8fe5e8525a08507ae0d6218f2))
* stabilize all test suites after v14 breaking changes ([#3039](https://github.com/GetStream/stream-chat-react/issues/3039)) ([91c1602](https://github.com/GetStream/stream-chat-react/commit/91c1602b35fe06a5b02c78afc51b27d746125a2f))
* **styling:** use correct inverse text color tokens ([#3125](https://github.com/GetStream/stream-chat-react/issues/3125)) ([3702caa](https://github.com/GetStream/stream-chat-react/commit/3702caaa0227583a06b69a01e48dd3647d084c00)), closes [#000000](https://github.com/GetStream/stream-chat-react/issues/000000)
* suggesting a poll option shouldn't vote for it ([e0659f3](https://github.com/GetStream/stream-chat-react/commit/e0659f3ff5edcced4ebd9c42ac1720ecf610c7e5))
* turn off interactions for giphy ([d403eee](https://github.com/GetStream/stream-chat-react/commit/d403eee081fa6ee8d427c0b353bb2a56a4abee55))
* unified SummarizedMessagePreview, cover more cases ([#2977](https://github.com/GetStream/stream-chat-react/issues/2977)) ([1589481](https://github.com/GetStream/stream-chat-react/commit/158948154a5de3fe3cbf0bbc129e1de123430f58))
* unify poll modal: title casing for EN; placeholders; button placement ([33fed1e](https://github.com/GetStream/stream-chat-react/commit/33fed1e40cc57063337627ce1b5fc73101597691))
* unify what is considered a deleted message across the components ([#3117](https://github.com/GetStream/stream-chat-react/issues/3117)) ([20b4022](https://github.com/GetStream/stream-chat-react/commit/20b40226181cb22d1335a38b659b79708bff687f))
* update ChatView selector icons ([#2985](https://github.com/GetStream/stream-chat-react/issues/2985)) ([ea814c3](https://github.com/GetStream/stream-chat-react/commit/ea814c362d7042677aecdcc9f80a3a925798e4c4))
* use link icon for link-type attachments ([#3083](https://github.com/GetStream/stream-chat-react/issues/3083)) ([241209e](https://github.com/GetStream/stream-chat-react/commit/241209e8059ce767fe5bc3500466aa73f53618e3))
* voice recorder button not shown when quoting a message ([3a5dcdd](https://github.com/GetStream/stream-chat-react/commit/3a5dcddc6633bb43126093751f9b7a6a3ea65856))
* voice recorder button not shown when quoting a message ([#3015](https://github.com/GetStream/stream-chat-react/issues/3015)) ([dbd6648](https://github.com/GetStream/stream-chat-react/commit/dbd6648b2be0d7356736f903933e486c71c03fa3))
* wrap attachment previews in message composer ([#2994](https://github.com/GetStream/stream-chat-react/issues/2994)) ([a401978](https://github.com/GetStream/stream-chat-react/commit/a40197873c73393e110729201bf34eeee9a96c36))
### Features
* add "Voice message deleted" notification ([#3045](https://github.com/GetStream/stream-chat-react/issues/3045)) ([9982c45](https://github.com/GetStream/stream-chat-react/commit/9982c45a2964766e7050d5d24c2b2ad77b9bf1a1))
* add AvatarStack component + message replies button redesign ([#2938](https://github.com/GetStream/stream-chat-react/issues/2938)) ([f7ad774](https://github.com/GetStream/stream-chat-react/commit/f7ad77400bc28937ae3d7081cc8685fdf11e2c52)), closes [#2937](https://github.com/GetStream/stream-chat-react/issues/2937)
* add Button component and styles ([#2914](https://github.com/GetStream/stream-chat-react/issues/2914)) ([f4675c6](https://github.com/GetStream/stream-chat-react/commit/f4675c6c7479d694920b2bcda1bef24a350c94a2))
* add ContextMenu animations API and global close-on-click-outside configuration mechanism ([#3067](https://github.com/GetStream/stream-chat-react/issues/3067)) ([630e5c7](https://github.com/GetStream/stream-chat-react/commit/630e5c723815405d78ba977b996775745982fddb))
* add CSS variables ([#2913](https://github.com/GetStream/stream-chat-react/issues/2913)) ([4bc9ac4](https://github.com/GetStream/stream-chat-react/commit/4bc9ac47b141b1586a4486d5a541d1e6b0be9d3d))
* add dark theme support to stream-chat-react ([#3002](https://github.com/GetStream/stream-chat-react/issues/3002)) ([fbe28d0](https://github.com/GetStream/stream-chat-react/commit/fbe28d0fbfb782fb095041dc869c61bc71570f6b))
* add download attachment message action ([#3126](https://github.com/GetStream/stream-chat-react/issues/3126)) ([2f86376](https://github.com/GetStream/stream-chat-react/commit/2f86376d4b6dfc6e9e8ea8815b7a3de1a1816dff))
* add EmojiPicker plugin stylesheet ([#3108](https://github.com/GetStream/stream-chat-react/issues/3108)) ([b4ed464](https://github.com/GetStream/stream-chat-react/commit/b4ed464550c42e16592da935076dd384d59e466d))
* add EventComponent (system message) redesign ([#3007](https://github.com/GetStream/stream-chat-react/issues/3007)) ([c17fc99](https://github.com/GetStream/stream-chat-react/commit/c17fc99c6e904345d2775db1fe18aedad5b6fb4a))
* add MediaBadge ([#3103](https://github.com/GetStream/stream-chat-react/issues/3103)) ([e15caa4](https://github.com/GetStream/stream-chat-react/commit/e15caa4ef5b7eb43205826d53b3b4f1309c26d4e))
* add message translation indicator ([#2958](https://github.com/GetStream/stream-chat-react/issues/2958)) ([5c3a996](https://github.com/GetStream/stream-chat-react/commit/5c3a996a2947093d89729e4f3d59613eadb0a9d9))
* add MessageEditedIndicator component ([cfbe346](https://github.com/GetStream/stream-chat-react/commit/cfbe346b1b6c7cd9fe47424551300819c167e667))
* add MessageEditedIndicator component ([#3019](https://github.com/GetStream/stream-chat-react/issues/3019)) ([7e9637a](https://github.com/GetStream/stream-chat-react/commit/7e9637ae9e683d379160f923c1795e1f74d91fa7))
* add new giphy and audio attachment widget designs and attachment grouping redesign ([#2934](https://github.com/GetStream/stream-chat-react/issues/2934)) ([e990c06](https://github.com/GetStream/stream-chat-react/commit/e990c0605b0150d9483d1ab0a9d428153ce5ec23))
* add new styles for unsupported attachments (preview, message, channel preview) ([#3107](https://github.com/GetStream/stream-chat-react/issues/3107)) ([19a0add](https://github.com/GetStream/stream-chat-react/commit/19a0add6696d45f4715cfbb2f62a503b4f022aaa))
* add notification API wrapper ([#3096](https://github.com/GetStream/stream-chat-react/issues/3096)) ([2060768](https://github.com/GetStream/stream-chat-react/commit/2060768b387a544bfa9602a6b0019a24be1bac23))
* add ReactionSelector styling + cleanup ([#2916](https://github.com/GetStream/stream-chat-react/issues/2916)) ([24a1169](https://github.com/GetStream/stream-chat-react/commit/24a11690f65a54a61a7902466f2d1eef6a0adc6c))
* add sidebar display control ([#2978](https://github.com/GetStream/stream-chat-react/issues/2978)) ([b77d995](https://github.com/GetStream/stream-chat-react/commit/b77d9956e8661fc69042262569ed5aaa26c1e625))
* add smooth scrolling to MessageList ([#3027](https://github.com/GetStream/stream-chat-react/issues/3027)) ([cdf35d2](https://github.com/GetStream/stream-chat-react/commit/cdf35d29350a445a6e3ae1ebef410e0a01267b4d))
* adjust media gallery viewer ([#3006](https://github.com/GetStream/stream-chat-react/issues/3006)) ([6ea7a78](https://github.com/GetStream/stream-chat-react/commit/6ea7a78e4184fce6066f7318f9ebd57a5ff1474a))
* adjust vertical and horizontal message spacing ([#2954](https://github.com/GetStream/stream-chat-react/issues/2954)) ([ba65752](https://github.com/GetStream/stream-chat-react/commit/ba65752b94036dd29d37701003ddbbbac008b3f1))
* align iconOnly API and unread badge styling ([#2982](https://github.com/GetStream/stream-chat-react/issues/2982)) ([c28b8ff](https://github.com/GetStream/stream-chat-react/commit/c28b8ffdba9a56232f88fa0bec45d0e17ad1e1e4))
* align web sidebar nav icons with mobile tab bar ([#2979](https://github.com/GetStream/stream-chat-react/issues/2979)) ([370caea](https://github.com/GetStream/stream-chat-react/commit/370caea4a470c6c027cb948016630a0ac0e697c6))
* channel preview redesign ([#2974](https://github.com/GetStream/stream-chat-react/issues/2974)) ([5ef9027](https://github.com/GetStream/stream-chat-react/commit/5ef90271e654ab3cfb8647dd533c02820813e09a))
* convert ChatView into a general purpose sidebar ([#2939](https://github.com/GetStream/stream-chat-react/issues/2939)) ([cd7a030](https://github.com/GetStream/stream-chat-react/commit/cd7a030121e9e933f0b0c6b3e52e7287dd88041b))
* do not allow to mark own messages unread ([#3043](https://github.com/GetStream/stream-chat-react/issues/3043)) ([fe05b62](https://github.com/GetStream/stream-chat-react/commit/fe05b622751a5bac55dc927c0c39ef906b37c8db))
* **examples:** add RTL direction toggle to vite example app ([#3084](https://github.com/GetStream/stream-chat-react/issues/3084)) ([887a326](https://github.com/GetStream/stream-chat-react/commit/887a326ab81199ab72a8ea92c2b3bc6cfce7458a))
* **examples:** refresh react tutorial app for v14 ([#3078](https://github.com/GetStream/stream-chat-react/issues/3078)) ([86ada37](https://github.com/GetStream/stream-chat-react/commit/86ada37eaac8d97e7634d2af9dc9e251a2e4e5f5))
* extended reaction selector ([#2972](https://github.com/GetStream/stream-chat-react/issues/2972)) ([80c14e5](https://github.com/GetStream/stream-chat-react/commit/80c14e5160b64724306c6953500266ba626ca0ff))
* externalize sidebar toggle and remove navOpen state from the SDK ([#3088](https://github.com/GetStream/stream-chat-react/issues/3088)) ([dc16bb5](https://github.com/GetStream/stream-chat-react/commit/dc16bb584675f48d5f67cf5d5d355ba012cf81d2))
* hide quick message actions on small screens ([#3120](https://github.com/GetStream/stream-chat-react/issues/3120)) ([fb8e99b](https://github.com/GetStream/stream-chat-react/commit/fb8e99ba116c350318f5018fb3dac74de27261a9))
* **Icons:** migrate SDK icons to Phosphor icon set ([#3075](https://github.com/GetStream/stream-chat-react/issues/3075)) ([30c1bee](https://github.com/GetStream/stream-chat-react/commit/30c1beeae8651855fc30654de5903a970ca9f367))
* implement pinned message redesign ([#2952](https://github.com/GetStream/stream-chat-react/issues/2952)) ([3af135f](https://github.com/GetStream/stream-chat-react/commit/3af135f36257efb53114911076a3ad2fc42c016e))
* import all the icons that belong to Stream design system ([#2949](https://github.com/GetStream/stream-chat-react/issues/2949)) ([55c9a1a](https://github.com/GetStream/stream-chat-react/commit/55c9a1a226cc8f99419b61cfa7fae94603c27d03))
* introduce button variant props ([#2969](https://github.com/GetStream/stream-chat-react/issues/2969)) ([2a4eabd](https://github.com/GetStream/stream-chat-react/commit/2a4eabd02d7ca1807046ecb402857fc5f44250b1))
* introduce channelActionSet ([#3026](https://github.com/GetStream/stream-chat-react/issues/3026)) ([199797e](https://github.com/GetStream/stream-chat-react/commit/199797ed3e6bbdd0d386a100ae598f17d9217c63))
* introduce extended reaction list to a reactions detail component ([#3100](https://github.com/GetStream/stream-chat-react/issues/3100)) ([b284802](https://github.com/GetStream/stream-chat-react/commit/b2848025d83ad05da1fa9ebe96812ba2aa69bdb1))
* introduce Search component redesign ([#2981](https://github.com/GetStream/stream-chat-react/issues/2981)) ([c0b6230](https://github.com/GetStream/stream-chat-react/commit/c0b623069967da71aac577a1b9f9edc8ac3ad2df))
* introduce thread preview redesign ([#2975](https://github.com/GetStream/stream-chat-react/issues/2975)) ([90fdfe5](https://github.com/GetStream/stream-chat-react/commit/90fdfe5dfe120f5d5d9ce6db0db983fddae223ca))
* message reactions (`ReactionsList`) redesign ([#2933](https://github.com/GetStream/stream-chat-react/issues/2933)) ([ce087fa](https://github.com/GetStream/stream-chat-react/commit/ce087fa6f1a0a1c326eefad33dfa42a4d2529733))
* message reactions detail redesign ([#2963](https://github.com/GetStream/stream-chat-react/issues/2963)) ([a941ed2](https://github.com/GetStream/stream-chat-react/commit/a941ed2583bdeb5178d9f2487cacbb0f6517578d))
* migrate MessageActions to use ContextMenu ([#2932](https://github.com/GetStream/stream-chat-react/issues/2932)) ([1d28279](https://github.com/GetStream/stream-chat-react/commit/1d28279ceaa681fc00e586e97b6f247ba2d48d85))
* new Avatar component design & adjustments ([#2926](https://github.com/GetStream/stream-chat-react/issues/2926)) ([2eb04ee](https://github.com/GetStream/stream-chat-react/commit/2eb04ee718d3224c4bc74c106d8039ec2b136a79))
* new GroupAvatar component design & adjustments ([#2930](https://github.com/GetStream/stream-chat-react/issues/2930)) ([e307882](https://github.com/GetStream/stream-chat-react/commit/e3078829991e8c0013640fa3cbd6ee0051254071))
* poll actions modals adjustments ([#2993](https://github.com/GetStream/stream-chat-react/issues/2993)) ([cc44c3f](https://github.com/GetStream/stream-chat-react/commit/cc44c3f6b18b1ab74491798b861011b880f2768f))
* promote experimental `MessageActions` to stable ([#2908](https://github.com/GetStream/stream-chat-react/issues/2908)) ([1467b5c](https://github.com/GetStream/stream-chat-react/commit/1467b5c51af4c5a624b4ace0de77030c50d87d61))
* promote Search to stable, drop ChannelSearch [REACT-894] ([#3014](https://github.com/GetStream/stream-chat-react/issues/3014)) ([9a7b7a2](https://github.com/GetStream/stream-chat-react/commit/9a7b7a2b4e81601de3617f6c498381a38ebe448d))
* quick dropdown toggle and cleanup ([#3054](https://github.com/GetStream/stream-chat-react/issues/3054)) ([30ddab0](https://github.com/GetStream/stream-chat-react/commit/30ddab0f33696d61f22ad045aeaad36f15d285c1))
* redesign ChannelHeader ([#2970](https://github.com/GetStream/stream-chat-react/issues/2970)) ([57f8a91](https://github.com/GetStream/stream-chat-react/commit/57f8a9176843a1b8ca58d637951f51ca6a4fa8e2))
* redesign ChannelList loading skeletons ([#2988](https://github.com/GetStream/stream-chat-react/issues/2988)) ([e5b3b8e](https://github.com/GetStream/stream-chat-react/commit/e5b3b8e85404ecb5f2f8558a0111851133b003e1))
* redesign deleted message ([#2964](https://github.com/GetStream/stream-chat-react/issues/2964)) ([446de99](https://github.com/GetStream/stream-chat-react/commit/446de99a5b47e094fe91699e81c5769b1459cb0b))
* redesign EmptyStateIndicator for channel message list ([#2960](https://github.com/GetStream/stream-chat-react/issues/2960)) ([e745d69](https://github.com/GetStream/stream-chat-react/commit/e745d6957c27a0ca8d8a7dcf4abefb342161e483))
* redesign file drag-and-drop overlay ([#2959](https://github.com/GetStream/stream-chat-react/issues/2959)) ([d2a72b5](https://github.com/GetStream/stream-chat-react/commit/d2a72b54fd71fb1811814cf5d0dc20c2275c12e7))
* redesign floating indicators in message lists ([#2966](https://github.com/GetStream/stream-chat-react/issues/2966)) ([12d075b](https://github.com/GetStream/stream-chat-react/commit/12d075bb580fa24c7321b9d3fae4e0e292359067))
* redesign image loading and error placeholders ([#3000](https://github.com/GetStream/stream-chat-react/issues/3000)) ([3539020](https://github.com/GetStream/stream-chat-react/commit/3539020ec756815f432c4e4ddfca07a56841a6ab))
* redesign image placeholder ([#3024](https://github.com/GetStream/stream-chat-react/issues/3024)) ([d34a0b8](https://github.com/GetStream/stream-chat-react/commit/d34a0b844e804c6cbf5c69b70fd0eb306e8ddfdc))
* redesign location sharing components & port the missing component CSS ([#3031](https://github.com/GetStream/stream-chat-react/issues/3031)) ([b72deda](https://github.com/GetStream/stream-chat-react/commit/b72dedaec912a093683916b48611636365e5c4a2))
* redesign message actions icons and message error badge ([#3050](https://github.com/GetStream/stream-chat-react/issues/3050)) ([f4caa0e](https://github.com/GetStream/stream-chat-react/commit/f4caa0eb95a986f7dd742e7fbfbf40b16bd2ecce))
* redesign message annotations ([#2956](https://github.com/GetStream/stream-chat-react/issues/2956)) ([5702090](https://github.com/GetStream/stream-chat-react/commit/57020903e4608b8b7fb09f28a91064bb3409fb8e))
* redesign message composer commands, mentions and emoji suggestion lists ([#2931](https://github.com/GetStream/stream-chat-react/issues/2931)) ([f151abc](https://github.com/GetStream/stream-chat-react/commit/f151abcd1fe43f227dd42f3e9d3e88da1a2e3f91))
* redesign message composer for thread and allow to grow to 10 lines ([#2983](https://github.com/GetStream/stream-chat-react/issues/2983)) ([6b0310a](https://github.com/GetStream/stream-chat-react/commit/6b0310a5f3b48435179164f4e2ddacb3b0f0f363))
* redesign message list elements spacing ([#2937](https://github.com/GetStream/stream-chat-react/issues/2937)) ([1bf815f](https://github.com/GetStream/stream-chat-react/commit/1bf815f30ce29c488eb44413f13fcaa7548313b4))
* redesign MessageActions ([#2951](https://github.com/GetStream/stream-chat-react/issues/2951)) ([256d862](https://github.com/GetStream/stream-chat-react/commit/256d862e0390ff6fd4a1e428d9356cb80d01a66a))
* redesign notification system ([#3018](https://github.com/GetStream/stream-chat-react/issues/3018)) ([83dec93](https://github.com/GetStream/stream-chat-react/commit/83dec93aa216f79d6ef4508f423a70208bcbcced))
* redesign poll actions modals ([#2986](https://github.com/GetStream/stream-chat-react/issues/2986)) ([861d7de](https://github.com/GetStream/stream-chat-react/commit/861d7deb84d9975a2f7f097e0d19a1986ef62cdc))
* redesign poll in message and poll creation dialog ([#2944](https://github.com/GetStream/stream-chat-react/issues/2944)) ([c8adac4](https://github.com/GetStream/stream-chat-react/commit/c8adac44cee8de1408df811ba6da05907e70fc49))
* redesign SendToChannelCheckbox ([#2971](https://github.com/GetStream/stream-chat-react/issues/2971)) ([1695a85](https://github.com/GetStream/stream-chat-react/commit/1695a858346cae704da616400b8710cc9b6359f2))
* redesign the LoadingChannel component ([#2991](https://github.com/GetStream/stream-chat-react/issues/2991)) ([790df17](https://github.com/GetStream/stream-chat-react/commit/790df172ab949d5ec4b4fc3bcd73b60871fe25f6))
* redesign ThreadHeader and ThreadHead ([#2987](https://github.com/GetStream/stream-chat-react/issues/2987)) ([059ae6a](https://github.com/GetStream/stream-chat-react/commit/059ae6a8b7edc0a19622de971567a60934036487))
* redesign Tooltip ([#3116](https://github.com/GetStream/stream-chat-react/issues/3116)) ([d0cbaad](https://github.com/GetStream/stream-chat-react/commit/d0cbaaddb4e4d814764616528d67a40011f3f703))
* redesign typing indicator ([#3005](https://github.com/GetStream/stream-chat-react/issues/3005)) ([d6c08ca](https://github.com/GetStream/stream-chat-react/commit/d6c08ca8ee61a7ef776dd4ab21a7b7b5d3170add))
* redesign UnsupportedAttachment ([#3099](https://github.com/GetStream/stream-chat-react/issues/3099)) ([9156f6f](https://github.com/GetStream/stream-chat-react/commit/9156f6f4a8c1e24a940c5d2624c77709e9ce07c2))
* refresh Message design ([#2927](https://github.com/GetStream/stream-chat-react/issues/2927)) ([40525f3](https://github.com/GetStream/stream-chat-react/commit/40525f32c7c02f1605ba10f1e8fb5d453916c87c))
* refresh MessageComposer design ([#2919](https://github.com/GetStream/stream-chat-react/issues/2919)) ([87e89f7](https://github.com/GetStream/stream-chat-react/commit/87e89f7f3706840c098ff0ef05e523e2f14af7fe))
* remove MessageListNotifications component ([#3028](https://github.com/GetStream/stream-chat-react/issues/3028)) ([e06ec62](https://github.com/GetStream/stream-chat-react/commit/e06ec6219f5f883db11134d4ab3acd513e3ec382))
* remove onlySenderCanEdit prop from MessageProps ([#3098](https://github.com/GetStream/stream-chat-react/issues/3098)) ([759cadf](https://github.com/GetStream/stream-chat-react/commit/759cadf485a56b509368c58a459430a6973f2dd9))
* render voice recording preview in a dedicated slot ([#2957](https://github.com/GetStream/stream-chat-react/issues/2957)) ([2859c76](https://github.com/GetStream/stream-chat-react/commit/2859c76947190bf30829481e2e04f178cd1bf6b2))
* replace MessageIsThreadReplyInChannelButtonIndicator with MessageAlsoSentInChannelIndicator ([#2968](https://github.com/GetStream/stream-chat-react/issues/2968)) ([b198029](https://github.com/GetStream/stream-chat-react/commit/b19802907f276634a445b232aebdd869f657085e))
* replace react-image-gallery with proprietary Gallery component ([#2936](https://github.com/GetStream/stream-chat-react/issues/2936)) ([a52de09](https://github.com/GetStream/stream-chat-react/commit/a52de095d5dcecbecffb73c82704fe585c6cb724))
* reset audio player progress when the track is fully played ([#3066](https://github.com/GetStream/stream-chat-react/issues/3066)) ([7914e51](https://github.com/GetStream/stream-chat-react/commit/7914e516c42481aaca5b608e29c127eb7ec731bb))
* return modal's close button ([#2948](https://github.com/GetStream/stream-chat-react/issues/2948)) ([62a27e8](https://github.com/GetStream/stream-chat-react/commit/62a27e8db6e3f009a53c593efc77031158a9a0d3))
* return ProgressBar to Audio attachment component ([#3022](https://github.com/GetStream/stream-chat-react/issues/3022)) ([d3d1e19](https://github.com/GetStream/stream-chat-react/commit/d3d1e19bd3e876e952b921c81da52cb8bcf7efea))
* reuse channel list loading skeletons for thread list ([#2992](https://github.com/GetStream/stream-chat-react/issues/2992)) ([3d7a3a3](https://github.com/GetStream/stream-chat-react/commit/3d7a3a3eb0833df70a85c1dd73dfe4c864e5adff))
* shared gallery preview in AttachmentPreviewList ([#3044](https://github.com/GetStream/stream-chat-react/issues/3044)) ([f05f47d](https://github.com/GetStream/stream-chat-react/commit/f05f47d7b6a52653e0153e8c95c9401acfaf0682))
* show only time in MessageTimestamp ([#3021](https://github.com/GetStream/stream-chat-react/issues/3021)) ([da4aa92](https://github.com/GetStream/stream-chat-react/commit/da4aa9220940311dec821d773ff0b0f4d9aa11aa))
* track upload progress in attachment preview components ([#3060](https://github.com/GetStream/stream-chat-react/issues/3060)) ([8b13863](https://github.com/GetStream/stream-chat-react/commit/8b13863a6717d9a39060903a36869cf08c545bea))
* unify channel and thread display titles ([#2998](https://github.com/GetStream/stream-chat-react/issues/2998)) ([29bb396](https://github.com/GetStream/stream-chat-react/commit/29bb396bcd163b0b3e4cb26365f242ae0f525b55))
* unify dialog UI system ([#2955](https://github.com/GetStream/stream-chat-react/issues/2955)) ([44e2eaf](https://github.com/GetStream/stream-chat-react/commit/44e2eaf401761b66cbfcbdf259fb20b057426154))
* update empty states across chat views ([#2976](https://github.com/GetStream/stream-chat-react/issues/2976)) ([7eacfb7](https://github.com/GetStream/stream-chat-react/commit/7eacfb7242b9dfc6ebe77197dde3400c5628e0a0))
* use server-defined default limits for channel and channel lists ([#2943](https://github.com/GetStream/stream-chat-react/issues/2943)) ([6302c96](https://github.com/GetStream/stream-chat-react/commit/6302c967dc648614e6d6c5b4e0f3beefc777b3ef)), closes [#2940](https://github.com/GetStream/stream-chat-react/issues/2940)
* **vite-example:** add custom message UI showcase ([#3029](https://github.com/GetStream/stream-chat-react/issues/3029)) ([629e49f](https://github.com/GetStream/stream-chat-react/commit/629e49f10c1d551cbec3a519c9e78a58a76cc8ef))
* **vite-example:** add resizable chat panels ([#3009](https://github.com/GetStream/stream-chat-react/issues/3009)) ([0e34114](https://github.com/GetStream/stream-chat-react/commit/0e341140bb26b0646ab5695be0daa006baf0b731))
### Refactors
* move BaseImage out of gallery ([dfe9d77](https://github.com/GetStream/stream-chat-react/commit/dfe9d77ff347d8a40020b2617727445b0877593f))
* remove deprecated APIs ahead of v14 stable ([#3086](https://github.com/GetStream/stream-chat-react/issues/3086)) ([8317b73](https://github.com/GetStream/stream-chat-react/commit/8317b73a2e0874566d86a84470792c5ffa55c0d4)), closes [#1804](https://github.com/GetStream/stream-chat-react/issues/1804)
* remove deprecated useAudioController hook ([#3016](https://github.com/GetStream/stream-chat-react/issues/3016)) ([35f8a5d](https://github.com/GetStream/stream-chat-react/commit/35f8a5d4bc220d3d50462883cf84e37eb507ea51))
* remove initialNavOpenResponsive for redundancy ([#3023](https://github.com/GetStream/stream-chat-react/issues/3023)) ([1227617](https://github.com/GetStream/stream-chat-react/commit/1227617b0576c4d1f29e1dd00116ba43981c8139))
MartinCupela
added a commit
that referenced
this pull request
Sep 15, 2026
…ches the live head (#3290) Jumping to a search result deep in history and then scrolling down teleported the user to the newest message. Scrolling closes the gap page by page, and when the last one lands the loaded window merges into the live head -- `hasMoreNewer` turns false. Two autoscroll paths read that as "we are at the head now, pin to bottom": the layout effect that keeps `hasMoreNewer` in its dependencies so a list mounting before its first page still autoscrolls, and the scroll manager's append branch, which sees the merged page as messages added below. Neither is right here. The user is reading where they jumped to, and the merged page lands below them -- nothing about that transition asks for the viewport to move. `useScrollLocationLogic` now derives `justReachedLatestMessageSet` from the `hasMoreNewer` transition itself and suppresses both paths for that one render. A trailing layout effect advances the ref afterwards, declared after the autoscroll effects and the scroll manager's own so all three observe the transition before it is consumed. `useMessageListScrollManager` has accepted this flag since #3027 and returns early on it, but nothing ever passed it -- that branch was dead until now.
github-actions Bot
pushed a commit
that referenced
this pull request
Sep 29, 2026
## [15.0.0-rc.1](v14.12.0...v15.0.0-rc.1) (2026-09-29) ### ⚠ BREAKING CHANGES * port the tutorial alignment (#3251) to v15, with panel-aware workspace navigation (#3301) * **MessageComposer:** the `preventClearingOnUnmount` prop is removed from `MessageComposer`. Drop it. If you relied on unmounting to clear a composer supplied through `MessageComposerControllerProvider`, call `clear()` on it yourself when your UI is done with it. * `ChannelListItemProps.channelUpdateCount` is removed. The unread badge now updates without it. * `ChannelListItemProps.key` is removed. React's own `key` prop is unaffected. * `ChannelListItemProps.watchers` is removed. It had no effect in v15. * adopt stream-chat's branded TimestampNS (#3297) * **Attachment:** `useSendMessageFn` and `useUpdateMessageFn` are removed. Call `messageComposer.send()` and `messageComposer.update()` instead. They resolve `'sent' | 'nothing-to-send' | 'failed'` rather than a boolean, so a truthiness check on the result now passes for every outcome — compare against `'sent'`. * **Attachment:** the two message submission failure notifications changed key. `messageComposer.sendMessageFn.sendMessageRequestFailed.text` is now `notification.messageSendFailed`, and `messageComposer.updateMessageFn.editMessageRequestFailed.text` is now `notification.messageUpdateFailed`. A typed custom translation dictionary fails to compile until both are renamed. * **Attachment:** `RetryHandler` takes `Omit<OperationParams<'retry'>, 'message'>` instead of `RetrySendMessageWithLocalUpdateParams`, which stream-chat removed in GetStream/stream-chat-js#1882. Code that names the old type must be updated. * the `stream-chat` peer range moves to `^10.0.0-rc.12`. That release removes `connection.changed`, changes `client.wsConnection` from the socket itself to a wrapper, and moves the socket's settings into configuration. See GetStream/stream-chat-js PR 1859 for the full list; an application on an earlier `stream-chat` will not typecheck against this version. * connectivity is read from state stores rather than events. Code that listened for `connection.changed` — to render its own banner, to refetch on reconnect — must subscribe to `client.wsConnection.state` or `client.networkConnection.state` instead, or use the new `useWSConnectionState` / `useNetworkConnectionState` hooks. Nothing in this package dispatches or forwards the old event. Note the two stores name their fields differently: the socket's `isHealthy` is always a boolean, while the network's `isOnline` is `boolean | undefined`, where `undefined` means no platform reporter has reported yet and must be tested with `=== false`. * `Channel` no longer reloads its channel on `connection.recovered`. The client reloads every active channel itself and dispatches the event afterwards, so handling it here reloaded each open channel twice per reconnect. Anything relying on the component to refresh a channel after a reconnect should rely on the client instead. * a socket drop on a working network now renders "Reconnecting…" rather than "Waiting for network…", from the new `chat.reportLostConnection.reconnecting.text` key. Tests and dictionaries keyed on the old copy for that case need updating; the `waitingNetwork` key is unchanged and still used when the device network is down. The delay before either banner appears now comes from `client.wsConnection.config.offlineNotificationDisplayDelayMs` (5s default) rather than from a fixed hold inside the client, so changing that config changes when the banner shows. The `system:network:connection:lost` notification type is unchanged. * `Thread` requires a `thread` prop and renders `children`. `additionalMessageComposerProps`, `additionalMessageListProps`, `additionalParentMessageProps`, `additionalVirtualizedMessageListProps`, `autoFocus` and `virtualized` are removed — pass those props to the children you render. `Thread` provides the thread itself, so it no longer needs to be wrapped in `ThreadProvider`. The `str-chat__thread--virtualized` class is gone; `Thread` cannot know which list you chose. * `Thread.enableDateSeparator` is removed with nothing in its place. A `MessageList` in a thread now follows its own default and shows date separators unless you pass `withDateSeparator={false}`. * `disableDateSeparator` is renamed to `withDateSeparator` on `MessageList` (default `true`, was `disableDateSeparator={false}`) and `VirtualizedMessageList` (default `false`, was `disableDateSeparator={true}`). The rename also reaches `processMessages`, `useEnrichedMessages`, `FloatingDateSeparator`, `useFloatingDateSeparator` and `useFloatingDateSeparatorMessageList`. * the `head` prop is removed from `MessageList` and `VirtualizedMessageList`. Both render the thread's parent message from context; override it with a `ThreadHead` component on `ComponentContext`. * `ThreadHeaderProps` is down to `overrideTitle`. `thread` comes from the thread in context, and `closeThread` goes through workspace navigation — customize it centrally via `ChatView`'s `deriveWorkspaceNavigation`, or call the new `useCloseThread()` hook from a header of your own. `ComponentContext.ThreadHeader` is removed; compose the header you want. * `ThreadSlot` wraps its children in `<Thread>` instead of letting them replace the whole panel, mirroring `ChannelSlot`. Markup that must sit outside the thread container moves outside `ThreadSlot`; anything needing thread context must sit inside. * `Thread` no longer rebuilds its subtree when the thread changes. A custom component rendered inside `Thread` that relied on being remounted per thread — to reset local state, or to re-run a mount effect — must depend on the thread instead. The SDK's own message list does this by keying on the thread; `WithAudioPlayback` by taking `playbackScope`. * `LegacyThreadContext` and its `legacyThread` value are removed. The thread composer resolves its composition context from the `Thread` instance in `ThreadContext`. * **MessageActions:** the `messageActions` prop is removed from `Channel`, `MessageList`, `VirtualizedMessageList`, `Thread` and `Message`. Filter `defaultMessageActionSet` and pass the result as `messageActionSet` instead. * **MessageActions:** `MESSAGE_ACTIONS`, `OPTIONAL_MESSAGE_ACTIONS`, `getMessageActions()`, and the `MessageActionsArray` and `Capabilities` types are no longer exported. Use the new `DefaultMessageActionType` union for the action types the SDK ships. * **MessageActions:** `MessageContext` no longer carries `getMessageActions` or `actionsEnabled`. The rendered action set is decided by `messageActionSet` and each item's own `isVisible` predicate. Co-authored-by: Claude Opus 5 <noreply@anthropic.com> * **AudioPlayback:** `ChannelProps.allowConcurrentAudioPlayback`, `ThreadProps.allowConcurrentAudioPlayback` and `WithAudioPlaybackProps.allowConcurrentPlayback` are removed, with no replacement. If you passed `true`, delete it: starting a player now pauses whichever was playing and takes the shared element over. If you passed `false` or nothing, the only change is that playback is exclusive across surfaces rather than within one. * **AudioPlayback:** `useActiveAudioPlayer()` now reports the app-wide active player rather than the calling surface's. * **Channel:** `ChannelProps.channel` is now required and `EmptyPlaceholder` is removed. Render the exported `ChannelPlaceholder` to fill the same `.str-chat__channel` layout slot while no channel is selected. * **Channel:** `Channel` no longer queries the channel; `initializeOnMount` and `channelQueryOptions` are removed. Whoever supplies the channel initializes it — use the exported `getChannel({ channel, client })`, which watches and de-duplicates concurrent calls. Channels from `ChannelList` or any `queryChannels` call arrive watched already. `Channel` no longer renders `LoadingIndicator` or `LoadingErrorIndicator` for a query it does not make, and an uninitialized channel renders as an empty channel with no error. * **Channel:** `Channel` no longer writes `document.title`, and `activeUnreadHandler` is removed. See `examples/vite/src/DocumentTitleManager` for a working replacement in application code. * **Channel:** the `channel.channelMissing.text` translation key is removed. This is a compile error (TS2353) for any dictionary typed with the exact `TranslationDictionary` — delete the entry from custom locale files. * **Channel:** `ChatContext.latestMessageDatesByChannels` is removed. Slow-mode cooldown now lives on `channel.cooldownTimer` (`useCooldownRemaining` / `useIsCooldownActive`), and the channel's latest message on `channel.messagePaginator.aggregateState.lastMessage`. * **Channel:** `Channel` no longer jumps to a message focused from search. Selecting a search result calls `channel.messagePaginator.jumpToMessage(id)` directly, and the highlight is read from `channel.messagePaginator.messageFocusSignal`. A custom message list that relied on `Channel` performing the jump must call `jumpToMessage` itself. * **i18n:** consume the shared runtime from @stream-io/i18n (#3284) * move to timestamps in response models (#3278) * request-handler props are removed from `Channel` and `Thread`. `doSendMessageRequest`, `doUpdateMessageRequest`, `doDeleteMessageRequest` and `doMarkReadRequest` are gone, along with `useChannelRequestHandlers`, `useThreadRequestHandlers` and `useEditMessageHandler`. Register once on the client: ``` // v14 <Channel channel={channel} doSendMessageRequest={mySend}> // v15 client.config.set({ channel: { requestHandlers: { sendMessageRequest: async ({ localMessage, message, options }) => ({ message: await mySend(message, options), }), }, }, }); ``` Three differences: handlers take a single params object and return `{ message }`; thread flows register under the `thread` key; and registration is per CLIENT, not per mounted subtree — the one thing the props could do that this cannot. Per-channel behaviour now needs a branch inside one handler on the `cid` it receives. * `useChannelConfig` returns the channel's RESOLVED configuration instead of the channel type's raw server config, so field names change: channelConfig?.typing_events → channelConfig?.typingEvents.enabled channelConfig?.read_events → channelConfig?.readEvents.enabled channelConfig?.replies → channelConfig?.replies.enabled channelConfig?.user_message_reminders → channelConfig?.userMessageReminders.enabled channelConfig?.commands → channelConfig?.availableCommands Every gate is now the server flag ANDed with what is registered through `client.config`, which is what the client actually enforces. The hook also subscribes: these were getters, so a `client.config.set()` previously never reached the screen. No component reads `channel.serverConfig` any more. * `useAttachmentManagerState` replaces `hasCustomDoUploadRequest` with `customCdn`, and gains `attachmentsEnabled`, `locationEnabled` and `pollsEnabled`. * the per-domain stores on `channel.state` are removed — `readStore`, `typingStore`, `membersStore`, `watcherStore`, `ownCapabilitiesStore`, `mutedUsersStore`. Subscribe to `channel.state` itself; the selector is unchanged, because `ChannelStateData` is flat and keeps the same top-level keys: useStateStore(channel.state.ownCapabilitiesStore, sel) → useStateStore(channel.state, sel) `WatcherState` is renamed `ChannelWatchState`, and `channel.disconnected` is renamed `channel.pendingDisposal` (removed outright — no deprecated alias). * `AIStates` is no longer exported from `stream-chat-react` — import it from `stream-chat`. The values are unchanged, but it is now literal-typed, so an inferred array of its members no longer accepts the wide `AIState`: const STOPPABLE: readonly AIState[] = [AIStates.Thinking, AIStates.Generating]; * `<Channel>` marks its channel active while mounted and reloads it on `connection.recovered`. The client skips re-seeding an active channel's message list on hydration and reconnect, so the consumer owns that window. A custom channel surface that does not render `<Channel>` must call `channel.activate()` / `deactivate()` and `channel.reload()` itself, or its list goes stale after a reconnect. * **i18n:** adopt the shared i18n layer from stream-chat/i18n (#3271) * **context:** - **Context hooks no longer accept a `componentName` argument.** `useChatContext('X')` and friends stop type-checking; drop the argument. - **Required contexts throw when used outside their provider**, instead of logging a warning and returning `{}`. Affects the 14 hooks listed above. Components must be rendered within the provider they read from — e.g. anything calling `useChatContext` needs a `<Chat>` ancestor. - **`useChannelInstanceContext` returns `Partial<ChannelInstanceContextValue>`** — `channel` is now typed as possibly `undefined`. - **`ChatViewContext` has no default value** (typed `| undefined`), so `useContext(ChatViewContext)` may return `undefined`. - **`MessageComposerContext` is typed as `MessageComposerContextValue | undefined`**, correcting a narrower declaration that was papered over with casts. - **The gallery header no longer uses the `ComponentContext.MessageTimestamp` override**; it renders the item's own timestamp. ### 🛠 Implementation details Parameter removed from all 7 hooks and their 138 call sites. Missing-provider behaviour also normalized, since `src/` had three competing conventions (warn + `{} as T`, throw, silent cast). The `{} as T` fallback deferred failures to a downstream `Cannot read properties of undefined` several frames away. Everything now goes through `requireContext` (`src/context/requireContext.ts`): - **Required → throw**, naming hook and provider: `useChatContext`, `useMessageContext`, `useMessageComposerContext`, `useMessageListContext`, `useVirtualizedMessageListContext`, `useMessageBounceContext`, `usePollContext`, `useDialogManager`, `useSearchContext`, `useSearchSourceResultsContext`, `useContextMenuContext`, `useChannelListItemContext`, `useGalleryContext`, `useChatViewContext` - **Optional by design → keep default, honest type**: `useTranslationContext`, `useComponentContext`, `useChannelInstanceContext` (now `Partial`), `useModalContext`, `useAriaLiveAnnouncer`, `useMessageTranslationViewContext` - **Renders both inside and outside a provider → read the raw context**: `Audio`, `VoiceRecording`, `CardAudio`, `Timestamp`, `MessageRepliesCountButton`, `MessageComposerUI`, `ModalGallery` Two changes were needed before their hooks could throw: - `WithDragAndDropUpload` detected the composer via `Object.keys(ctx).length > 0`; now uses a `useIsWithinMessageComposerContext()` predicate. Adds the test file this component lacked. - `GalleryHeader` read message context while rendering outside any `MessageProvider`. `GalleryItem` now carries `user` and `createdAt` — wrapping the call sites would be wrong, since `ChannelMediaView` flattens many messages into one list. Adds a `timestamp.GalleryTimestamp` key. `ChatViewContext` also loses its module-level `LayoutController` default, which let unrelated subtrees write to one shared instance. `src/context/__tests__/missingProviderContract.test.tsx` pins the required/optional split. ### 🎨 UI Changes The channel-media gallery header now shows a per-item sender and timestamp, which it previously couldn't display at all. No screenshots: the demo users on the shared environment have no channels, and seeding one would write test data others would see. Covered by unit tests in `GalleryUI.test.tsx` — worth a manual look. * the <Chat> prop and the ChatContext field channelPaginatorsOrchestrator are renamed to channelManager, and the types ChannelPaginatorsOrchestrator / ChannelPaginatorsOrchestratorState are now ChannelManager / ChannelManagerState. Every useChatContext() consumer reading the old field, and any test that builds a partial ChatContext value, has to be updated. No deprecated prop or type aliases are exported. * requires stream-chat v10. * Removed `ChannelStateContext` and `ChannelActionContext` along with `useChannelStateContext()`, `useChannelActionContext()`, `useCreateChannelStateContext()` and `useCreateChannelActionContext()`. Read the channel via `useChannel()` and message state via `useMessagePaginator()`; both are backed by LLC `StateStore`s. * `ChatContext` no longer exposes the active channel or `setActiveChannel()`. Channel/thread routing is slot-driven — use `useChatViewNavigation()` from `stream-chat-react/slot-layout` (`openChannel`, `openThread`, `closeThread`). * The `TypingContext` provider path was removed from the `Channel` runtime. `TypingIndicator` now derives its state from LLC stores and takes `isMessageListScrolledToBottom` and `scrollToBottom` props. * Context mutation/pagination helpers were replaced by paginator methods: `updateMessage`/`removeMessage` -> `ingestItem`/`removeItem`; `loadMore`/`loadMoreNewer` -> `toTail()`/`toHead()`; `jumpToMessage`/`jumpToFirstUnreadMessage` -> `messagePaginator.jumpToMessage()`/ `jumpToTheFirstUnreadMessage()`. Messages are no longer in `channel.state`. * Custom send/update/delete/markRead overrides move from ChannelActionContext callbacks to `channel.configState.requestHandlers` / `thread.configState.requestHandlers`. * `ChatView` is a navigation landmark, not a WAI-ARIA Tabs widget: the selector is `role="navigation"` with `aria-current` on the active button. There is no `role="tab"`/`"tablist"`/`"tabpanel"`. `activeChatView` renamed to `activeView`. * `ChannelList` renders a `role="listbox"` whose items are `role="option"`. * v10 data shapes: channel name/image read from `channel.data.custom.name`/ `.custom.image`; user custom fields from `user.custom` (e.g. `username`); attachment `duration`/`file_size`/`mime_type`/`waveform_data` from `attachment.custom`. Message moderation uses `message.moderation` (`moderation_details` is gone). ### Bug Fixes * adapt to removed stream-chat-js hand-written types ([#3274](#3274)) ([ccccce5](ccccce5)) * **EmojiPicker:** drop @emoji-mart/react peer dependency on v15 ([#3300](#3300)) ([e7ce32f](e7ce32f)) * **MessageList:** keep the viewport still when a jumped-to window reaches the live head ([#3290](#3290)) ([351d69d](351d69d)), closes [#3027](#3027) * **MessageList:** show delivery and read state on every message that has it ([#3296](#3296)) ([e74c57a](e74c57a)) * prevent eager requests on Thread component mount ([#3282](#3282)) ([6b7dd6c](6b7dd6c)) * render stable notification host for Channel and Thread ([#3291](#3291)) ([ce59094](ce59094)) ### Features * add icons to ComponentContext adapted to stream-chat-react@15 ([#3294](#3294)) ([baf4b62](baf4b62)) * adopt stream-chat's branded TimestampNS ([#3297](#3297)) ([aaa7fa3](aaa7fa3)), closes [GetStream/stream-chat-js#1884](GetStream/stream-chat-js#1884) [GetStream/stream-chat-js#1884](GetStream/stream-chat-js#1884) [#3295](#3295) * **Attachment:** render live upload progress on messages being sent ([#3295](#3295)) ([4f1459e](4f1459e)) * **AudioPlayback:** play one voice message at a time, across the whole app ([#3287](#3287)) ([68999a7](68999a7)) * **Channel:** depend on the Channel instance, not its cid, and narrow its responsibilities ([#3286](#3286)) ([088c795](088c795)) * **context:** consolidate message UI overrides on the MessageUI slot ([#3268](#3268)) ([0766489](0766489)), closes [#3267](#3267) * **context:** drop componentName param from context consumer hooks ([#3267](#3267)) ([9194215](9194215)) * **i18n:** english-only bundle with namespaced, type-checked translation keys ([#3261](#3261)) ([17c91bc](17c91bc)) * **MessageComposer:** let integrators supply the composer MessageComposer edits ([#3299](#3299)) ([14e5860](14e5860)) * migrate components from ChannelActionContext, ChannelStateContext to StateStore instances ([#3237](#3237)) ([99cbe67](99cbe67)) * move to new upload API ([#3272](#3272)) ([04a31b1](04a31b1)) * move to timestamps in response models ([#3278](#3278)) ([cb472c3](cb472c3)) * port the tutorial alignment ([#3251](#3251)) to v15, with panel-aware workspace navigation ([#3301](#3301)) ([66557d6](66557d6)) * rename ChannelPaginatorsOrchestrator to ChannelManager ([#3258](#3258)) ([be2c8e1](be2c8e1)) * support local unread count on v15 ([#3298](#3298)) ([a42c3cf](a42c3cf)) * use configuration service API as a single source of truth ([#3273](#3273)) ([f66597a](f66597a)) * use network and WS connection observer services from LLC ([#3281](#3281)) ([3098a90](3098a90)) ### Refactors * align Thread with Channel - instance prop, provider, children ([#3289](#3289)) ([c2136f3](c2136f3)) * **i18n:** adopt the shared i18n layer from stream-chat/i18n ([#3271](#3271)) ([f68cad3](f68cad3)), closes [GetStream/stream-chat-js#1830](GetStream/stream-chat-js#1830) * **i18n:** consume the shared runtime from @stream-io/i18n ([#3284](#3284)) ([eb3ae7a](eb3ae7a)) * **MessageActions:** remove the messageActions prop in from message lists ([#3288](#3288)) ([b541c45](b541c45)) ### Performance Improvements * **build:** emit ESM per source module so consumers can tree-shake ([#3269](#3269)) ([55e76dc](55e76dc))
github-actions Bot
pushed a commit
that referenced
this pull request
Nov 6, 2026
## [15.0.0](https://github.com/GetStream/stream-chat-react/compare/v14.12.0...v15.0.0) (2026-11-06)
### ⚠ BREAKING CHANGES
* props and ComponentContext keys that had no effect are removed, nine slots are typed without props, and overrides of several slots render in more places.
- `additionalMessageComposerProps` is removed from `Message`, `MessageList`, `VirtualizedMessageList` and `VirtuosoContext`. It did nothing in v14; delete it. If the props were meant for the composer, pass them to the `MessageComposer` you render.
- `MessageReactions.reverse`, `MessageReactionsDetail.sort` and `MessageReactionsDetail.dialogId` are removed, and `MessageUI` no longer passes `reverse` to a `MessageReactions` override. Order reaction types with `sortReactions` and reacting users with `reactionDetailsSort`; the detail's dialog id is `MessageReactionsDetail.getDialogId({ messageId })`.
- `MessageComposer` no longer takes `emojiSearchIndex` or `parent`, the `emojiSearchIndex` override key is removed, and `useMessageComposerContext()` no longer returns `emojiSearchIndex`, `parent` or `audioRecordingConfig`. For emoji autocomplete, register `createTextComposerEmojiMiddleware(SearchIndex)` from `stream-chat-react/emojis` in a `client.config.setSetupFunction('messageComposer', ...)`.
- `WithDragAndDropUpload.acceptedFiles` is removed. Set the accepted types on the composer config, `attachments.acceptedFiles`.
- `ChannelListItem.activeChannel` is removed. A custom `ChannelListItemUI` reads `active`, or compares the app's own selected channel with its `channel`.
- `ChatView.entityInferrers`, the `ChatViewEntityInferer` type and `useChatViewContext().entityInferers` are removed.
- The `AttachmentPreviewList`, `MessageComposerUI`, `MessageEditedIndicator`, `MessageStatus`, `NotificationAnnouncer`, `QuotedMessagePreview`, `SearchSourceResultList`, `TextareaComposer` and `VoiceRecordingPreviewSlot` slots are typed `React.ComponentType` without props, because the SDK renders them without props. Rendering one from `useComponentContext()` with props, or an override with required props, no longer compiles; render the exported component with its props inside the override.
- Overrides of `FileDragAndDropContent`, `BaseImage`, `LoadingIndicator`, `Timestamp`, `Avatar`, `DateSeparator`, `Gallery` and `FileSizeIndicator` now also render where the SDK rendered the default directly: link previews, video thumbnails, galleries, quoted messages, load-more buttons, poll vote lists, thread list items, user search results, the thread's parent message, composer previews and channel detail lists. To keep the default in one place, wrap it in `WithComponents` with the exported default.
See ai-docs/v15-breaking-changes.md (BC-105 to BC-109, BC-033) and ai-docs/ai-migration-v14-v15.md.
* **ChannelListHeader:** ComponentContext.HeaderEndContent is removed. Pass the content
as EndContent to ChannelListHeader / ThreadListHeader instead, by registering a
component that renders the header with it under the ChannelListHeader or
ThreadListHeader key. One component no longer fills both headers.
* **ChannelListHeader:** list-header content renders whenever it is set. HeaderEndContent
showed only while a channel (channel list) or a thread (thread list) was open;
content that should keep that behavior returns null while
useWorkspaceNavigation().openChannels / openThreads is empty. See BC-099 in
ai-docs/v15-breaking-changes.md and "List headers: HeaderEndContent becomes an
EndContent prop" in ai-docs/ai-migration-v14-v15.md.
* **ChannelDetail:** ChannelMembersHeaderActionItem.component is renamed to
Component, matching the message and channel-list action sets.
* **ChannelDetail:** the 'menu' placement of a channel members header action is
renamed to 'dropdown'. A 'menu' item is no longer rendered.
* **ChannelDetail:** the HeaderActionsMenuTrigger prop (on ChannelMembersView and
ChannelMembersHeaderActionsProps), DefaultHeaderActionsMenuTrigger and
ChannelMembersHeaderActionsMenuTriggerProps are removed. The menu trigger is a
{ Component, placement: 'quick-dropdown-toggle' } item in headerActionSet: a
forwardRef button that receives the ref the menu anchors to, aria-expanded and
onClick, and spreads them. defaultChannelMembersHeaderActionSet starts with
DefaultChannelMembersHeaderActions.QuickDropdownToggle; a set without a toggle
item renders no dropdown menu.
* **ChannelDetail:** dropdown header actions no longer receive a closeMenu prop.
They read closeMenu from useContextMenuContext().
* **ChannelDetail:** a header action's filter is renamed to isVisible, typed with
ChannelMembersHeaderActionVisibilityFilterParams and called with { channel }, as
on message actions. A leftover filter is ignored, so the action it hid shows to
every user.
* **ChannelDetail:** ChannelMembersHeaderActionItem is a union whose
quick-dropdown-toggle member has no type or isVisible, and
ChannelMembersHeaderActionPlacement includes 'quick-dropdown-toggle'. Narrow an
item (e.g. 'type' in item) before reading type.
* **ChannelDetail:** a custom HeaderActions renders the set's quick-dropdown-toggle
item itself and filters the set with useBaseChannelMembersHeaderActionSetFilter.
It renders the dropdown items in a ContextMenu opened with
useDialogOnNearestManager, using an id unique to the component instance. See
BC-098 in ai-docs/v15-breaking-changes.md and "The channel members header action
set uses the shared action names" in ai-docs/ai-migration-v14-v15.md.
* **TypingIndicator:** translations of `typing.twoUsers` must use
`{{ firstUser }}` and `{{ secondUser }}` instead of `{{ typing }}`, for example
'{{ firstUser }} und {{ secondUser }} schreiben'. A translation that keeps
`{{ typing }}` still compiles but shows the literal text `{{ typing }}`.
See BC-100 in ai-docs/v15-breaking-changes.md and "Keys whose values changed"
in ai-docs/i18n-v15-migration.md.
* unused exports and the transliterate dependency are removed, and stream-chat-react now types channel custom data for apps.
- `Root` and `Header` are no longer exported from the package root. They are the parts of `Alert`; use `Alert.Root` and `Alert.Header`.
- `UploadIcon`, `BinIcon`, `PauseIcon` and `PlayIcon` are removed. Copy the SVG into the app, or use `IconPlus` / `IconAttachment`, `IconDelete`, `IconPauseFill` and `IconPlayFill` from the v15 icon set.
- `@stream-io/transliterate` is no longer an optional dependency. Apps that import it must add it to their own dependencies. For mention search, pass a `transliterate` function to stream-chat's mentions middleware.
- Importing `stream-chat-react` now types `channel.data.custom.name` and `.image` (`string | undefined`). Delete the app's own `name` / `image` declarations on `CustomChannelData`; a declaration with another type overrides the SDK's under `skipLibCheck` and fails with TS2430 without it.
- `DefaultChannelData` no longer has `subtitle` or `team`. Declare them on `CustomChannelData` if the app stores them under `custom`; read the channel's team from `channel.data.team`.
- The translation key `messageComposer.icons.attachFiles.text` is removed.
See ai-docs/v15-breaking-changes.md (BC-101) and ai-docs/ai-migration-v14-v15.md.
* **Message:** Removed the initialMessage property from message props and context. Use the new hook to identify thread-parent messages.
* **ChannelDetail:** outside a modal, the ChannelDetail views render no close
button unless ChannelDetail or ChannelDetailProvider gets onClose. They used to
render a close button that did nothing.
* **ChannelDetail:** ChannelDetail calls onLayoutChange on every layout change. It
used to ignore the prop.
* **AttachmentSelector:** SimpleAttachmentSelector, and the plain upload button AttachmentSelector renders when File is its only action, follow the composer's File rule instead of the upload-file capability alone. They appear without upload-file when attachments.customCdn is set, are hidden when attachments are disabled (the channel type's uploads flag is off without customCdn, or the client sets attachments.enabled: false), and are disabled once the message holds maxNumberOfFilesPerMessage files. At that limit the menu's File item also stays, disabled, where v14 hid it. See BC-065 in ai-docs/v15-breaking-changes.md and "Attachment and poll availability" in ai-docs/ai-migration-v14-v15.md.
* deprecated message, mention and list APIs are removed.
- `renderText(text, mentionedUsers, options)` is now `renderText(text, options)`, and `RenderTextFunction` is `(text, options)`. Pass mentions as `options.messageMentionEntities`, built with `getRenderTextMentionEntities(message)`.
- Custom mention renderers get `node.mentionedEntity` instead of `node.mentionedUser`.
- `onMentionsClick` / `onMentionsHover` are called with `(event, message)`; the `mentioned_users` argument and the `MentionedUserEventHandler` type are removed (use `CustomMentionHandler`). Read the clicked mention from the target's `data-user-id` / `data-mention-id`.
- `MessageContextValue.onMentionsClickMessage` / `onMentionsHoverMessage` and the handlers from `useMentionsHandler` are `undefined` unless `onMentionsClick` / `onMentionsHover` is passed. Mentions are interactive only when a click handler is set.
- `mentionsMarkdownPlugin` and `createMentionPluginAndDisplayTextSet` take mention entities only, not `UserResponse[]`.
- `useUserRole` is renamed `useMessagePermissions(message)`, and it no longer returns `isAdmin`, `isModerator` or `isOwner`; gate on the `can*` flags or `useChannelCapabilities()`.
- `disableQuotedMessages` is removed from `MessageList`, `Message` and `useMessagePermissions`. To hide quoting, pass a `messageActionSet` without the `quote` item through the `MessageActions` slot.
- `VirtualizedMessageList` drops `defaultItemHeight`, `overscan` and `scrollSeekPlaceHolder`; pass them through `additionalVirtuosoProps`.
- `PinEnabledUserRoles` and `PinPermissions` are removed; use `useMessagePermissions(message).canPin`.
See ai-docs/v15-breaking-changes.md (BC-087 to BC-095) and ai-docs/ai-migration-v14-v15.md.
* message context and grouping API changes.
- MessageProps.threadList and MessageContextValue.threadList are removed. Detect a thread
with `!!useThreadContext()`.
- ReactionSelector.getDialogId takes only `{ messageId }`; the reaction selector dialog id
no longer has a `-thread` part. Each message list has its own dialog manager.
- MessageContextValue.endOfGroup, firstOfGroup and groupedByUser are removed. Read
`useMessageContext().groupStyles[0]` (`top`, `middle`, `bottom` or `single`).
- The str-chat__virtual-message__wrapper--end, --first and --group classes are no longer
applied. Target the list item's .str-chat__li--top / --middle / --bottom / --single.
- MessageList.noGroupByUser and VirtualizedMessageList.shouldGroupByUser are replaced by
groupByUser (defaults: true and false). VirtuosoContext.shouldGroupByUser is groupByUser.
- The groupStyles function prop of both lists is renamed getGroupStyles and is called with
one GetGroupStylesParams object: { groupByUser, maxTimeBetweenGroupedMessages, message,
nextMessage, previousMessage }. The exported getGroupStyles takes the same object, and
useEnrichedMessages takes getGroupStyles and groupByUser instead of groupStyles and
noGroupByUser.
See BC-048, BC-085 and BC-086 in ai-docs/v15-breaking-changes.md.
* **MessageComposer:** useUserRole(message).canEdit is now the update permission alone
(update-any-message, or update-own-message on the user's own message). It no
longer excludes poll messages and giphies. A custom UI that gated an edit button
on it and wants that rule adds `!message.poll_id && message.command !== 'giphy'`.
* **MessageComposer:** the edit, copyMessageText and download rules about the message
moved from useBaseMessageActionSetFilter onto the items of
defaultMessageActionSet as isVisible. A hand-written edit, copyMessageText or
download item without isVisible now shows wherever the base filter allows it,
e.g. edit on a poll message the user may update. Copy the default item's
isVisible to keep the rule. Item isVisible rules also apply when
disableBaseMessageActionSetFilter is set, which previously returned the set
unfiltered, and to failed messages: a poll message or giphy that failed to send
for a network reason no longer offers Edit.
* **MessageComposer:** a message with a poll renders its text and attachments too, and
the quoted message now renders above the poll instead of below it. Such a
message gets str-chat__message--has-poll and no longer gets
str-chat__message--has-single-attachment.
* **MessageComposer:** custom AttachmentPreviewList, VoiceRecordingPreviewSlot and
LinkPreviewList components mount only while their item in
defaultMessageComposerPreviewSet is visible: attachments while the composer holds
an attachment other than a voice recording, voiceRecording while it holds a voice
recording, linkPreviews while a link preview is loading or loaded. Previously they
mounted whenever the preview area showed. A custom component that also renders
something else (a location, a poll, an empty or upload state) replaces its item
with one whose isVisible covers it.
* channel.watch() resolves with the channel instance to use (the channel, or the instance that superseded it), not the server response: read channel.data, channel.state and channel.messagePaginator instead.
- channel.watch() sends no query for a channel already watched and loaded unless it asks for options the current watch was not sent with, so it no longer refreshes one: refresh with channel.reload(), load other messages through channel.messagePaginator.
- A channel.watch() while another with the same options is in flight joins it instead of sending a request.
* **MessageList:** useMessageListScrollManager no longer takes onScrollToTop. Loading older messages keeps the message the reader was looking at in place, also when loading starts at the very top, instead of pinning the newly loaded page to the top.
- InfiniteScrollPaginator's loadNextDebounceMs now rate-limits the edge check while scrolling (the first check runs at once, then at most once per loadNextDebounceMs) instead of waiting until scrolling stops for that long. Older and newer pages start loading before the reader reaches the edge.
- MessageList and VirtualizedMessageList pass showNotification to NewMessageNotification only when a message from someone else arrives while the list is scrolled up. Being on an older message set no longer shows it; ScrollToLatestMessageButton signals that.
- In a channel, ScrollToLatestMessageButton shows the current user's unread count from the channel's read state instead of counting message.new events, so messages a reconnect brought in are included. In a thread it counts new replies from 0.
* marker: the removals are v14 API, so the branch has a
`fix!:` commit with a `BREAKING CHANGE:` footer, per the AGENTS.md
convention. The footer to keep in the squash commit:
* `MessageList` no longer accepts `messages`, `hasMore`,
`jumpToLatestMessage`, `loadingMoreNewer` or `messageLimit`, and
`VirtualizedMessageList` no longer accepts `messages`; the lists render
and paginate the message paginator. `CustomClasses.chatContainer` and
the `ComponentContext.LoadingErrorIndicator` slot are removed. Inside
`ChatView` the channel list no longer renders its own `str-chat <theme>`
scope. See ai-docs/v15-breaking-changes.md (BC-019, BC-046, BC-047,
BC-073, BC-074).
Verification: `yarn lint`, `tsc -p tsconfig.lib.json --noEmit`, `yarn
types:scripts`, `yarn validate-translations` and `yarn test` (281 files,
3090 tests) pass. `yarn build`, `validate-cjs`, `validate-esm`,
`validate-entry-isolation`, and the tutorial and vite example builds
passed before the rebase onto the guides branch, which brought in only
docs and the api-surface script. The ai-chatbot example build was not
verified: it hung locally in a sandboxed environment. The theme-scope
change was not checked visually in a browser.
### UI Changes
No intended visual change inside `ChatView`. Outside `ChatView`, the
channel list picks up the design tokens again, as in v14. The
`MessageList` loading indicator now appears while older messages load.
No screenshots: the examples need Stream credentials to run.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Gallery items can display message-specific timestamp overrides.
* Reply-count buttons honor a message’s custom thread-opening behavior.
* Standalone channel lists now inherit the chat theme, and
channel-detail actions use workspace navigation.
* `useMessagePaginator` and `useIsCooldownActive` are available from the
package entry point.
* Message timestamps can render with an explicit message outside a
message context.
* **Bug Fixes**
* Message-list loading indicators and pagination behavior now reflect
active page loads more accurately.
* Workspace navigation warns when navigation actions are used without a
provider.
* **Breaking Changes**
* Removed legacy message-list props and the `LoadingErrorIndicator`
component override slot.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
* the `options` prop of `useCreateChatClient` is renamed to
`config`, and its type changes from `StreamChatOptions` to the `stream-chat`
configuration tree (`DeepPartial<InstanceConfigTree>`). Options that were
passed at the top level now go under the `client` key, for example
`options={{ baseURL, axiosRequestConfig }}` becomes
`config={{ client: { baseURL, axiosRequestConfig } }}`. Requires a
* requires stream-chat 10.0.0-rc.20 or later; client.activeChannels, client.getChannelById() and client.getChannelByMembers() are gone, use client.channelManager.get(cid), values() and client.channel() / client.channelManager.ensure({ type, id, data }); the thread list is client.threads.paginator, and threads come from client.threads.ensure() / get().
* getChannel() is removed; get the channel from client.channelManager.ensure() and call channel.ensureWatched(options).
* channel search results, and the channels message search fetches for its results, are no longer watched; a custom search result component watches the channel when it is opened (channel.ensureWatched(), or jumpToMessage(id, { watchChannel: true }) for a message).
* port the tutorial alignment (#3251) to v15, with panel-aware workspace navigation (#3301)
* **MessageComposer:** the `preventClearingOnUnmount` prop is removed from
`MessageComposer`. Drop it. If you relied on unmounting to clear a
composer supplied through `MessageComposerControllerProvider`, call
`clear()` on it yourself when your UI is done with it.
* `ChannelListItemProps.channelUpdateCount` is removed.
The unread badge now updates without it.
* `ChannelListItemProps.key` is removed. React's own
`key` prop is unaffected.
* `ChannelListItemProps.watchers` is removed. It had no
effect in v15.
* adopt stream-chat's branded TimestampNS (#3297)
* **Attachment:** `useSendMessageFn` and `useUpdateMessageFn` are removed. Call
`messageComposer.send()` and `messageComposer.update()` instead. They resolve
`'sent' | 'nothing-to-send' | 'failed'` rather than a boolean, so a truthiness
check on the result now passes for every outcome — compare against `'sent'`.
* **Attachment:** the two message submission failure notifications changed key.
`messageComposer.sendMessageFn.sendMessageRequestFailed.text` is now
`notification.messageSendFailed`, and
`messageComposer.updateMessageFn.editMessageRequestFailed.text` is now
`notification.messageUpdateFailed`. A typed custom translation dictionary fails
to compile until both are renamed.
* **Attachment:** `RetryHandler` takes `Omit<OperationParams<'retry'>, 'message'>`
instead of `RetrySendMessageWithLocalUpdateParams`, which stream-chat removed in
GetStream/stream-chat-js#1882. Code that names the old type must be updated.
* the `stream-chat` peer range moves to `^10.0.0-rc.12`. That release removes
`connection.changed`, changes `client.wsConnection` from the socket itself to a wrapper, and moves
the socket's settings into configuration. See GetStream/stream-chat-js PR 1859 for the full list;
an application on an earlier `stream-chat` will not typecheck against this version.
* connectivity is read from state stores rather than events. Code that listened for
`connection.changed` — to render its own banner, to refetch on reconnect — must subscribe to
`client.wsConnection.state` or `client.networkConnection.state` instead, or use the new
`useWSConnectionState` / `useNetworkConnectionState` hooks. Nothing in this package dispatches or
forwards the old event. Note the two stores name their fields differently: the socket's `isHealthy`
is always a boolean, while the network's `isOnline` is `boolean | undefined`, where `undefined`
means no platform reporter has reported yet and must be tested with `=== false`.
* `Channel` no longer reloads its channel on `connection.recovered`. The client
reloads every active channel itself and dispatches the event afterwards, so handling it here
reloaded each open channel twice per reconnect. Anything relying on the component to refresh a
channel after a reconnect should rely on the client instead.
* a socket drop on a working network now renders "Reconnecting…" rather than
"Waiting for network…", from the new `chat.reportLostConnection.reconnecting.text` key. Tests and
dictionaries keyed on the old copy for that case need updating; the `waitingNetwork` key is
unchanged and still used when the device network is down. The delay before either banner appears
now comes from `client.wsConnection.config.offlineNotificationDisplayDelayMs` (5s default) rather
than from a fixed hold inside the client, so changing that config changes when the banner shows.
The `system:network:connection:lost` notification type is unchanged.
* `Thread` requires a `thread` prop and renders `children`.
`additionalMessageComposerProps`, `additionalMessageListProps`,
`additionalParentMessageProps`, `additionalVirtualizedMessageListProps`, `autoFocus` and
`virtualized` are removed — pass those props to the children you render. `Thread`
provides the thread itself, so it no longer needs to be wrapped in `ThreadProvider`. The
`str-chat__thread--virtualized` class is gone; `Thread` cannot know which list you chose.
* `Thread.enableDateSeparator` is removed with nothing in its place. A
`MessageList` in a thread now follows its own default and shows date separators unless
you pass `withDateSeparator={false}`.
* `disableDateSeparator` is renamed to `withDateSeparator` on
`MessageList` (default `true`, was `disableDateSeparator={false}`) and
`VirtualizedMessageList` (default `false`, was `disableDateSeparator={true}`). The rename
also reaches `processMessages`, `useEnrichedMessages`, `FloatingDateSeparator`,
`useFloatingDateSeparator` and `useFloatingDateSeparatorMessageList`.
* the `head` prop is removed from `MessageList` and
`VirtualizedMessageList`. Both render the thread's parent message from context; override
it with a `ThreadHead` component on `ComponentContext`.
* `ThreadHeaderProps` is down to `overrideTitle`. `thread` comes from the
thread in context, and `closeThread` goes through workspace navigation — customize it
centrally via `ChatView`'s `deriveWorkspaceNavigation`, or call the new `useCloseThread()`
hook from a header of your own. `ComponentContext.ThreadHeader` is removed; compose the
header you want.
* `ThreadSlot` wraps its children in `<Thread>` instead of letting them
replace the whole panel, mirroring `ChannelSlot`. Markup that must sit outside the thread
container moves outside `ThreadSlot`; anything needing thread context must sit inside.
* `Thread` no longer rebuilds its subtree when the thread changes. A
custom component rendered inside `Thread` that relied on being remounted per thread — to
reset local state, or to re-run a mount effect — must depend on the thread instead. The
SDK's own message list does this by keying on the thread; `WithAudioPlayback` by taking
`playbackScope`.
* `LegacyThreadContext` and its `legacyThread` value are removed. The
thread composer resolves its composition context from the `Thread` instance in
`ThreadContext`.
* **MessageActions:** the `messageActions` prop is removed from `Channel`,
`MessageList`, `VirtualizedMessageList`, `Thread` and `Message`. Filter
`defaultMessageActionSet` and pass the result as `messageActionSet`
instead.
* **MessageActions:** `MESSAGE_ACTIONS`, `OPTIONAL_MESSAGE_ACTIONS`,
`getMessageActions()`, and the `MessageActionsArray` and `Capabilities`
types are no longer exported. Use the new `DefaultMessageActionType`
union for the action types the SDK ships.
* **MessageActions:** `MessageContext` no longer carries `getMessageActions`
or `actionsEnabled`. The rendered action set is decided by
`messageActionSet` and each item's own `isVisible` predicate.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* **AudioPlayback:** `ChannelProps.allowConcurrentAudioPlayback`,
`ThreadProps.allowConcurrentAudioPlayback` and
`WithAudioPlaybackProps.allowConcurrentPlayback`
are removed, with no replacement. If you passed `true`, delete it:
starting a player now pauses
whichever was playing and takes the shared element over. If you passed
`false` or nothing, the
only change is that playback is exclusive across surfaces rather than
within one.
* **AudioPlayback:** `useActiveAudioPlayer()` now reports the app-wide
active player rather than the
calling surface's.
* **Channel:** `ChannelProps.channel` is now required and
`EmptyPlaceholder` is removed.
Render the exported `ChannelPlaceholder` to fill the same
`.str-chat__channel` layout slot
while no channel is selected.
* **Channel:** `Channel` no longer queries the channel;
`initializeOnMount` and
`channelQueryOptions` are removed. Whoever supplies the channel
initializes it — use the
exported `getChannel({ channel, client })`, which watches and
de-duplicates concurrent calls.
Channels from `ChannelList` or any `queryChannels` call arrive watched
already. `Channel` no
longer renders `LoadingIndicator` or `LoadingErrorIndicator` for a query
it does not make, and
an uninitialized channel renders as an empty channel with no error.
* **Channel:** `Channel` no longer writes `document.title`, and
`activeUnreadHandler` is
removed. See `examples/vite/src/DocumentTitleManager` for a working
replacement in application
code.
* **Channel:** the `channel.channelMissing.text` translation key is
removed. This is a
compile error (TS2353) for any dictionary typed with the exact
`TranslationDictionary` —
delete the entry from custom locale files.
* **Channel:** `ChatContext.latestMessageDatesByChannels` is removed.
Slow-mode cooldown now
lives on `channel.cooldownTimer` (`useCooldownRemaining` /
`useIsCooldownActive`), and the
channel's latest message on
`channel.messagePaginator.aggregateState.lastMessage`.
* **Channel:** `Channel` no longer jumps to a message focused from
search. Selecting a search
result calls `channel.messagePaginator.jumpToMessage(id)` directly, and
the highlight is read
from `channel.messagePaginator.messageFocusSignal`. A custom message
list that relied on
`Channel` performing the jump must call `jumpToMessage` itself.
* **i18n:** consume the shared runtime from @stream-io/i18n (#3284)
* move to timestamps in response models (#3278)
* request-handler props are removed from `Channel` and
`Thread`.
`doSendMessageRequest`, `doUpdateMessageRequest`,
`doDeleteMessageRequest` and
`doMarkReadRequest` are gone, along with `useChannelRequestHandlers`,
`useThreadRequestHandlers` and `useEditMessageHandler`. Register once on
the client:
```
// v14
<Channel channel={channel} doSendMessageRequest={mySend}>
// v15
client.config.set({
channel: {
requestHandlers: {
sendMessageRequest: async ({ localMessage, message, options }) => ({
message: await mySend(message, options),
}),
},
},
});
```
Three differences: handlers take a single params object and return `{
message }`; thread
flows register under the `thread` key; and registration is per CLIENT,
not per mounted
subtree — the one thing the props could do that this cannot. Per-channel
behaviour now
needs a branch inside one handler on the `cid` it receives.
* `useChannelConfig` returns the channel's RESOLVED
configuration instead
of the channel type's raw server config, so field names change:
channelConfig?.typing_events → channelConfig?.typingEvents.enabled
channelConfig?.read_events → channelConfig?.readEvents.enabled
channelConfig?.replies → channelConfig?.replies.enabled
channelConfig?.user_message_reminders →
channelConfig?.userMessageReminders.enabled
channelConfig?.commands → channelConfig?.availableCommands
Every gate is now the server flag ANDed with what is registered through
`client.config`,
which is what the client actually enforces. The hook also subscribes:
these were getters,
so a `client.config.set()` previously never reached the screen. No
component reads
`channel.serverConfig` any more.
* `useAttachmentManagerState` replaces
`hasCustomDoUploadRequest` with
`customCdn`, and gains `attachmentsEnabled`, `locationEnabled` and
`pollsEnabled`.
* the per-domain stores on `channel.state` are removed —
`readStore`,
`typingStore`, `membersStore`, `watcherStore`, `ownCapabilitiesStore`,
`mutedUsersStore`.
Subscribe to `channel.state` itself; the selector is unchanged, because
`ChannelStateData`
is flat and keeps the same top-level keys:
useStateStore(channel.state.ownCapabilitiesStore, sel) →
useStateStore(channel.state, sel)
`WatcherState` is renamed `ChannelWatchState`, and
`channel.disconnected` is renamed
`channel.pendingDisposal` (removed outright — no deprecated alias).
* `AIStates` is no longer exported from
`stream-chat-react` — import it
from `stream-chat`. The values are unchanged, but it is now
literal-typed, so an inferred
array of its members no longer accepts the wide `AIState`:
const STOPPABLE: readonly AIState[] = [AIStates.Thinking,
AIStates.Generating];
* `<Channel>` marks its channel active while mounted and
reloads it on
`connection.recovered`. The client skips re-seeding an active channel's
message list on
hydration and reconnect, so the consumer owns that window. A custom
channel surface that
does not render `<Channel>` must call `channel.activate()` /
`deactivate()` and
`channel.reload()` itself, or its list goes stale after a reconnect.
* **i18n:** adopt the shared i18n layer from stream-chat/i18n (#3271)
* **context:** - **Context hooks no longer accept a `componentName` argument.**
`useChatContext('X')` and friends stop type-checking; drop the argument.
- **Required contexts throw when used outside their provider**, instead
of logging a warning and returning `{}`. Affects the 14 hooks listed
above. Components must be rendered within the provider they read from —
e.g. anything calling `useChatContext` needs a `<Chat>` ancestor.
- **`useChannelInstanceContext` returns
`Partial<ChannelInstanceContextValue>`** — `channel` is now typed as
possibly `undefined`.
- **`ChatViewContext` has no default value** (typed `| undefined`), so
`useContext(ChatViewContext)` may return `undefined`.
- **`MessageComposerContext` is typed as `MessageComposerContextValue |
undefined`**, correcting a narrower declaration that was papered over
with casts.
- **The gallery header no longer uses the
`ComponentContext.MessageTimestamp` override**; it renders the item's
own timestamp.
### 🛠 Implementation details
Parameter removed from all 7 hooks and their 138 call sites.
Missing-provider behaviour also normalized, since `src/` had three
competing conventions (warn + `{} as T`, throw, silent cast). The `{} as
T` fallback deferred failures to a downstream `Cannot read properties of
undefined` several frames away. Everything now goes through
`requireContext` (`src/context/requireContext.ts`):
- **Required → throw**, naming hook and provider: `useChatContext`,
`useMessageContext`, `useMessageComposerContext`,
`useMessageListContext`, `useVirtualizedMessageListContext`,
`useMessageBounceContext`, `usePollContext`, `useDialogManager`,
`useSearchContext`, `useSearchSourceResultsContext`,
`useContextMenuContext`, `useChannelListItemContext`,
`useGalleryContext`, `useChatViewContext`
- **Optional by design → keep default, honest type**:
`useTranslationContext`, `useComponentContext`,
`useChannelInstanceContext` (now `Partial`), `useModalContext`,
`useAriaLiveAnnouncer`, `useMessageTranslationViewContext`
- **Renders both inside and outside a provider → read the raw context**:
`Audio`, `VoiceRecording`, `CardAudio`, `Timestamp`,
`MessageRepliesCountButton`, `MessageComposerUI`, `ModalGallery`
Two changes were needed before their hooks could throw:
- `WithDragAndDropUpload` detected the composer via
`Object.keys(ctx).length > 0`; now uses a
`useIsWithinMessageComposerContext()` predicate. Adds the test file this
component lacked.
- `GalleryHeader` read message context while rendering outside any
`MessageProvider`. `GalleryItem` now carries `user` and `createdAt` —
wrapping the call sites would be wrong, since `ChannelMediaView`
flattens many messages into one list. Adds a
`timestamp.GalleryTimestamp` key.
`ChatViewContext` also loses its module-level `LayoutController`
default, which let unrelated subtrees write to one shared instance.
`src/context/__tests__/missingProviderContract.test.tsx` pins the
required/optional split.
### 🎨 UI Changes
The channel-media gallery header now shows a per-item sender and
timestamp, which it previously couldn't display at all.
No screenshots: the demo users on the shared environment have no
channels, and seeding one would write test data others would see.
Covered by unit tests in `GalleryUI.test.tsx` — worth a manual look.
* the <Chat> prop and the ChatContext field channelPaginatorsOrchestrator are renamed to channelManager, and the types ChannelPaginatorsOrchestrator / ChannelPaginatorsOrchestratorState are now ChannelManager / ChannelManagerState. Every useChatContext() consumer reading the old field, and any test that builds a partial ChatContext value, has to be updated. No deprecated prop or type aliases are exported.
* requires stream-chat v10.
* Removed `ChannelStateContext` and `ChannelActionContext` along with
`useChannelStateContext()`, `useChannelActionContext()`,
`useCreateChannelStateContext()` and `useCreateChannelActionContext()`.
Read the channel via `useChannel()` and message state via
`useMessagePaginator()`; both are backed by LLC `StateStore`s.
* `ChatContext` no longer exposes the active channel or `setActiveChannel()`.
Channel/thread routing is slot-driven — use `useChatViewNavigation()` from
`stream-chat-react/slot-layout` (`openChannel`, `openThread`, `closeThread`).
* The `TypingContext` provider path was removed from the `Channel` runtime.
`TypingIndicator` now derives its state from LLC stores and takes
`isMessageListScrolledToBottom` and `scrollToBottom` props.
* Context mutation/pagination helpers were replaced by paginator methods:
`updateMessage`/`removeMessage` -> `ingestItem`/`removeItem`;
`loadMore`/`loadMoreNewer` -> `toTail()`/`toHead()`;
`jumpToMessage`/`jumpToFirstUnreadMessage` -> `messagePaginator.jumpToMessage()`/
`jumpToTheFirstUnreadMessage()`. Messages are no longer in `channel.state`.
* Custom send/update/delete/markRead overrides move from ChannelActionContext
callbacks to `channel.configState.requestHandlers` /
`thread.configState.requestHandlers`.
* `ChatView` is a navigation landmark, not a WAI-ARIA Tabs widget: the selector
is `role="navigation"` with `aria-current` on the active button. There is no
`role="tab"`/`"tablist"`/`"tabpanel"`. `activeChatView` renamed to `activeView`.
* `ChannelList` renders a `role="listbox"` whose items are `role="option"`.
* v10 data shapes: channel name/image read from `channel.data.custom.name`/
`.custom.image`; user custom fields from `user.custom` (e.g. `username`);
attachment `duration`/`file_size`/`mime_type`/`waveform_data` from
`attachment.custom`. Message moderation uses `message.moderation`
(`moderation_details` is gone).
### Bug Fixes
* adapt to removed stream-chat-js hand-written types ([#3274](https://github.com/GetStream/stream-chat-react/issues/3274)) ([ccccce5](https://github.com/GetStream/stream-chat-react/commit/ccccce5e4bbb55340118315b2244df0f37e260d3))
* **ai-components:** fromStreamMessage takes a LocalMessage, loadOlderMessages a toTail ([#3390](https://github.com/GetStream/stream-chat-react/issues/3390)) ([20a488f](https://github.com/GetStream/stream-chat-react/commit/20a488f94128cc9c2fff6999f3afb3aa68af53aa)), closes [#3389](https://github.com/GetStream/stream-chat-react/issues/3389)
* **ai-components:** theme generated UI from AI tokens alone, add showsUI and approval arguments ([#3412](https://github.com/GetStream/stream-chat-react/issues/3412)) ([49f859c](https://github.com/GetStream/stream-chat-react/commit/49f859c800eee8f39018825804c82cc8e2281383)), closes [#3399](https://github.com/GetStream/stream-chat-react/issues/3399) [#3399](https://github.com/GetStream/stream-chat-react/issues/3399) [#3399](https://github.com/GetStream/stream-chat-react/issues/3399) [#3394](https://github.com/GetStream/stream-chat-react/issues/3394) [#3395](https://github.com/GetStream/stream-chat-react/issues/3395) [#3393](https://github.com/GetStream/stream-chat-react/issues/3393) [#3399](https://github.com/GetStream/stream-chat-react/issues/3399) [#3399](https://github.com/GetStream/stream-chat-react/issues/3399)
* **Attachment:** render giphy attachments in their own group with uni… ([#3322](https://github.com/GetStream/stream-chat-react/issues/3322)) ([08b8c0e](https://github.com/GetStream/stream-chat-react/commit/08b8c0ea75a20d19b0d66042bb521e3b6f463567)), closes [#2934](https://github.com/GetStream/stream-chat-react/issues/2934)
* **Attachment:** render giphy attachments in their own group with unique keys ([8967e37](https://github.com/GetStream/stream-chat-react/commit/8967e37bc8ef1224ffa4d31239de4e6bf02d9803))
* **AttachmentSelector:** offer file uploads with customCdn and add StandaloneButton ([#3397](https://github.com/GetStream/stream-chat-react/issues/3397)) ([3e5af96](https://github.com/GetStream/stream-chat-react/commit/3e5af961049050f23258e2071f0e67fc50fca895))
* bubble-aware colors for quotes, location, polls and the AI stop button ([#3411](https://github.com/GetStream/stream-chat-react/issues/3411)) ([b2a8ded](https://github.com/GetStream/stream-chat-react/commit/b2a8ded2c901c8e254704a77f4e3a798edafa32d))
* **ChannelDetail:** call onLayoutChange and close through onClose outside a modal ([#3396](https://github.com/GetStream/stream-chat-react/issues/3396)) ([03796b0](https://github.com/GetStream/stream-chat-react/commit/03796b03dad983d096268784301d26d208a9a037))
* **ChannelDetail:** give the channel members header action set the shared action-set shape ([#3405](https://github.com/GetStream/stream-chat-react/issues/3405)) ([e7af1aa](https://github.com/GetStream/stream-chat-react/commit/e7af1aa3302f24159bc8a54fd29950f33bf26e54))
* **ChannelListHeader:** list headers take StartContent / EndContent props ([#3406](https://github.com/GetStream/stream-chat-react/issues/3406)) ([d60e737](https://github.com/GetStream/stream-chat-react/commit/d60e7372ace041eaccc8471767e26a2eddd741f8))
* **ChannelList:** strip markdown from the last-message preview and add listboxProps ([#3410](https://github.com/GetStream/stream-chat-react/issues/3410)) ([e614648](https://github.com/GetStream/stream-chat-react/commit/e614648afaf160bf80bd23a9bdd869f91b657e39))
* correct issues found during the comment cleanup ([#3334](https://github.com/GetStream/stream-chat-react/issues/3334)) ([7f87026](https://github.com/GetStream/stream-chat-react/commit/7f870262d8946abb1b27122227d65f3697f5a236))
* **deps:** bump [@stream-io](https://github.com/stream-io) toolkit packages to the .mjs/.cjs builds ([#3368](https://github.com/GetStream/stream-chat-react/issues/3368)) ([c22f3f8](https://github.com/GetStream/stream-chat-react/commit/c22f3f8bb4b2314c28ecb19e7fd57473afb926a8)), closes [GetStream/js-toolkit#58](https://github.com/GetStream/js-toolkit/issues/58)
* **deps:** bump stream-chat to 10.0.0-rc.28 ([#3369](https://github.com/GetStream/stream-chat-react/issues/3369)) ([bca4ce2](https://github.com/GetStream/stream-chat-react/commit/bca4ce24484cf2245f487126de449c6c4bf712dc))
* drop unset MessageContext fields and unify message grouping props ([#3386](https://github.com/GetStream/stream-chat-react/issues/3386)) ([097b474](https://github.com/GetStream/stream-chat-react/commit/097b4742a2533896b4051984af935d5c23436cd4))
* **EmojiPicker:** drop @emoji-mart/react peer dependency on v15 ([#3300](https://github.com/GetStream/stream-chat-react/issues/3300)) ([e7ce32f](https://github.com/GetStream/stream-chat-react/commit/e7ce32fa7840c54e91e8648929353f838628ef03))
* **examples:** translate the voice visualization keys in the vite example ([#3352](https://github.com/GetStream/stream-chat-react/issues/3352)) ([c88ab33](https://github.com/GetStream/stream-chat-react/commit/c88ab339f3dbd89817edb5d2251b62126f5f6520)), closes [#3347](https://github.com/GetStream/stream-chat-react/issues/3347)
* **Gallery:** play videos without a thumbnail and load the selected Giphy version ([#3407](https://github.com/GetStream/stream-chat-react/issues/3407)) ([506cb9d](https://github.com/GetStream/stream-chat-react/commit/506cb9dfacc41d719445f11aaca569a6ea97d3a2))
* **InfiniteScrollPaginator:** check the edges on resize in the next frame ([#3357](https://github.com/GetStream/stream-chat-react/issues/3357)) ([dd40f58](https://github.com/GetStream/stream-chat-react/commit/dd40f582daaa9810dcb4faa00e4a2a41b61e520c)), closes [GetStream/website-react-examples#138](https://github.com/GetStream/website-react-examples/issues/138) [#3342](https://github.com/GetStream/stream-chat-react/issues/3342)
* **LinkPreviewList:** take the preview thumbnail from image_url or thumb_url ([#3392](https://github.com/GetStream/stream-chat-react/issues/3392)) ([8b6bbd9](https://github.com/GetStream/stream-chat-react/commit/8b6bbd96bfee84748028290d72b561488a3ad191))
* **MediaRecorder:** build the voice recording with a pending upload state ([#3400](https://github.com/GetStream/stream-chat-react/issues/3400)) ([6285e3d](https://github.com/GetStream/stream-chat-react/commit/6285e3dd03d153e957de355001c96dfa49d2e0fe))
* **MediaRecorder:** stop the recording timer when the preview unmounts ([#3351](https://github.com/GetStream/stream-chat-react/issues/3351)) ([3c8b30a](https://github.com/GetStream/stream-chat-react/commit/3c8b30aa8c37cdc939cf3846f8f616bce8eaa9c6))
* **MessageActions:** show Pin only with the pin-message capability ([#3382](https://github.com/GetStream/stream-chat-react/issues/3382)) ([f31ab7a](https://github.com/GetStream/stream-chat-react/commit/f31ab7a4211af432c9cd137c86cdead5cc0fdaee))
* **MessageList:** keep the reader's place on older pages and count only arrived messages as new ([#3342](https://github.com/GetStream/stream-chat-react/issues/3342)) ([ab00d67](https://github.com/GetStream/stream-chat-react/commit/ab00d67111cd945714d5689d7cef163d0bf55f9f))
* **MessageList:** keep the viewport still when a jumped-to window reaches the live head ([#3290](https://github.com/GetStream/stream-chat-react/issues/3290)) ([351d69d](https://github.com/GetStream/stream-chat-react/commit/351d69dc71a59b6254b4c03f32d63127d67e721b)), closes [#3027](https://github.com/GetStream/stream-chat-react/issues/3027)
* **MessageList:** restore the older-page anchor on iOS WebKit ([#3316](https://github.com/GetStream/stream-chat-react/issues/3316)) ([e3247e1](https://github.com/GetStream/stream-chat-react/commit/e3247e10ac97a49c509c41da0af23b5b21acff22))
* **MessageList:** show delivery and read state on every message that has it ([#3296](https://github.com/GetStream/stream-chat-react/issues/3296)) ([e74c57a](https://github.com/GetStream/stream-chat-react/commit/e74c57acf9215421cbcb860489a4685c2d9b0474))
* **MessageList:** stop the floating date separator from stacking on the inline one ([#3370](https://github.com/GetStream/stream-chat-react/issues/3370)) ([ec1413d](https://github.com/GetStream/stream-chat-react/commit/ec1413d20c7db9e70abde78a3f730a7e0ea9e448))
* **Message:** send default reactions through messageOperations ([#3379](https://github.com/GetStream/stream-chat-react/issues/3379)) ([53f497d](https://github.com/GetStream/stream-chat-react/commit/53f497dc115dce6c4d6d4eaea00797bc647385bd))
* **Message:** show error notification when pin, mute or delete fails ([#3360](https://github.com/GetStream/stream-chat-react/issues/3360)) ([d88dbf0](https://github.com/GetStream/stream-chat-react/commit/d88dbf02a7d021a75c5a5d179875b66571c5804d)), closes [#3359](https://github.com/GetStream/stream-chat-react/issues/3359)
* **Message:** throw when a message handler is missing a parameter ([#3362](https://github.com/GetStream/stream-chat-react/issues/3362)) ([290d2db](https://github.com/GetStream/stream-chat-react/commit/290d2dbaf931a5f19e12b022d542dc8b93c389c6)), closes [#3360](https://github.com/GetStream/stream-chat-react/issues/3360) [#3360](https://github.com/GetStream/stream-chat-react/issues/3360)
* **Poll:** port the poll vote debounce removal ([#3308](https://github.com/GetStream/stream-chat-react/issues/3308)) to v15 ([#3309](https://github.com/GetStream/stream-chat-react/issues/3309)) ([1af035e](https://github.com/GetStream/stream-chat-react/commit/1af035eaf14f1579a3179ed551baff576f6bc3f7)), closes [#1904](https://github.com/GetStream/stream-chat-react/issues/1904)
* prevent eager requests on Thread component mount ([#3282](https://github.com/GetStream/stream-chat-react/issues/3282)) ([6b7dd6c](https://github.com/GetStream/stream-chat-react/commit/6b7dd6cacde3cd3a5d450dc638ae4999070c863f))
* remove dead v15 surface and restore v14 behaviors found by the API audit ([#3328](https://github.com/GetStream/stream-chat-react/issues/3328)) ([d721f40](https://github.com/GetStream/stream-chat-react/commit/d721f406675c327ada97ce1089525f05d180d20b)), closes [GetStream/stream-chat-react#3327](https://github.com/GetStream/stream-chat-react/issues/3327) [#3305](https://github.com/GetStream/stream-chat-react/issues/3305) [#3237](https://github.com/GetStream/stream-chat-react/issues/3237)
* remove props and override keys that have no effect, wire up the rest ([#3408](https://github.com/GetStream/stream-chat-react/issues/3408)) ([91b2c68](https://github.com/GetStream/stream-chat-react/commit/91b2c688536a8309db0ba6136e8922589c825c35))
* render stable notification host for Channel and Thread ([#3291](https://github.com/GetStream/stream-chat-react/issues/3291)) ([ce59094](https://github.com/GetStream/stream-chat-react/commit/ce59094bcd2347357628107b8841851cc4af8ee0))
* **renderText:** stop markdown tables from rendering an empty row under the header ([#3385](https://github.com/GetStream/stream-chat-react/issues/3385)) ([6a4f93d](https://github.com/GetStream/stream-chat-react/commit/6a4f93d99b88e54190a6baf53fcfc60e9b981c2c))
* retry attachment uploads through AttachmentManager.uploadFile ([#3384](https://github.com/GetStream/stream-chat-react/issues/3384)) ([2359ae8](https://github.com/GetStream/stream-chat-react/commit/2359ae839ed5ef354e017870be38b46808519530))
* **ShareLocationDialog:** keep one position watch and give the first fix 10 s ([#3409](https://github.com/GetStream/stream-chat-react/issues/3409)) ([37a4be3](https://github.com/GetStream/stream-chat-react/commit/37a4be336efe5816ca3933fe344e5d4b82579fe9))
* ship the CustomChannelData typing and remove dead exports and the transliterate dependency ([#3403](https://github.com/GetStream/stream-chat-react/issues/3403)) ([85d5b4e](https://github.com/GetStream/stream-chat-react/commit/85d5b4e5dadc07385c177cea89a6309a08bd0b4b))
* show list query errors with a retry in ChannelList and ThreadList ([#3381](https://github.com/GetStream/stream-chat-react/issues/3381)) ([bb1b874](https://github.com/GetStream/stream-chat-react/commit/bb1b874c263b14962f8199f46a1ea2b56b920864))
* **store:** provide getServerSnapshot to useStateStore so server rendering works ([0ccf60d](https://github.com/GetStream/stream-chat-react/commit/0ccf60db7011866068a5ae2ab025f529a1ec2581))
* system message row class, thread list slide, composer error icons, addNotification id ([#3398](https://github.com/GetStream/stream-chat-react/issues/3398)) ([a5daf2a](https://github.com/GetStream/stream-chat-react/commit/a5daf2a6a887edf2481c6c7d3ff4fa4af570d530))
* **types:** remove DefaultCommandData and the CustomCommandData augmentation ([#3380](https://github.com/GetStream/stream-chat-react/issues/3380)) ([10e2b66](https://github.com/GetStream/stream-chat-react/commit/10e2b6651cf53b36b809bfc877158df158d798e4))
* **TypingIndicator:** pass the two typing names to typing.twoUsers as separate values ([#3404](https://github.com/GetStream/stream-chat-react/issues/3404)) ([7021ab9](https://github.com/GetStream/stream-chat-react/commit/7021ab95f337d45a6b2a91aec9535c9135268adb))
* v15 regressions found in side-by-side QA ([#3364](https://github.com/GetStream/stream-chat-react/issues/3364)) ([534c503](https://github.com/GetStream/stream-chat-react/commit/534c5039c44eedd51622fa5404eec649dad0e4ea))
* **VirtualizedMessageList:** keep the last message fully visible in short lists ([#3318](https://github.com/GetStream/stream-chat-react/issues/3318)) ([ef5c384](https://github.com/GetStream/stream-chat-react/commit/ef5c384dd2d3fa0641744fb4168e4459a79bc3f9))
* **VirtualizedMessageList:** pass mention and user handlers and unsafeHTML to messages ([#3402](https://github.com/GetStream/stream-chat-react/issues/3402)) ([059f939](https://github.com/GetStream/stream-chat-react/commit/059f9392d283151143ade44e2ec9009a27a4d100))
### Features
* add icons to ComponentContext adapted to stream-chat-react@15 ([#3294](https://github.com/GetStream/stream-chat-react/issues/3294)) ([baf4b62](https://github.com/GetStream/stream-chat-react/commit/baf4b62f6e43681af1a4712be0f8e0b02609a9d0))
* adopt stream-chat's branded TimestampNS ([#3297](https://github.com/GetStream/stream-chat-react/issues/3297)) ([aaa7fa3](https://github.com/GetStream/stream-chat-react/commit/aaa7fa31e54fed4f7ac1b6d7ee6cf436a4c3234c)), closes [GetStream/stream-chat-js#1884](https://github.com/GetStream/stream-chat-js/issues/1884) [GetStream/stream-chat-js#1884](https://github.com/GetStream/stream-chat-js/issues/1884) [#3295](https://github.com/GetStream/stream-chat-react/issues/3295)
* **ai-components:** add stream-chat-react/ai-components entry point ([50fe88e](https://github.com/GetStream/stream-chat-react/commit/50fe88e27a80a9db805fe747d6d0a9e1b776afe6))
* **ai-components:** add useHeardText for voice-paced text ([#3348](https://github.com/GetStream/stream-chat-react/issues/3348)) ([ec7c956](https://github.com/GetStream/stream-chat-react/commit/ec7c956b88ff35798cd3aad89a90935ce4be6b2c)), closes [GetStream/stream-chat-react#3343](https://github.com/GetStream/stream-chat-react/issues/3343) [GetStream/stream-chat-react#3344](https://github.com/GetStream/stream-chat-react/issues/3344) [#3344](https://github.com/GetStream/stream-chat-react/issues/3344) [#3343](https://github.com/GetStream/stream-chat-react/issues/3343) [#3339](https://github.com/GetStream/stream-chat-react/issues/3339) [GetStream/stream-chat-react#3347](https://github.com/GetStream/stream-chat-react/issues/3347)
* **ai-components:** add VoiceWave and VoiceGlow voice-agent visualizations ([#3347](https://github.com/GetStream/stream-chat-react/issues/3347)) ([216d00d](https://github.com/GetStream/stream-chat-react/commit/216d00dd7aadd45d1e3a4933483f46e35db6c94c)), closes [GetStream/stream-chat-react#3339](https://github.com/GetStream/stream-chat-react/issues/3339) [#3339](https://github.com/GetStream/stream-chat-react/issues/3339) [#3339](https://github.com/GetStream/stream-chat-react/issues/3339)
* **ai-components:** agent conversations, reply steps, approvals and sign-in ([#3389](https://github.com/GetStream/stream-chat-react/issues/3389)) ([6ac68dd](https://github.com/GetStream/stream-chat-react/commit/6ac68dd2826176a5e4c581a3b56eef44764fe767)), closes [#3376](https://github.com/GetStream/stream-chat-react/issues/3376) [#3376](https://github.com/GetStream/stream-chat-react/issues/3376)
* **ai-components:** generated UI, with A2UI and OpenUI renderers ([#3393](https://github.com/GetStream/stream-chat-react/issues/3393)) ([3e808cc](https://github.com/GetStream/stream-chat-react/commit/3e808cc8a9b16216ff728850d18f54cc6eda3f38)), closes [GetStream/stream-chat-react#3388](https://github.com/GetStream/stream-chat-react/issues/3388) [#3388](https://github.com/GetStream/stream-chat-react/issues/3388) [GetStream/stream-chat-react#3394](https://github.com/GetStream/stream-chat-react/issues/3394) [#3394](https://github.com/GetStream/stream-chat-react/issues/3394) [#3394](https://github.com/GetStream/stream-chat-react/issues/3394)
* **ai-components:** port the ai-components entry point ([#3314](https://github.com/GetStream/stream-chat-react/issues/3314)) to v15 ([#3315](https://github.com/GetStream/stream-chat-react/issues/3315)) ([9d1eacb](https://github.com/GetStream/stream-chat-react/commit/9d1eacbd288865898647ef92c24052608b1444a2))
* **Attachment:** render live upload progress on messages being sent ([#3295](https://github.com/GetStream/stream-chat-react/issues/3295)) ([4f1459e](https://github.com/GetStream/stream-chat-react/commit/4f1459e54ee37980c0c0418e69ae927eee60e16a))
* **AudioPlayback:** play one voice message at a time, across the whole app ([#3287](https://github.com/GetStream/stream-chat-react/issues/3287)) ([68999a7](https://github.com/GetStream/stream-chat-react/commit/68999a7b387c05b77d25bcecd3af77c87f2cd02c))
* **Channel:** depend on the Channel instance, not its cid, and narrow its responsibilities ([#3286](https://github.com/GetStream/stream-chat-react/issues/3286)) ([088c795](https://github.com/GetStream/stream-chat-react/commit/088c795c1628da6290f3a6ae5a57aaa058013095))
* **ChannelHeader:** add a Title slot and export the default subtitle ([#3367](https://github.com/GetStream/stream-chat-react/issues/3367)) ([766a71f](https://github.com/GetStream/stream-chat-react/commit/766a71f89d1ba76b53abf2a194e8674aa5e33913))
* **context:** consolidate message UI overrides on the MessageUI slot ([#3268](https://github.com/GetStream/stream-chat-react/issues/3268)) ([0766489](https://github.com/GetStream/stream-chat-react/commit/07664893efe5da053a7430aa6f985ceb91ff2901)), closes [#3267](https://github.com/GetStream/stream-chat-react/issues/3267)
* **context:** drop componentName param from context consumer hooks ([#3267](https://github.com/GetStream/stream-chat-react/issues/3267)) ([9194215](https://github.com/GetStream/stream-chat-react/commit/9194215f01029e79f3ed573991e99686449a84cb))
* **i18n:** english-only bundle with namespaced, type-checked translation keys ([#3261](https://github.com/GetStream/stream-chat-react/issues/3261)) ([17c91bc](https://github.com/GetStream/stream-chat-react/commit/17c91bc70c4af2621870475bf62f15e0341d1ac9))
* **MessageComposer:** let integrators supply the composer MessageComposer edits ([#3299](https://github.com/GetStream/stream-chat-react/issues/3299)) ([14e5860](https://github.com/GetStream/stream-chat-react/commit/14e58601fe7b4d0e9f424468e260e03247dc5f10))
* **MessageComposer:** make composer previews a configurable set ([#3365](https://github.com/GetStream/stream-chat-react/issues/3365)) ([1c02ba0](https://github.com/GetStream/stream-chat-react/commit/1c02ba07fd4bc7a94f23fc5848c70c8405086731))
* migrate components from ChannelActionContext, ChannelStateContext to StateStore instances ([#3237](https://github.com/GetStream/stream-chat-react/issues/3237)) ([99cbe67](https://github.com/GetStream/stream-chat-react/commit/99cbe67049d45d5a0f5f3c4463989a6824f739b6))
* move to new upload API ([#3272](https://github.com/GetStream/stream-chat-react/issues/3272)) ([04a31b1](https://github.com/GetStream/stream-chat-react/commit/04a31b18eff73492e6b305dd751f315bc9637a2b))
* move to timestamps in response models ([#3278](https://github.com/GetStream/stream-chat-react/issues/3278)) ([cb472c3](https://github.com/GetStream/stream-chat-react/commit/cb472c35f0bfe940b360a8564c535b3e9c0e6b53))
* pass the stream-chat configuration tree through useCreateChatClient ([#3321](https://github.com/GetStream/stream-chat-react/issues/3321)) ([557ffcb](https://github.com/GetStream/stream-chat-react/commit/557ffcb3cface45aa152474238c85aefbd0eff53)), closes [GetStream/stream-chat-js#1911](https://github.com/GetStream/stream-chat-js/issues/1911)
* port the tutorial alignment ([#3251](https://github.com/GetStream/stream-chat-react/issues/3251)) to v15, with panel-aware workspace navigation ([#3301](https://github.com/GetStream/stream-chat-react/issues/3301)) ([66557d6](https://github.com/GetStream/stream-chat-react/commit/66557d63b9a6eb08f6cfa8b0cb74418ec2451386))
* release v15 under the latest npm tag ([#3418](https://github.com/GetStream/stream-chat-react/issues/3418)) ([4ff3c97](https://github.com/GetStream/stream-chat-react/commit/4ff3c9745f364d9b34602f080a454afb641d3a09))
* rename ChannelPaginatorsOrchestrator to ChannelManager ([#3258](https://github.com/GetStream/stream-chat-react/issues/3258)) ([be2c8e1](https://github.com/GetStream/stream-chat-react/commit/be2c8e1e7bc486495ac5c9399728f58e78a23398))
* replace StreamChat.activeChannels with entity item index for loaded channels ([#3310](https://github.com/GetStream/stream-chat-react/issues/3310)) ([a41eed5](https://github.com/GetStream/stream-chat-react/commit/a41eed56fb5d471474768a3e989e50bbd9ba62c0))
* support local unread count on v15 ([#3298](https://github.com/GetStream/stream-chat-react/issues/3298)) ([a42c3cf](https://github.com/GetStream/stream-chat-react/commit/a42c3cf9729c107f95516001942aca864eb7f7f9))
* use configuration service API as a single source of truth ([#3273](https://github.com/GetStream/stream-chat-react/issues/3273)) ([f66597a](https://github.com/GetStream/stream-chat-react/commit/f66597a131c8ea2cd7758c78b95fa1479b3d4b3e))
* use network and WS connection observer services from LLC ([#3281](https://github.com/GetStream/stream-chat-react/issues/3281)) ([3098a90](https://github.com/GetStream/stream-chat-react/commit/3098a90a658b6ba49f9831aba27ce6b6720c9c82))
### Refactors
* align Thread with Channel - instance prop, provider, children ([#3289](https://github.com/GetStream/stream-chat-react/issues/3289)) ([c2136f3](https://github.com/GetStream/stream-chat-react/commit/c2136f307021b6007f2015659eb801aed2adfc9e))
* call Channel.watch(), which replaces ensureWatched() in stream-chat ([#3346](https://github.com/GetStream/stream-chat-react/issues/3346)) ([0100d98](https://github.com/GetStream/stream-chat-react/commit/0100d98ce0cac448238afaba2d4f8ec197b04d49))
* **i18n:** adopt the shared i18n layer from stream-chat/i18n ([#3271](https://github.com/GetStream/stream-chat-react/issues/3271)) ([f68cad3](https://github.com/GetStream/stream-chat-react/commit/f68cad3322e5c9fb3e9a20f415bc26cf28c9a701)), closes [GetStream/stream-chat-js#1830](https://github.com/GetStream/stream-chat-js/issues/1830)
* **i18n:** consume the shared runtime from @stream-io/i18n ([#3284](https://github.com/GetStream/stream-chat-react/issues/3284)) ([eb3ae7a](https://github.com/GetStream/stream-chat-react/commit/eb3ae7a5d44d39f86a69476514884ae3e5d4f823))
* **MessageActions:** remove the messageActions prop in from message lists ([#3288](https://github.com/GetStream/stream-chat-react/issues/3288)) ([b541c45](https://github.com/GetStream/stream-chat-react/commit/b541c45f92e448f8f29425beeb13f15bcd262252))
* **MessageList:** render thread messages from the thread unread snapshot ([#3324](https://github.com/GetStream/stream-chat-react/issues/3324)) ([ec6ce33](https://github.com/GetStream/stream-chat-react/commit/ec6ce3397b1e9af006ade622e138bc3cb4e4c007))
* **Message:** replace initialMessage with useIsRenderedAsThreadParent ([#3401](https://github.com/GetStream/stream-chat-react/issues/3401)) ([3b616f9](https://github.com/GetStream/stream-chat-react/commit/3b616f9761a3523c4a78fcbe35a7bc139c8c01f3))
* remove deprecated message APIs before v15 GA ([#3387](https://github.com/GetStream/stream-chat-react/issues/3387)) ([80ca72d](https://github.com/GetStream/stream-chat-react/commit/80ca72d85f4845af04d8627bdae0f8cbe85061cd))
### Performance Improvements
* **build:** emit ESM per source module so consumers can tree-shake ([#3269](https://github.com/GetStream/stream-chat-react/issues/3269)) ([55e76dc](https://github.com/GetStream/stream-chat-react/commit/55e76dca1f9e8a11c3f2ccdc88cc0686d9cf3ccc))
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🎯 Goal
Closes REACT-851
Add smooth scroll to jumped to messages. Applies to jump to message in the current message set as well as in a disjunct set (message arrays are switched).
Fixes the jumping behavior while paginating on scroll. Now the pagination is smooth without jumps. The work done to assure it was profiled. Results are recorded in specs.
Fixed scroll
scroll jumping prevented.webm
Smooth jumping
smooth scroll on jump.webm