Skip to content

Next Release#3680

Closed
isekovanic wants to merge 14 commits into
mainfrom
develop
Closed

Next Release#3680
isekovanic wants to merge 14 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 13 commits June 17, 2026 19:07
## 🎯 Goal

This PR fixes destructive channel actions so that they always display a
dialog whenever clicked in order to compensate for them potentially
being pressed by accident.

Additionally, it fixes a very small visual inconsistency with the iOS
limited button in the `AttachmentPicker`.

## πŸ›  Implementation details

<!-- Provide a description of the implementation -->

## 🎨 UI Changes

<!-- Add relevant screenshots -->

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


<details>
<summary>Android</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

<!-- Explain how this change can be tested (or why it can't be tested)
-->

## β˜‘οΈ 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
## 🎯 Goal

Removes duplicate headers from expo sample app because that app uses
native headers. The PR also fixes dark-mode issue on pinned messages,
file and media attachment screens

## πŸ›  Implementation details

<!-- Provide a description of the implementation -->

## 🎨 UI Changes

<!-- Add relevant screenshots -->

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


<details>
<summary>Android</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

<!-- Explain how this change can be tested (or why it can't be tested)
-->

## β˜‘οΈ 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
## 🎯 Goal

Implement search bar for list all members screen. Unrelated to this PR:
but I unified spacing for all 3 screens with searchbar to match figma.
Since channel details are experimental and not documented, it's ok to do
breaking changes.

## πŸ›  Implementation details

<!-- Provide a description of the implementation -->

## 🎨 UI Changes

<!-- Add relevant screenshots -->

<img height="500" alt="1"
src="https://github.com/user-attachments/assets/0cddb15c-b08d-49fa-bf36-c58ca228612a"
/>

<img height="500" alt="Screenshot_20260617_223634_Chat Sample React
Native"
src="https://github.com/user-attachments/assets/04b93713-db08-4b8d-ba37-a89afeeec4db"
/>

<img height="500" alt="Screenshot_20260617_223623_Chat Sample React
Native"
src="https://github.com/user-attachments/assets/f33d3c50-6092-4ea4-a066-eed924ad2c95"
/>


## πŸ§ͺ Testing

<!-- Explain how this change can be tested (or why it can't be tested)
-->

## β˜‘οΈ 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
## 🎯 Goal

When a screen-reader user opens a channel or thread, VoiceOver/TalkBack
focus previously landed on an arbitrary stop (the back button, or a
message mid-list). This moves the entry point to where the user acts β€”
the message composer β€” while keeping the header/back reachable via
standard OS gestures.
- Add `useSetAccessibilityFocus()` - a public, generic primitive that
moves the screen reader cursor onto a ref/node (SR-gated, RAF deferred).
It only moves accessibility focus; it never opens the keyboard or
activates the field.
- Add `useScreenReaderMountFocus(ref)` - built on the primitive; focuses
on mount (and once the SR state resolves). `MessageComposer` uses it on
`inputBoxRef`, so the composer is focused on entry. This is the path
that lands Android forward navigation as well (but not always on iOS,
which is why we need the actual transitional effect as well)
`SampleApp` reference implementation:
- `useScreenReaderComposerFocusEffect` - wires React Navigation's
`transitionEnd` to `useSetAccessibilityFocus`, covering back navigation
(both platforms) and iOS forward navigation (where firing on mount loses
a race with the OS focus pass). Returns a stable `setInputRef` for
`<Channel>`.
- Header reachability is done by adding `accessibilityRole='header'` on
the screen header title (reachable via iOS Headings rotor / jump to top
and Android Headings reading control swipe up) and
`onAccessibilityEscape` -> `goBack` on the screen root for the iOS back
scrub (Android uses the system Back gesture).
Note: `onAccessibilityEscape` is inert on a layout only `View` under
`Fabric` - it gets flattened and never receives the gesture. The view
hosting it needs `collapsable={false}` if it does not apply any `layout`
relevant props itself.

## πŸ›  Implementation details

<!-- Provide a description of the implementation -->

## 🎨 UI Changes

<!-- Add relevant screenshots -->

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


<details>
<summary>Android</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

<!-- Explain how this change can be tested (or why it can't be tested)
-->

## β˜‘οΈ 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
This PR was created automatically by CI.

Co-authored-by: Stream Bot <runner@runnervm1li68.2c5nrm3boe3enn0n421mfffcfg.ex.internal.cloudapp.net>
## 🎯 Goal

<!-- Describe why we are making this change -->

## πŸ›  Implementation details

<!-- Provide a description of the implementation -->

## 🎨 UI Changes

<!-- Add relevant screenshots -->

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


<details>
<summary>Android</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

<!-- Explain how this change can be tested (or why it can't be tested)
-->

## β˜‘οΈ 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
## 🎯 Goal

<!-- Describe why we are making this change -->

## πŸ›  Implementation details

<!-- Provide a description of the implementation -->

## 🎨 UI Changes

<!-- Add relevant screenshots -->

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


<details>
<summary>Android</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

<!-- Explain how this change can be tested (or why it can't be tested)
-->

## β˜‘οΈ 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
## 🎯 Goal

`useScreenReaderEnabled` used to attach its own `AccessibilityInfo`
listener and fire its own `isScreenReaderEnabled()` native query on
**every mount**. It runs in every `Message` row (twice, via
`useMessageActionHandlers`) plus the composer, so the app requeried the
OS and resubscribed on every row mount/remount - work that grows with
message count and scrolling.
This PR introduces a single app-wide **`ScreenReaderContext`**: one
provider performs one query + one listener, and every consumer reads the
value from context. `useScreenReaderEnabled` collapses to a context
read; its public signature and the `enabled` / `forceScreenReaderMode`
gating are unchanged.

### On-device perf-testing tooling (initial pass WIP)
In addition to all of this, the PR also introduces a bootstrapping on
device perf testing setup we'll keep iterating on. It's in its early
conception still, but so far it's been able to run its own iteration
over our `SampleApp` (on Android) and add performance related probes so
as to measure this particular change. The result was ~300 microseconds
less work for each message to render (asynchronous, of course, non
blocking for the UI, but still). This work is of course hugely
negligible and will never matter in the grand scheme of things
(especially for something gated behind a flag like a11y), but it's still
very interesting that it is able to find this out on a fresh agent, with
almost no interaction from my side (after many, many iterations :D ). It
comes with its own "verbs" (rudimentary for now) related to app actions
and only works with ADB. Later own we'll extend this further and
potentially add iOS support as well.

Features so far:
- `perf/scenario-lib.sh` β€” reusable adb/uiautomator device-driving verbs
(wait-on-testID, tap, retry tap, scroll, count).
- `perf/scenario-template.sh` + `perf/drive-channel-scenario.sh` -
template + first scenario.
- A `perf-benchmarking` skill capturing the methodology and pitfalls,
containing some instructions on how to actually do actionable things in
the app

A more proper technical document for this will be included later.

## πŸ›  Implementation details

<!-- Provide a description of the implementation -->

## 🎨 UI Changes

<!-- Add relevant screenshots -->

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


<details>
<summary>Android</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

<!-- Explain how this change can be tested (or why it can't be tested)
-->

## β˜‘οΈ 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
## 🎯 Goal
Our image gallery was never properly virtualized and mounted one slide
component per asset for **all** loaded media (`assets.map(...)`), so
scroll/swipe jank scaled with the asset count. On a media heavy channel
roughly **40% of frames were janky**, driven by `O(N)` animated style
worklets rerunning on the UI thread every frame. This bounds that cost
so gallery performance no longer degrades as channels accumulate media.
This was relatively fine before, when `ChannelDetails` hadn't been
introduced yet but now poses an actual challenge.
## πŸ›  Implementation details
- Extracted the slide list into a windowed `GalleryPager` that mounts
only the slides within `PAGER_WINDOW_RADIUS` of the current index,
instead of all N. Mounted slides drop from ~N to ~9.
- A single **leading spacer** reproduces the flex width of the skipped
slides, so the rendered slides keep their exact natural positions. The
per slide transforms (`useAnimatedGalleryStyle`) are a pure function of
`index` + `flex` position, so windowing the mount should be fine
- `GalleryPager` subscribes to `currentIndex` itself, so paging
rerenders only the small slide list, never the parent (gesture
objects/`GestureDetector` stay stable).
- The existing per slide `shouldRender` load gate is retained (image
+-3, video +-1) for now so windowing bounds the *mount*; `shouldRender`
still bounds *content load* (notably capping live native video players
within the mounted set).
Measured on a debug `SampleApp` (on a media heavy channel), provided
below are the results (naturally, taken from the best 5 runs against
baseline and the worst 5 runs against this branch across of many, many
runs):
| Metric | Before | After | Improvement |
|---|---|---|---|
| **Janky frames** | 40.4% | **14.1%** | **βˆ’65%** (βˆ’26 pts) |
| **Median frame time** | 42 ms | **21 ms** | **2Γ— faster** (βˆ’50%) |
| 90th-pct frame time | 79 ms | 46 ms | βˆ’42% |
| 95th-pct frame time | 95 ms | 67 ms | βˆ’29% |
| 99th-pct frame time | 150 ms | 133 ms | βˆ’11% |
| **Missed vsyncs** | 154 | **57** | **2.7Γ— fewer** (βˆ’63%) |
| Frames rendered (same path) | 856 | 1,039 | +21% throughput |
| Mounted slide components | ~165 | **~9** | **~18Γ— fewer** |
Jank no longer scales with asset count (after jank is flat across N,
where before it rose).

## 🎨 UI Changes

<!-- Add relevant screenshots -->

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


<details>
<summary>Android</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

<!-- Explain how this change can be tested (or why it can't be tested)
-->

## β˜‘οΈ 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
## 🎯 Goal

<!-- Describe why we are making this change -->

## πŸ›  Implementation details

<!-- Provide a description of the implementation -->

## 🎨 UI Changes

<!-- Add relevant screenshots -->

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


<details>
<summary>Android</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

<!-- Explain how this change can be tested (or why it can't be tested)
-->

## β˜‘οΈ 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
## 🎯 Goal

This PR fixes two small alignment bugs:

- The `iOS` limited button for the `AttachmentMediaPicker` when system
font size is set to max
- The alignment overlap specifically for `lg` versions of `GroupAvatar`

## πŸ›  Implementation details

<!-- Provide a description of the implementation -->

## 🎨 UI Changes

<!-- Add relevant screenshots -->

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


<details>
<summary>Android</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

<!-- Explain how this change can be tested (or why it can't be tested)
-->

## β˜‘οΈ 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
## 🎯 Goal

A cleanup for channel details, the main focus is to make it easier for
integrators to reuse the specific building blocks, the implementation
details describes all changes in detail. This PR also implements the new
role label UI from Figma.

Docs: GetStream/docs-content#1389

## πŸ›  Implementation details

UI changes

- New member-role UI (feat: implement new member role UI) β€” Replaced the
old single text role label on member items with a dedicated, reusable
RoleList / RoleItem component pair (components/roles/). Roles now render
as styled
  chips/badges with distinct owner vs. regular-role colors.
- New theme tokens added under messageMenu: roleList.container and
roleItem (container, text, ownerBackgroundColor, ownerColor,
roleBackgroundColor, roleColor). The old memberItem.role token was
removed.
- Logic moved from useMemberRoleLabel (single label string) β†’
useMemberRoles (returns a list of roles).
- Padding / spacing fixes β€” Several visual fixes: missing modal padding
on Android in edge-to-edge mode, general padding fixes, and edit-button
sizing in the Expo sample app.

  Component / architecture restructures

- Add-members flow split into composable parts β€” ChannelAddMembersModal
(deleted) β†’ ChannelAddMembersButton, ChannelAddMembersForm,
ChannelAddMembersFormContent, ChannelAddMembersFormHeader. The
add-members button is now its own
  component, and a proper HOC was created for it.
- Edit-details flow split the same way β€” ChannelEditDetailsModal
(deleted) β†’ ChannelEditDetailsForm, ChannelEditDetailsFormContent,
ChannelEditDetailsFormHeader. Form submission was simplified.
- ChannelDetails context split up β€” The monolithic ChannelDetails
context was broken into focused contexts: channelDetailsContext,
ChannelAddMembersContext, ChannelEditDetailsContext, plus per-list
contexts (ChannelMemberListContext,
ChannelMediaListContext, ChannelFileAttachmentListContext,
ChannelPinnedMessageListContext). channel was moved into the context,
the value wrapper was removed, and channel was dropped from contexts
used under channel details.
ChannelDetails.tsx itself shrank from ~171 lines of orchestration to a
thin shell.
- Hooks promoted to the SDK's shared src/hooks/ β€”
useCanEdit/useCanAddMembers were moved, renamed, and split into
useCanEditChannel and useCanAddMembersToChannel (with tests);
useIsDirectChat updated.
- New signal store (state-store/signal-store.ts) β€” A small signal store
to imperatively close any open channel-details modal; related store
hooks exported. The edit-channel-details-store was also reworked.
- Public API changes β€” useSelectedChannelState is now exported from the
SDK; ChannelAllMembersModal is no longer exposed (component deleted);
custom searchSource can be passed to channel-details components.
- Sample apps updated β€” Both SampleApp and ExpoMessaging
(details/index.tsx, screens) were migrated to the new component/context
structure; Expo sample app fixes.
  - Removed the experimental warnings



## 🎨 UI Changes

No UI changes

## πŸ§ͺ Testing

<!-- Explain how this change can be tested (or why it can't be tested)
-->

## β˜‘οΈ 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
## 🎯 Goal

The online indicator was misaligned for `2xl` avatars. The issue was
that we used a static offset, not a dynamic computed from avatar and
online indicator size.

## πŸ›  Implementation details

Moving from static offset to computed offset affects all avatar sizes
with online indicators. The below list contains the changes for other
sizes. They're pretty small, but I checked all occurrences, and they
still look good:

<img width="458" height="201" alt="Screenshot 2026-06-26 at 8 24 43"
src="https://github.com/user-attachments/assets/ee387560-a6aa-4785-b3d1-9e8d969b8c7f"
/>


## 🎨 UI Changes

Before:
<img width="337" height="663" alt="Screenshot 2026-06-26 at 7 52 54"
src="https://github.com/user-attachments/assets/21b399c9-dc40-42cf-a293-d03e01d79076"
/>
After:
<img width="564" height="1240" alt="Screenshot 2026-06-26 at 8 16 32"
src="https://github.com/user-attachments/assets/4c4f93d9-d5d8-451b-8e6c-32558fb765b2"
/>

## πŸ§ͺ Testing

<!-- Explain how this change can be tested (or why it can't be tested)
-->

## β˜‘οΈ 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
@isekovanic isekovanic requested a review from szuperaz June 29, 2026 15:52
@github-actions

Copy link
Copy Markdown

Next releases

v9.5.0

9.5.0 (2026-06-29)

Bug Fixes

Features

  • add search bar for members list in channel details (#3668) (f3f13e6)

Refactors

Performance Improvements

sampleapp@v4.13.1

4.13.1 (2026-06-29)

Bug Fixes

  • a11y: focus inputs on enter and page transitions (#3671) (683ba19)
  • respect command sorting coming from dashboard (#3673) (1781bba)

Refactors

@Stream-SDK-Bot

Copy link
Copy Markdown
Contributor

SDK Size

title develop branch diff status
js_bundle_size 1972 KB 1972 KB 0 B 🟒

## 🎯 Goal

<!-- Describe why we are making this change -->

## πŸ›  Implementation details

<!-- Provide a description of the implementation -->

## 🎨 UI Changes

<!-- Add relevant screenshots -->

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


<details>
<summary>Android</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

<!-- Explain how this change can be tested (or why it can't be tested)
-->

## β˜‘οΈ 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
@isekovanic isekovanic closed this Jun 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants