Skip to content

fix(examples): enable async voice recording preview in thread composer#3092

Merged
oliverlaz merged 1 commit intomasterfrom
fix/thread-async-recording
Apr 3, 2026
Merged

fix(examples): enable async voice recording preview in thread composer#3092
oliverlaz merged 1 commit intomasterfrom
fix/thread-async-recording

Conversation

@oliverlaz
Copy link
Copy Markdown
Member

🎯 Goal

Voice recordings in threads should show a preview before sending, matching the main channel composer behavior.

πŸ›  Implementation details

Added asyncMessagesMultiSendEnabled: true to additionalMessageComposerProps on both Thread instances. Without this prop, useMediaRecorder auto-sends the recording on stop instead of stacking it as a preview attachment.

Add asyncMessagesMultiSendEnabled to thread composer props so recorded
audio shows a preview instead of sending immediately, matching the
main channel composer behavior.
@oliverlaz oliverlaz merged commit 6c7cd42 into master Apr 3, 2026
6 checks passed
@oliverlaz oliverlaz deleted the fix/thread-async-recording branch April 3, 2026 12:48
@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 3, 2026

Size Change: 0 B

Total Size: 613 kB

ℹ️ View Unchanged
Filename Size
dist/cjs/audioProcessing.js 1.32 kB
dist/cjs/emojis.js 2.96 kB
dist/cjs/index.js 237 kB
dist/cjs/mp3-encoder.js 1.27 kB
dist/cjs/WithAudioPlayback.js 42.7 kB
dist/css/emoji-replacement.css 456 B
dist/css/index.css 45.5 kB
dist/es/audioProcessing.mjs 1.31 kB
dist/es/emojis.mjs 2.47 kB
dist/es/index.mjs 235 kB
dist/es/mp3-encoder.mjs 756 B
dist/es/WithAudioPlayback.mjs 42.5 kB

compressed-size-action

github-actions bot pushed a commit that referenced this pull request Apr 3, 2026
## [14.0.0-beta.6](v14.0.0-beta.5...v14.0.0-beta.6) (2026-04-03)

### ⚠ BREAKING CHANGES

* 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.

### chore

* adjustmens to Avatar, GroupAvatar and ChannelAvatar ([#3087](#3087)) ([49d576e](49d576e))

### Bug Fixes

* **examples:** clean up tutorial examples for v14 ([#3089](#3089)) ([6239895](6239895))
* **examples:** enable async voice recording preview in thread composer ([#3092](#3092)) ([6c7cd42](6c7cd42))
* **examples:** fix resize handle alignment and thread border gap in RTL ([#3091](#3091)) ([2f060ae](2f060ae))
* **Icons, RTL:** update icon catalog, RTL layout fixes, dark mode & thread voice recording ([#3090](#3090)) ([a4b1c26](a4b1c26)), closes [#3080](#3080)
@stream-ci-bot
Copy link
Copy Markdown

πŸŽ‰ This PR is included in version 14.0.0-beta.6 πŸŽ‰

The release is available on:

Your semantic-release bot πŸ“¦πŸš€

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants