Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
199 commits
Select commit Hold shift + click to select a range
bb40124
chore: update sdk size (#3336)
Stream-SDK-Bot Dec 18, 2025
4053951
feat!: remove deprecated APIs and props for the central audio player …
khushal87 Dec 18, 2025
0afc592
chore: disable beta releases from develop
isekovanic Dec 18, 2025
59e62b4
feat!: remove deprecated APIs and props from useMessageList and chann…
khushal87 Dec 18, 2025
a05e3fc
feat: optional support for react-native-keyboard-controller (#3338)
khushal87 Dec 26, 2025
6560ccd
feat: message context menu (#3339)
isekovanic Dec 27, 2025
60d115e
fix: thread scrreen issue with keyboard controller
khushal87 Dec 27, 2025
e6b1525
fix: bottom sheet android content issues (#3340)
isekovanic Dec 27, 2025
2218f1e
fix: remove sort keys and import eslint config
khushal87 Jan 9, 2026
7b5f9d6
feat: redesign of the Message Input component (#3342)
khushal87 Jan 14, 2026
0c3f87c
feat: add basic theme variables and fix reply issue
khushal87 Jan 16, 2026
5db18de
feat: add basic theme variables and fix reply issue
khushal87 Jan 16, 2026
66c4d00
feat: add primitive components and theme
khushal87 Jan 16, 2026
2d8e9ad
feat!: introduce image gallery state store (#3330)
khushal87 Jan 19, 2026
239ed5a
chore: add android build and deploy workflows and improve ios workflo…
khushal87 Jan 19, 2026
e463b5d
chore: fix firebase android distribution param
khushal87 Jan 19, 2026
a18a02a
fix: change usage of avatar component everywhere in the code (#3349)
khushal87 Jan 20, 2026
f86389b
fix: ux for the scroll bottom button on floating state (#3350)
khushal87 Jan 20, 2026
bb3867f
fix: downgrade bottom sheet version (#3351)
khushal87 Jan 20, 2026
bcd758a
fix: add back the floating config for android
khushal87 Jan 20, 2026
7c5d2c9
fix: improve avatar error handling
khushal87 Jan 20, 2026
6996b50
fix: message list state synchronisity mismatch (#3352)
isekovanic Jan 20, 2026
f121377
fix: ios CI Fastlane missing output name
isekovanic Jan 20, 2026
6339a84
fix: fastlane syntax error
isekovanic Jan 20, 2026
b447d13
fix: make api_key explicit and increment build number before gym invo…
isekovanic Jan 21, 2026
2030ab2
fix: revert bottom sheet version bump
isekovanic Jan 21, 2026
0592bf3
perf: improve animation fluidity for context menu
isekovanic Jan 21, 2026
bba0651
fix: reanimated 4.2.0 issue
khushal87 Jan 22, 2026
703b54b
fix: add new design changes to the message composer as per figma (#3365)
khushal87 Jan 22, 2026
cce09a9
fix: return layout animation of input
isekovanic Jan 22, 2026
84ca48c
fix: update podfile.lock for sample app
khushal87 Jan 23, 2026
c563425
chore: fix testflight build issue on develop when deploy mode is true…
khushal87 Jan 24, 2026
ce35ee6
fix: skip waiting for build processing for ios testflight builds
khushal87 Jan 24, 2026
1c9303a
fix: channel avatar logic and usage (#3353)
khushal87 Jan 27, 2026
96107dd
chore: update ruby gems (#3370)
testableapple Jan 27, 2026
6d2c20c
fix: context menu pressables not firing events on android (#3371)
isekovanic Jan 28, 2026
3a3febd
feat: introduce design tokens to the chat sdk (#3372)
isekovanic Jan 29, 2026
edba2a2
chore: bump xcode version to 26.2
isekovanic Jan 29, 2026
a2a4bd5
feat: async audio redesign, command ui and usage of theme (#3375)
khushal87 Jan 30, 2026
72ff661
feat: add link previews to message composer (#3376)
isekovanic Jan 30, 2026
215b442
chore: update podfile.lock
khushal87 Feb 2, 2026
f19e432
feat: implement video attachment upload previews with thumbnail (#3377)
isekovanic Feb 2, 2026
37a2543
feat: avatar component design refinements (#3378)
khushal87 Feb 2, 2026
ff44253
fix: image gallery crash when many videos are present (#3380)
isekovanic Feb 2, 2026
0acaa8c
fix: voice recording race conditions (#3382)
isekovanic Feb 3, 2026
0437a4b
chore: pass contentContainerStyle to MessageFlashList (#3348)
normanwilde Feb 3, 2026
0dea533
fix: bump vulnerable lodash and linkify versions (#3383)
isekovanic Feb 3, 2026
a4610cc
feat: use countdown timer from channel in client JS (#3381)
khushal87 Feb 4, 2026
f338de5
feat: add button component implementation (#3386)
khushal87 Feb 4, 2026
23ac6ca
feat: implement message composer slots (#3387)
isekovanic Feb 5, 2026
9c6c24a
feat: attachments redesign in message view (#3389)
khushal87 Feb 11, 2026
6527a90
feat: poll ui in message view (#3392)
khushal87 Feb 11, 2026
28742f5
feat: attachment picker rework (#3391)
isekovanic Feb 11, 2026
d3c5777
fix: SampleApp ios build
isekovanic Feb 11, 2026
e61c05c
feat: native image picker rework (#3398)
isekovanic Feb 12, 2026
c960977
chore: disable enforcing unique reactions on SampleApp
isekovanic Feb 12, 2026
c69e9a5
feat: message view gallery redesign (#3396)
khushal87 Feb 13, 2026
8a50c67
fix: poll colors in the message view
khushal87 Feb 13, 2026
b97854f
feat: context menu new design (#3400)
isekovanic Feb 13, 2026
e70f245
fix: swipe to reply icon infinite height issue
isekovanic Feb 13, 2026
ff8da27
perf: create animated list instead of using reanimated primitive
isekovanic Feb 15, 2026
9ca1212
fix: deleted message padding
isekovanic Feb 16, 2026
272f257
feat: add message view replies, footer, avatar, content redesign (#3401)
khushal87 Feb 17, 2026
f1c7561
feat: reaction details menu (#3402)
isekovanic Feb 17, 2026
99beb11
fix: message status icon height and width issue (#3406)
khushal87 Feb 18, 2026
f49dffe
feat: use server defaults for querying channels V9 (#3404)
isekovanic Feb 18, 2026
682bbf6
perf: list updates regressions and animated optimization (#3409)
isekovanic Feb 18, 2026
c39e723
feat: create poll re-design (#3405)
khushal87 Feb 19, 2026
fad1b36
fix: message content padding for giphy or imgur attachments (#3412)
khushal87 Feb 19, 2026
6cc2fc6
fix: ctx menu positioning on resizable viewport (#3411)
isekovanic Feb 19, 2026
7b5e12b
fix: extra emoji bottom sheet sizes on android
isekovanic Feb 19, 2026
cbea0ee
feat: create poll option dynamic height implementation (#3410)
isekovanic Feb 19, 2026
536a64c
fix: output buttons display on the message composer (#3415)
khushal87 Feb 19, 2026
3e43a2f
fix: attachment preview list fixes (#3416)
isekovanic Feb 19, 2026
6d550d4
fix: temporarily bring back limits
isekovanic Feb 19, 2026
0ffbc66
fix: portal content disappearing when mounted and relayouted (#3417)
isekovanic Feb 22, 2026
153e871
fix: infinite loading on empty MessageList (#3420)
isekovanic Feb 23, 2026
c9ca3af
feat: channel list redesign (#3418)
khushal87 Feb 24, 2026
31ab165
fix: channel preview in sample app
khushal87 Feb 24, 2026
f3700d2
fix: message view fontSize
isekovanic Feb 24, 2026
bafb19a
fix: thread messages breaking pagination (#3422)
isekovanic Feb 24, 2026
a6f5d9a
fix: suggestions pagination (#3423)
isekovanic Feb 24, 2026
565601d
fix: channel list redesign fixes (#3425)
khushal87 Feb 24, 2026
19dff83
feat: reaction list bottom redesign (#3424)
khushal87 Feb 25, 2026
1f8b90d
fix: dark mode improvements (#3426)
isekovanic Feb 25, 2026
5c473d3
feat: reaction list top redesign (#3428)
khushal87 Feb 25, 2026
2a51aa3
fix: spacing between message in MessageList (#3429)
khushal87 Feb 25, 2026
4ff7714
fix: audio recording race condition (#3430)
isekovanic Feb 25, 2026
463845b
fix: seeking in voice recording regression
isekovanic Feb 25, 2026
6a2e96d
feat: implement suggestions list (#3431)
isekovanic Feb 26, 2026
2f570e1
fix: gallery layout issue (#3432)
khushal87 Feb 26, 2026
621398d
feat: poll screens redesign (#3435)
isekovanic Feb 26, 2026
065306c
feat: typing indicator (#3436)
isekovanic Feb 27, 2026
ee63c40
feat: message headers redesign (#3437)
khushal87 Feb 27, 2026
3914be6
fix: message issues with alignment and styles (#3439)
khushal87 Feb 27, 2026
0767c6d
feat: message swipe content redesign
khushal87 Feb 27, 2026
afff5b7
fix: sample app bugs
khushal87 Mar 1, 2026
b1e4423
feat: thread list redesign (#3442)
khushal87 Mar 3, 2026
cdfdd36
fix: refactor icons in the SDK (#3444)
khushal87 Mar 3, 2026
e63d748
fix: refactor icons in the SDK (#3445)
khushal87 Mar 3, 2026
efc9512
fix: sample apps crash
khushal87 Mar 3, 2026
7835c8a
feat: channel details and info (#3443)
isekovanic Mar 3, 2026
f11ce3e
fix: badge ui bug
khushal87 Mar 4, 2026
01f7b80
feat: long message ctx menu (#3451)
isekovanic Mar 4, 2026
b5bdc8b
fix: icons and deprecated colors (#3452)
isekovanic Mar 4, 2026
88a7f21
fix: thread and channel mirror navigation (#3453)
isekovanic Mar 4, 2026
4b07a3d
feat: consolidate message actions (#3454)
isekovanic Mar 4, 2026
76a5b1a
fix: show message status for the thread messages
khushal87 Mar 5, 2026
db0f4b2
feat: thread footer component redesign (#3457)
khushal87 Mar 5, 2026
e748fd0
feat: image gallery redesign (#3450)
khushal87 Mar 5, 2026
08b561d
feat: inline unread separator and notification redesign (#3456)
khushal87 Mar 5, 2026
9324ba6
feat: teleporting aware views (#3459)
isekovanic Mar 5, 2026
3d03fc5
feat: file icon preview redesign (#3458)
khushal87 Mar 5, 2026
e945a7f
feat: custom context menu background (#3460)
isekovanic Mar 6, 2026
adec29f
fix: client side notification for offline uploads
khushal87 Mar 6, 2026
a5bda49
fix: show message overlay for gallery and files when message errors o…
khushal87 Mar 6, 2026
77d66cf
fix: badge count positioning wrt to other elements in parent (#3465)
khushal87 Mar 6, 2026
ba4bff0
fix: try to fit message as far as possible (#3466)
isekovanic Mar 7, 2026
e64ddb7
fix: url preview video play icon center
khushal87 Mar 9, 2026
543f74d
fix: composer UI regressions (#3468)
isekovanic Mar 9, 2026
239a6be
fix: scroll to bottom padding issue and upgrade stream-chat (#3470)
khushal87 Mar 10, 2026
f28a769
feat: native shimmer and image loading redesign (#3467)
isekovanic Mar 10, 2026
06b9eed
fix: PortalWhileClosingView relayouting (#3471)
isekovanic Mar 10, 2026
b0a5125
feat: improve reaction list in message customization (#3473)
khushal87 Mar 11, 2026
01b7394
feat: introduce stack behaviour for message overlay (#3474)
isekovanic Mar 11, 2026
7a3c572
feat: attachment customization and handle unsupported attachments (#3…
khushal87 Mar 12, 2026
3298ca3
fix: emitter for URLPreview components
khushal87 Mar 12, 2026
20dac14
feat: add message input components customization (#3478)
khushal87 Mar 12, 2026
5f83ae5
feat: skeletons as components (#3479)
isekovanic Mar 12, 2026
001756f
fix: deletion not working for stopped recording (#3480)
isekovanic Mar 12, 2026
90975ab
fix: thread list customization and remove unused attachment picker co…
khushal87 Mar 12, 2026
458c24c
fix: variety UI bugs and expo app (#3482)
isekovanic Mar 13, 2026
46aaec7
fix: poll redesign UI fixes (#3483)
isekovanic Mar 14, 2026
c2bc36d
fix: general redesign UI fixes (#3487)
isekovanic Mar 15, 2026
ffe10c7
fix: export relevant hooks from channel preview and channellist and m…
khushal87 Mar 16, 2026
53a9393
fix: remove group avatar component from sdk
khushal87 Mar 16, 2026
9496b8b
feat: input redesign structure (#3489)
isekovanic Mar 16, 2026
87a5f11
fix: add Expo 55 compatibility (#3490)
isekovanic Mar 16, 2026
dd234db
fix: missing mime types (#3491)
isekovanic Mar 16, 2026
022fbd8
fix: thread resetting after reconnection (#3492)
isekovanic Mar 17, 2026
69f630d
feat: implement breaking design tokens (#3493)
isekovanic Mar 17, 2026
8b55d62
fix: make Fastfile more robust
isekovanic Mar 17, 2026
b935bbe
feat: replace colors from theme with semantics (#3494)
khushal87 Mar 18, 2026
19a3077
fix: poll input dialog redesign (#3495)
isekovanic Mar 18, 2026
912dd06
fix: fastlane issues
isekovanic Mar 19, 2026
5715cc3
fix: new direct messaging
isekovanic Mar 19, 2026
afeaffb
fix: ThreadListItem presence
isekovanic Mar 19, 2026
fda2103
fix: styles of url preview compact and unsupported attachment
khushal87 Mar 19, 2026
cfce800
fix: audio attachment upload preview width on message input
khushal87 Mar 20, 2026
adf457d
fix: audio recording designs (#3498)
isekovanic Mar 20, 2026
6969c7c
fix: floating composer padding
isekovanic Mar 20, 2026
f816af3
chore: re-enable beta versioning on develop (#3500)
isekovanic Mar 20, 2026
868d455
feat: trigger v9 beta
isekovanic Mar 20, 2026
843ebc8
fix: remove dry run
isekovanic Mar 20, 2026
1ff30ca
fix: move away from self-hosted runner for release process
isekovanic Mar 20, 2026
bcf6866
feat: component renaming (#3502)
isekovanic Mar 22, 2026
6cf66dd
feat: move swipability to full row (#3503)
isekovanic Mar 22, 2026
72bd39f
feat: add channel info screen to the sample app (#3499)
khushal87 Mar 22, 2026
5feeccb
feat: allow message overlay anchoring (#3504)
isekovanic Mar 22, 2026
3300425
fix: flashlist fixes (#3505)
isekovanic Mar 22, 2026
19dcc2f
fix: variety bugfixes and renaming (#3506)
isekovanic Mar 23, 2026
1495d0d
fix: ui redesign bugs (#3507)
isekovanic Mar 23, 2026
2f42d10
fix: poll screen design fixes (#3508)
isekovanic Mar 23, 2026
4f0e2f8
fix: require cycles from redesign (#3509)
isekovanic Mar 23, 2026
7992186
fix: remove exif metadata preservation (#3511)
isekovanic Mar 25, 2026
efb686c
fix: translated into viewport PortalWhileClosingView (#3512)
isekovanic Mar 25, 2026
6c2e98e
fix: audio recordings fixes and performance improvements (#3514)
isekovanic Mar 25, 2026
dd94992
fix: addressing QA redesign remarks (#3515)
isekovanic Mar 26, 2026
9bbd89c
chore: icon migration (#3521)
isekovanic Mar 30, 2026
13944da
feat: introduce rudimentary RTL support to the RN SDK (#3522)
isekovanic Mar 31, 2026
76a6e6b
feat: on the fly thumbnail generation (#3523)
isekovanic Apr 1, 2026
43968ab
fix: turbomodules breaking android x86 (#3526)
isekovanic Apr 2, 2026
8d63792
feat: update message optimistic updates (#3528)
isekovanic Apr 2, 2026
97cf72f
fix: ui redesign bugs (#3529)
isekovanic Apr 3, 2026
d4ca94a
fix: change runners to gh hosted ones
isekovanic Apr 3, 2026
e261d00
fix: design token and icon changes (#3530)
isekovanic Apr 3, 2026
a49d3a8
fix: KCV onLayout issue (#3531)
isekovanic Apr 3, 2026
fdb3e56
fix: reanimated 4.3.0 support and bugfixes (#3532)
isekovanic Apr 5, 2026
2cd2aa7
fix: reset issue on cached size of ctx menu items
isekovanic Apr 5, 2026
7f78b39
chore: add CLAUDE.md for Claude Code guidance (#3533)
oliverlaz Apr 6, 2026
a1f9d5b
fix: channel list stale latest messages (#3535)
isekovanic Apr 6, 2026
4a66852
perf: improve animation performance (#3536)
isekovanic Apr 6, 2026
369c785
fix: animation stutter on edit (#3537)
isekovanic Apr 7, 2026
5cdf7bc
fix: send-message pending task race condition (#3538)
isekovanic Apr 7, 2026
db99dc7
fix: android attachment picker timing coordination (#3539)
isekovanic Apr 8, 2026
d28257f
fix: unicode replacement string android crash (#3540)
isekovanic Apr 8, 2026
fdbfd73
perf: improve keyboard interaction timing (#3541)
isekovanic Apr 8, 2026
66ee8e4
fix: design qa bugfixes (#3543)
isekovanic Apr 9, 2026
7a7f927
feat: bottom sheet dynamic resizing (#3544)
isekovanic Apr 9, 2026
90e1610
fix: rn 0.85 compatibility (#3545)
isekovanic Apr 9, 2026
439be22
perf: message overlay animations (#3548)
isekovanic Apr 14, 2026
482b782
fix: RTL mode fixes (#3546)
szuperaz Apr 14, 2026
15dd5e1
refactor: introduce WithComponents context provider (#3542)
oliverlaz Apr 14, 2026
ea8ad75
fix: component context issues (#3549)
isekovanic Apr 15, 2026
f6a9177
chore: major version bumps (#3550)
isekovanic Apr 15, 2026
a69a7e7
chore: bump rn video to >=6.18.0
isekovanic Apr 15, 2026
4f4f623
fix: channel list background color
isekovanic Apr 15, 2026
a9c64d9
fix: remove dead files (#3516)
isekovanic Apr 15, 2026
96b3cd3
fix: clean up ComponentOverrides types to not leak displayName (#3551)
oliverlaz Apr 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 0 additions & 5 deletions .github/actions/install-and-build-sdk/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,6 @@ runs:
cd package/native-package/
yarn
shell: bash
- name: Install & Build the Expo Package
run: |
cd package/expo-package/
yarn
shell: bash
- name: Install & Build the Sample App
working-directory: examples/SampleApp
run: yarn
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/changelog-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: Install Linux build tools
run: sudo apt-get update && sudo apt-get install -y build-essential
- uses: actions/checkout@v2
with:
ref: develop
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/check-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: Install Linux build tools
run: sudo apt-get update && sudo apt-get install -y build-essential
- name: Install && Build - SDK and Sample App
uses: ./.github/actions/install-and-build-sdk
- name: Lint
Expand Down
12 changes: 7 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ on:
- develop

permissions:
id-token: write # for OIDC / npm provenance if you use it
actions: write # if you dispatch other workflows
contents: write # commits / tags / merge-back
id-token: write # for OIDC / npm provenance if you use it
actions: write # if you dispatch other workflows
contents: write # commits / tags / merge-back

jobs:
publish:
Expand All @@ -21,7 +21,7 @@ jobs:
steps:
- uses: actions/checkout@v2
with:
fetch-depth: "0"
fetch-depth: '0'

- name: Fetch tags
run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*
Expand All @@ -30,7 +30,9 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
registry-url: "https://registry.npmjs.org"
registry-url: 'https://registry.npmjs.org'
- name: Install Linux build tools
run: sudo apt-get update && sudo apt-get install -y build-essential

- name: Prepare git
run: |
Expand Down
41 changes: 16 additions & 25 deletions .github/workflows/sample-distribution.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
runs-on: [macos-15]
strategy:
matrix:
node-version: [ 24.x ]
node-version: [24.x]
steps:
- name: Connect Bot
uses: webfactory/ssh-agent@v0.7.0
Expand All @@ -30,7 +30,7 @@ jobs:
- uses: actions/checkout@v3
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '16.4.0' # Update as needed
xcode-version: '26.2' # Update as needed
- uses: ./.github/actions/ruby-cache
- name: Install && Build - SDK and Sample App
uses: ./.github/actions/install-and-build-sdk
Expand All @@ -51,49 +51,40 @@ jobs:
bundle exec pod install
- name: Build and release Testflight QA
working-directory: examples/SampleApp
run: bundle exec fastlane deploy_to_testflight_qa deploy:${{ github.ref == 'refs/heads/develop' }};
run: bundle exec fastlane ios deploy_to_testflight_qa deploy:${{ github.ref == 'refs/heads/develop' }};
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }}
APPSTORE_API_KEY: ${{ secrets.APPSTORE_API_KEY }}

build_and_deploy_android_s3:
build_and_deploy_android_firebase:
name: Build SampleApp Android and Deploy-${{ github.ref == 'refs/heads/develop' }}
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [ 24.x ]
node-version: [24.x]
steps:
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- uses: actions/checkout@v2
- name: Install Linux build tools
run: sudo apt-get update && sudo apt-get install -y build-essential
- uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: '17'
check-latest: true
- name: Setup Android SDK
uses: amyu/setup-android@v5

- uses: ./.github/actions/ruby-cache
- name: Install && Build - SDK and Sample App
uses: ./.github/actions/install-and-build-sdk
- name: Build
- name: Build and deploy Android Firebase
working-directory: examples/SampleApp
run: |
mkdir android/app/src/main/assets
mkdir tmp
yarn react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest tmp
cd android
rm -rf $HOME/.gradle/caches/ && ./gradlew assembleRelease
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
if: ${{ github.ref == 'refs/heads/develop' }}
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Upload APK
if: ${{ github.ref == 'refs/heads/develop' }}
# https://getstream.io/downloads/rn-sample-app.apk
run: |
cp examples/SampleApp/android/app/build/outputs/apk/release/app-release.apk rn-sample-app.apk
aws s3 cp rn-sample-app.apk s3://${{ secrets.AWS_S3_BUCKET }} --sse AES256
run: bundle exec fastlane android firebase_build_and_upload deploy:${{ github.ref == 'refs/heads/develop' }};
env:
ANDROID_FIREBASE_APP_ID: ${{ secrets.ANDROID_FIREBASE_APP_ID }}
FIREBASE_CREDENTIALS_JSON: ${{ secrets.FIREBASE_CREDENTIALS_JSON }}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,4 @@ index.android.bundle
*.app
*.DSYM.zip
**/metrics/
package/shared-native/.sync-state/
156 changes: 156 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Repository Overview

Stream Chat React Native SDK monorepo. The main SDK code lives in `package/` (published as `stream-chat-react-native-core`). Built on top of the `stream-chat` JS client library.

## Common Commands

All commands below run from the repo root unless noted otherwise.

### Build

```bash
yarn build # Build all packages (runs in package/)
cd package && yarn build # Build SDK directly
```

### Lint & Format

```bash
cd package && yarn lint # Check prettier + eslint + translation validation (max-warnings 0)
cd package && yarn lint-fix # Auto-fix lint and formatting issues
```

### Test

```bash
cd package && yarn test:unit # Run all unit tests (sets TZ=UTC)
cd package && yarn test:coverage # Run with coverage report
cd package && TZ=UTC npx jest path/to/test.test.tsx # Run a single test file
```

Tests use Jest with `react-native` preset and `@testing-library/react-native`. Test files live alongside source at `src/**/__tests__/*.test.ts(x)`. Mock builders are in `src/mock-builders/`.

To run a single test, you can also temporarily add the file path to the `testRegex` array in `package/jest.config.js`.

### Install

```bash
yarn install --frozen-lockfile # Root dependencies
cd package && yarn install-all # SDK + native-package + expo-package
```

### Sample App

```bash
cd examples/SampleApp && yarn install
cd examples/SampleApp && yarn start # Metro bundler
cd examples/SampleApp && yarn ios # Run iOS
cd examples/SampleApp && yarn android # Run Android
```

## Architecture

### Package Structure

- `package/` — Main SDK (`stream-chat-react-native-core`)
- `package/native-package/` — React Native native module wrappers
- `package/expo-package/` — Expo-compatible wrapper
- `examples/SampleApp/` — Full sample app with navigation
- `release/` — Semantic release scripts

### SDK Source (`package/src/`)

**Component hierarchy**: `<Chat>` → `<Channel>` → `<MessageList>` / `<MessageInput>` / `<Thread>`

- `components/` — UI components (~28 major ones: ChannelList, MessageList, MessageInput, Thread, Poll, ImageGallery, etc.)
- `contexts/` — React Context providers (~33 contexts). The primary way components receive state and callbacks. Key contexts: `ChatContext`, `ChannelContext`, `MessagesContext`, `ThemeContext`, `TranslationContext`
- `hooks/` — Custom hooks (~27+). Access contexts via `useChannelContext()`, `useMessageContext()`, etc.
- `state-store/` — Client-side state stores using `useSyncExternalStore` with selector pattern (audio player, image gallery, message overlay, etc.)
- `store/` — Offline SQLite persistence layer. `OfflineDB` class with mappers for channels, messages, reactions, members, drafts, reminders. Schema in `store/schema.ts`
- `theme/` — Deep theming system (colors, typography, spacing, per-component overrides) via `ThemeContext`
- `i18n/` — Internationalization with i18next (14 languages). `Streami18n` wrapper class
- `middlewares/` — Command UI middlewares (attachments, emoji)
- `icons/` — SVG icon components

### Key Patterns

**Component override pattern**: Nearly every UI element is replaceable via props. Parent components (e.g., `Channel`) accept 50+ `React.ComponentType` props for sub-components (`Message`, `MessageContent`, `DateHeader`, `TypingIndicator`, etc.). These props are forwarded into Context providers so deeply nested children can access them without prop drilling.

**Context three-layer pattern**: Each context follows the same structure:

1. `createContext()` with a sentinel default value (`DEFAULT_BASE_CONTEXT_VALUE`)
2. A `<XProvider>` wrapper component
3. A `useXContext()` hook that throws if used outside the provider (suppressed in test env via `isTestEnvironment()`)

Context values are assembled in dedicated `useCreateXContext()` hooks (e.g., `useCreateChannelContext`) that carefully memoize with selective dependencies to avoid unnecessary re-renders.

**Native module abstraction**: `native.ts` defines TypeScript interfaces for all platform-specific capabilities (image picking, compression, haptics, audio/video, clipboard). Implementations are injected at runtime via `registerNativeHandlers()` — `stream-chat-expo` provides Expo implementations, `stream-chat-react-native` provides bare RN ones. Calling an unregistered handler throws with a message to import the right package.

**State stores**: `useSyncExternalStore`-based stores in `state-store/` with `useStateStore(store, selector)` for fine-grained subscriptions outside the context system.

**Memoization**: Components use `React.memo()` with custom `areEqual` comparators (not HOCs) to prevent re-renders.

**Offline-first**: SQLite-backed persistence with sync status tracking and pending task management.

**Builder-bob builds**: Outputs CommonJS (`lib/commonjs`), ESM (`lib/module`), and TypeScript declarations (`lib/typescript`).

### Testing Patterns

Tests use `renderHook()` and `render()` from `@testing-library/react-native`. Components/hooks must be wrapped in the required provider stack (e.g., `Chat` → `Channel` → feature provider).

**Mock builders** (`src/mock-builders/`):

- `api/initiateClientWithChannels.js` — creates a test client + channels in one call
- `generator/` — factories: `generateMessage()`, `generateChannel()`, `generateUser()`, `generateMember()`, `generateStaticMessage(seed)` (deterministic via UUID v5)
- `attachments.js` — `generateImageAttachment()`, `generateFileAttachment()`, `generateAudioAttachment()`

Reanimated and native modules are mocked via Proxy patterns in test setup files.

### Theme System

Themes follow a three-tier token architecture: **Primitives** (raw colors) → **Semantics** (e.g., `colors.error.primary`) → **Components** (per-component overrides). Token references use `$key` string syntax (e.g., `"$blue500"`) and are resolved via topological sort in `theme/topologicalResolution.ts`, so declaration order doesn't matter.

Platform-specific tokens are **generated** files in `src/theme/generated/{light,dark}/StreamTokens.{ios,android,web}.ts` — regenerate via `sync-theme.sh` if design tokens change; don't hand-edit.

Custom themes are passed as `style` prop to `<Chat>`. `mergeThemes()` deep-merges custom style over base theme (deep-cloned via `JSON.parse(JSON.stringify())`). Light/dark mode is auto-detected via `useColorScheme()`.

### Native / Expo Package Relationship

`native-package/` and `expo-package/` are thin wrappers around `stream-chat-react-native-core`. They:

1. Call `registerNativeHandlers()` with platform-specific implementations (native modules vs Expo APIs)
2. Export optional dependency wrappers (`Audio`, `Video`, `FlatList`) from `src/optionalDependencies/`
3. Re-export everything from core: `export * from 'stream-chat-react-native-core'`

Platform branching uses runtime `Platform.select()` / `Platform.OS` checks — there are no `.ios.ts` / `.android.ts` source file splits.

### Chat Component (Root Provider)

`<Chat client={client}>` is the entry point. It:

- Sets SDK metadata on the `stream-chat` client (identifier, device info)
- Disables the JS client's `recoverStateOnReconnect` (the SDK handles recovery itself)
- Registers subscriptions for threads, polls, and reminders (cleaned up on unmount)
- Initializes `OfflineDB` if `enableOfflineSupport` is true
- Wraps children in: `ChatProvider` → `TranslationProvider` → `ThemeProvider` → `ChannelsStateProvider`

### Offline DB

SQLite schema is in `store/schema.ts`. DB versioning uses `PRAGMA user_version` — a version mismatch triggers full DB reinit (no incremental migrations). Current version is tracked in `SqliteClient.dbVersion`.

### Translations

Translation JSON files live in `src/i18n/`. `validate-translations` (run as part of `yarn lint`) checks that no translation key has an empty string value. When adding/updating translations, run `yarn build-translations` (i18next-cli sync) to keep files in sync.

## Conventions

- **Conventional commits** enforced by commitlint: `feat:`, `fix:`, `docs:`, `refactor:`, etc.
- **ESLint 9 flat config** at `package/eslint.config.mjs`, strict (max-warnings 0)
- **Prettier**: single quotes, trailing commas, 100 char width (see `.prettierrc`)
- **TypeScript strict mode** with platform-specific module suffixes (`.ios`, `.android`, `.web`)
- Git branches: PRs target `develop`, `main` is production releases only
- **Shared native sync**: Run `yarn shared-native:sync` from `package/` after modifying shared native code to copy to native-package and expo-package
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
[![NPM](https://img.shields.io/npm/v/stream-chat-react-native.svg)](https://www.npmjs.com/package/stream-chat-react-native)
[![Build Status](https://github.com/GetStream/stream-chat-react-native/actions/workflows/release.yml/badge.svg)](https://github.com/GetStream/stream-chat-react-native/actions)
[![Component Reference](https://img.shields.io/badge/docs-component%20reference-blue.svg)](https://getstream.io/chat/docs/sdk/reactnative)
![JS Bundle Size](https://img.shields.io/badge/js_bundle_size-302%20KB-blue)
![JS Bundle Size](https://img.shields.io/badge/js_bundle_size-304%20KB-blue)

<img align="right" src="https://getstream.imgix.net/images/ios-chat-tutorial/iphone_chat_art@3x.png?auto=format,enhance" width="50%" />

Expand Down
17 changes: 12 additions & 5 deletions examples/ExpoMessaging/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@
"experiments": {
"reactCompiler": true
},
"assetBundlePatterns": ["**/*"],
"assetBundlePatterns": [
"**/*"
],
"ios": {
"supportsTablet": true,
"usesIcloudStorage": true,
Expand Down Expand Up @@ -86,16 +88,21 @@
"expo-build-properties",
{
"android": {
"extraMavenRepos": ["$rootDir/../../../node_modules/@notifee/react-native/android/libs"]
"extraMavenRepos": [
"$rootDir/../../../node_modules/@notifee/react-native/android/libs"
]
},
"ios": {
"useFrameworks": "static",
"forceStaticLinking": ["RNFBApp", "RNFBMessaging"]
"forceStaticLinking": [
"RNFBApp",
"RNFBMessaging"
]
}
}
],
"./plugins/keyboardInsetMainActivityListener.js",
"./plugins/opSqliteSwiftPlugin.js"
"./plugins/opSqliteSwiftPlugin.js",
"expo-sharing"
]
}
}
Loading
Loading