You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
## 🎯 Goal
This PR adds optional native multipart upload support for React Native
and Expo packages, with native iOS/Android uploaders, a JS axios
adapter, upload progress propagation and new attachment progress UI.
Additionally, it also moves pending attachment uploads onto
`client.uploadManager`, adds local attachment id tracking, improves
video/document attachment handling, and updates SampleApp to exercise
the new native upload path.
The reason why we decided to add an opt-in native upload is related to
the fact that `axios` does not always report upload progress correctly
on React Native, especially Android. It will sometimes either not update
the progress at all or report it badly, causing UI glitches.
Additionally, native uploads are much, much faster as we take advantage
of streaming directly without any intermediate ephemeral files in order
to do that. Finally, `axios` can easily break if an override to the
underlying RN's `fetch` implementation has been made, especially on
`Android`.
## What Changed
- Added a shared native multipart upload module for iOS and Android,
including request parsing, file/text multipart parts, progress events,
cancellation, timeouts, response handling, and bounded response body
reads.
- Added native package and Expo package bindings for
`StreamMultipartUploader`, plus native handler registration through
`stream-chat-react-native` and `stream-chat-expo`
- Added core JS helpers and public types for native multipart upload
requests, responses, progress events, abort handling, and uploader
creation
- Added `installNativeMultipartAdapter` /
`wrapAxiosAdapterWithNativeMultipart` to route multipart `FormData`
axios requests through the native uploader when available, while leaving
non-multipart requests on the existing adapter
- Added `Chat` support for enabling native multipart uploads via
`useNativeMultipartUpload`; SampleApp enables this path
- Reworked pending message attachment uploads to use
`client.uploadManager.upload` by local attachment id instead of directly
calling `channel.sendImage` / `channel.sendFile`
- Added `localId` propagation from local attachments into message
attachments so pending uploads can be correlated with
`client.uploadManager`
- Updated message sendability and upload indicator behavior to depend on
`allowSendBeforeAttachmentsUpload` rather than offline support
- Added upload progress UI for image, video, file, and audio
attachments, including circular determinate progress, media overlays,
file/audio byte progress labels, and a short completion hold to avoid UI
flicker
- Added new overrideable/default components for attachment upload
progress: `AttachmentUploadIndicator`, `CircularProgressIndicator`, and
`MediaUploadProgressOverlay`
- Updated gallery/video thumbnail rendering so pending media attachments
can show upload progress overlays
- Updated document picking in both native and Expo packages to generate
thumbnails for picked video files (this was missing from V9 initially)
- Updated iOS video thumbnail URL handling to strip query and fragment
data from local file URLs
- Refined native iOS shimmer behavior to reduce animation restarts,
handle foreground/background transitions, visibility, alpha, trait
changes, and resolved color updates more reliably (this should improve
shimmer performance for iOS significantly)
- Updated `Android` shared native source syncing to resolve shared
native sources from the canonical project path
- Replaced SampleApp’s `react-native-fast-image` dependency with
`@d11/react-native-fast-image`
## 🛠 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
---------
Co-authored-by: Zita Szupera <szuperaz@gmail.com>
'"GCC_WARN_INHIBIT_ALL_WARNINGS" => "YES" # Disable warnings because we don\'t control this library',
24
+
"\"GCC_WARN_INHIBIT_ALL_WARNINGS\" => \"YES\", \"OTHER_CPLUSPLUSFLAGS\" => \"$(inherited) -DFMT_USE_CONSTEVAL=0\" # Disable warnings because we don't control this library",
'"GCC_WARN_INHIBIT_ALL_WARNINGS" => "YES" # Disable warnings because we don\'t control this library',
32
+
"\"GCC_WARN_INHIBIT_ALL_WARNINGS\" => \"YES\", \"OTHER_CPLUSPLUSFLAGS\" => \"$(inherited) -DFMT_USE_CONSTEVAL=0\" # Disable warnings because we don't control this library",
0 commit comments