Skip to content

Next Release - #3984

Merged
isekovanic merged 5 commits into
mainfrom
develop
Nov 12, 2026
Merged

isekovanic merged 5 commits into
mainfrom
develop

Conversation

@isekovanic

Copy link
Copy Markdown
Contributor

🎯 Goal

πŸ›  Implementation details

🎨 UI Changes

iOS
Before After
Android
Before After

πŸ§ͺ Testing

β˜‘οΈ Checklist

  • I have signed the Stream CLA (required)
  • PR targets the develop branch
  • Documentation is updated
  • New code is tested in main example apps, including all possible scenarios
    • SampleApp iOS and Android
    • Expo iOS and Android

isekovanic and others added 5 commits November 11, 2026 10:51
Ticket: https://linear.app/stream/issue/RN-523

## 🎯 Goal

Editing a message with a video showed no duration pill in the composer.
Since the OpenAPI migration the duration was never sent with the
message, so once the local file is gone there was nothing to show.

## πŸ›  Implementation details

- The video pre-upload middleware now sends the picked file's duration
along as `custom.duration`.
- `VideoAttachmentUploadPreview` falls back to `custom.duration` when
there is no local file.
- Videos sent from v9 work too, since the v2 API returns their old
top-level `duration` under `custom`. Videos sent from v10 before this
fix have no duration stored and still show no pill.

## πŸ§ͺ Testing

- Unit tests for the middleware and the edit preview.
- Tested on the iOS simulator: picked, sent and edited a video, and the
pill shows in the edit view.
Ticket: https://linear.app/stream/issue/RN-526

## 🎯 Goal

When the first unread message starts a new day, the unread indicator
showed up above its date separator. The date separator now comes first.

## πŸ›  Implementation details

The indicator was rendered at the bottom of the last read message's row,
and the date separator at the top of the next row. It now renders in the
first unread message's row, between the date separator and the message.

The selector that finds the boundary checks the previous message instead
of the next one. The rule itself is unchanged.

## 🎨 UI Changes

<details>
<summary>iOS</summary>

<table>
    <thead>
        <tr>
            <td>Before</td>
            <td>After</td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>
                <!--<img src="" /> -->
            </td>
            <td>
                <!--<img src="" /> -->
            </td>
        </tr>
    </tbody>
</table>
</details>

## πŸ§ͺ Testing

Open a channel where the first unread message is on a different day than
the last read one. The date separator should be above "N unread
messages", with the same spacing as before.

Updated the two `MessageList` tests that expected the indicator on the
last read row and added one for the order.

## β˜‘οΈ Checklist

- [ ] I have signed the [Stream
CLA](https://docs.google.com/forms/d/e/1FAIpQLScFKsKkAJI7mhCr7K9rEIOpqIDThrWxuvxnwUq2XkHyG154vQ/viewform)
(required)
- [x] PR targets the `develop` branch
- [ ] Documentation is updated
- [ ] New code is tested in main example apps, including all possible
scenarios
  - [ ] SampleApp iOS and Android
  - [ ] Expo iOS and Android
Ticket: https://linear.app/stream/issue/RN-527

Stacked on #3980.

## 🎯 Goal

In poll creation, the + button of the max votes stepper moved when the
value went from 9 to 10, because the number input grew with its text.

## πŸ›  Implementation details

The input gets a 32pt minimum width, no horizontal padding and centered
text, so it stays the same width from 2 to 10. The row gap goes from
`spacingXxs` to `spacingXs` to match the design. Vertical padding is
unchanged.

## 🎨 UI Changes

<details>
<summary>iOS</summary>

<table>
    <thead>
        <tr>
            <td>Before</td>
            <td>After</td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>
                <!--<img src="" /> -->
            </td>
            <td>
                <!--<img src="" /> -->
            </td>
        </tr>
    </tbody>
</table>
</details>

## πŸ§ͺ Testing

Create a poll, turn on "Multiple votes" and "Limit votes per person",
and step between 9 and 10. The + button should stay in place.

## β˜‘οΈ Checklist

- [ ] I have signed the [Stream
CLA](https://docs.google.com/forms/d/e/1FAIpQLScFKsKkAJI7mhCr7K9rEIOpqIDThrWxuvxnwUq2XkHyG154vQ/viewform)
(required)
- [ ] PR targets the `develop` branch
- [ ] Documentation is updated
- [ ] New code is tested in main example apps, including all possible
scenarios
  - [ ] SampleApp iOS and Android
  - [ ] Expo iOS and Android
Ticket: https://linear.app/stream/issue/RN-520

## 🎯 Goal

Fix the failures in nightly
[43138494994](https://github.com/GetStream/stream-chat-react-native/actions/runs/43138494994).
Three jobs failed, for four separate reasons. None of them is a
regression in the SDK.

## πŸ›  Implementation details

**iOS 17.5:
`test_messageListScrollsDown_whenMessageListIsScrolledDown_andUserReceivesNewMessage`**
(fails in every nightly)
- When a message arrives while the list is at the bottom, the
scroll-to-bottom button shows for a moment while the list scrolls to it,
then hides. The "button is hidden" assert could pass before the button
appeared, and its single follow-up check then caught it on screen.
- `assertVisibility(false)` now waits until the element has stayed
hidden for 1 s.

**Android API 34: "The app has unexpectedly disconnected from Detox
server"**
- The app crashes natively right after launch (`SIGSEGV` in
`android_unsafe_frame_pointer_chase`). Android 14 turns on GWP-ASan
memory sampling for every app. On the x86_64 emulator, GWP-ASan crashes
while recording the stack of a Hermes memory free. Both crashes had the
same fault address.
- The E2E app's manifest now sets `android:gwpAsanMode="never"`.

**Android API 34: "MockServer did not start within 5000ms"**
- Both failures, an hour apart, got the same port (41215) from the
driver, and nothing ever answered on it.
- The harness now picks a port itself that is free on both IPv4 and
IPv6. `localhost` resolves to `::1` on CI, as the mock server logs show.
It passes the port to `/start`, and retries the start on a new port up
to 3 times.

**Android API 36 (coverage batch 1): Polls tests**
- The keyboard was still open from the composer and covered the option
field that appears below the filled one, so that field never counted as
visible.
- On Android, `createPoll` now taps the "Questions" label before each
option field to hide the keyboard.

Not addressed: `test_userLeavesGroupChannel` failed on an empty channel
actions sheet, which is the known SDK bug RN-489.

## πŸ§ͺ Testing

- iOS 17.5, iPhone 15 Pro, locally: the failing test failed 5/5 before
the fix and passed 4/4 after it.
- Android (Pixel API 37 emulator, release build with the new manifest):
`PollsTests` 7/7. The built APK contains `gwpAsanMode=0`. The API 34
crash is random, so the nightly has to confirm that fix.
- eslint, prettier and `tsc -p e2e` are clean.

## β˜‘οΈ Checklist

- [x] I have signed the [Stream
CLA](https://docs.google.com/forms/d/e/1FAIpQLScFKsKkAJI7mhCr7K9rEIOpqIDThrWxuvxnwUq2XkHyG154vQ/viewform)
(required)
- [x] PR targets the `develop` branch
- [ ] Documentation is updated
- [ ] New code is tested in main example apps, including all possible
scenarios
  - [ ] SampleApp iOS and Android
  - [ ] Expo iOS and Android
@isekovanic
isekovanic requested a review from oliverlaz November 12, 2026 12:10
@github-actions

Copy link
Copy Markdown

Next releases

v10.0.2

10.0.2 (2026-11-12)

Bug Fixes

  • keep the poll max votes stepper buttons in place (#3982) (d66c30b)
  • render the date separator above the unread indicator (#3980) (a932e5d)
  • show the video duration when editing messages (#3972) (38afef9)

@Stream-SDK-Bot

Copy link
Copy Markdown
Contributor

SDK Size

title develop branch diff status
js_bundle_size 2027 KB 2027 KB 0 B 🟒
ai_components_size 163 KB 163 KB 0 B 🟒

@isekovanic
isekovanic merged commit f985ff4 into main Nov 12, 2026
29 checks passed
@ghost

ghost commented Nov 12, 2026

Copy link
Copy Markdown

πŸŽ‰ This PR is included in version 10.0.2 πŸŽ‰

The release is available on:

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

@ghost ghost added the released label Nov 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants