Skip to content

Commit 210ff93

Browse files
xsahil03xrenefloorCopilotBrazol
authored
feat(repo)!: design refresh (#2503)
* feat(repo): flutter 3.38.1 (#2495) * refactor(ui)!: redesign Avatar components (#2502) * feat(ui): add new avatar components * refactor(ui)!: Redesign Avatar components This commit introduces a complete redesign of the Avatar components to simplify the API, improve consistency, and align with the new design system. The following components have been removed and replaced: - `StreamUserAvatar` - `StreamGroupAvatar` - `StreamChannelAvatar` They are replaced by a new suite of components: - `StreamUserAvatar`: Displays a single user's avatar. - `StreamUserAvatarGroup`: Displays a grid of user avatars for group channels. - `StreamUserAvatarStack`: A new component for displaying a stack of overlapping user avatars. - `StreamChannelAvatar`: Rebuilt to internally use the new avatar components. Key changes: - **Simplified Sizing**: The `constraints` parameter has been replaced with a `size` enum (e.g., `StreamAvatarSize.lg`) for standardized sizing. - **Tap Handling**: The `onTap` callback has been removed. Avatars should now be wrapped with a `GestureDetector` or `InkWell` for handling interactions. - **Parameter Cleanup**: Parameters like `borderRadius`, `selected`, `selectionColor`, and `selectionThickness` have been removed to simplify the API. Customization is now handled through theming. - **Online Indicator**: The `showOnlineStatus` parameter has been renamed to `showOnlineIndicator`. Its default is now `true` for `StreamUserAvatar` and `false` for avatars inside groups or stacks. - **`StreamGroupAvatar` is now `StreamUserAvatarGroup`**: The component has been renamed and now accepts a list of `User` objects instead of `Member` objects. - **Migration Guide**: A detailed migration guide for the new avatar components has been added under `migrations/redesign/stream_avatar.md`. - **Theming**: Integrated the new `StreamTheme` extension from `stream_core_flutter` for better theme management. * feat: Use git version for stream_core_flutter This commit updates the `stream_core_flutter` dependency to use a version from a git repository. Specifically, it points to the `feat/avatar-group-and-badge-count` branch of the `GetStream/stream-core-flutter` repository. * chore: skip smudge on CI Temporarily skip LFS smudge process on CI workflows to work around an issue with a dependency. * docs: update user avatar group/stack doc comments * chore: Update Goldens * fix: set user avatar size in thread list tile * chore: Update Goldens * docs: add theming guide for redesigned components The migration guide for the redesigned UI components is updated to include a new "Theming" section. This section explains how to use `StreamTheme` to customize the appearance of the new components, providing code examples for both light and dark modes. It also adds a "Need Help?" section directing users to open a GitHub issue if they encounter problems. * chore: pin stream_core_flutter dependency to a specific commit * feat: Sort users to show current user first In the `StreamChannelAvatar` widget, the list of members is now sorted to prioritize the current user. This ensures that in a `StreamUserAvatarGroup`, the current user's avatar is shown first when available. * chore: prevent publishing of stream_core_flutter until available on pub.dev * chore: update stream_core_flutter dependency The `stream_core_flutter` git dependency reference has been updated to `c066cb481bd8a8523e5ea52f3433ffeaeab11332` in `packages/stream_chat_flutter/pubspec.yaml`. * chore: remove GIT_LFS_SKIP_SMUDGE from workflows Removes the `GIT_LFS_SKIP_SMUDGE` environment variable and associated TODO comments from GitHub Actions workflows (`stream_flutter_workflow`, `beta_version_analyze`, `update_goldens`, `distribute_internal`, and `release_publish`). This workaround is no longer required. --------- Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com> * update project files for latest flutter version (#2507) * add internal testflight builds (#2508) * feat(ui): message composer design update (#2505) * Adding new message composer * basic implementation message composer * Added focus node * Add placeholder * update core dependency * formatting * chore: Update Goldens --------- Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> * chore(ui): update goldens (#2515) * chore: Update Goldens * fix analysis warning --------- Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> * refactor(ui)!: update design for context menu and message action (#2517) * feat(UI): composer attachments (#2514) * Add quoted message and basic attachment picker * fix incoming/outgoing style * Add basic og Attachments * improve legacy attachment list * Fix client state in test * Add documentation * skip input tests for now * bug fix on inputfield * chore: Update Goldens * use new MessageComposerAttachmentLinkPreview # Conflicts: # melos.yaml # packages/stream_chat_flutter/pubspec.yaml * improve attachments in the composer * Start with support for all attachments * added option for recording in composer * working voice recording feature * minor improvements in voice attachments * code cleanup * don't use list for file attachment * chore: Update Goldens * Fix composer attachment tests * Make trailing button stateless * renamings from core * remove default value * remove unused import * chore: Update Goldens --------- Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> * add initial claude file (#2523) * add initial claude file * update format check Co-authored-by: Sahil Kumar <xdsahil@gmail.com> * improve note on local dependency --------- Co-authored-by: Sahil Kumar <xdsahil@gmail.com> * feat(ui): audio attachments in composer (#2518) * Improved voice recording UI * separate voice recordings in default attachments * Simplify theming * Improve structure of message composer * remove default background color * add stream theme with brightness in test * chore: Update Goldens * fix 2 outdated tests * update theme properties in tests --------- Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> * feat(ui)!: redesign reaction components and introduce `ReactionIconResolver` (#2521) Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com> * feat(ui): update icons (#2519) * Deprecate old icons and add list of replacements * migrated icons in the sdk * chore: Update Goldens * remove unused import * chore: Update Goldens --------- Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> * don't use source files in tests (#2524) * Migrate message composer factories (#2525) * Migrate message composer factories * temporarily disabled flutter cache on workflows * Improve on builder factory * remove unused import * feat(ui): channel list item (#2522) * update avatars * Use channel list item in sdk * improve muted state * improve channel avatars * change to git dependency * chore: Update Goldens * Update channel name and list tile * chore: Update Goldens * remove unused properties * revert change on location marker * rename listitem and move items from core * Add factory builder * move props construction * update theming * Add migration docs * Fix analysis issues * Simplify the builder extensions * Fix test --------- Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> * feat(ui): edit message (#2526) * started edit message * Added unit tests * change isEnabled state * fix git ref * fix analysis and format issue * feat(ui): inline attachment picker (#2527) * make inline attachment picker # Conflicts: # packages/stream_chat_flutter/lib/src/components/message_composer/stream_chat_message_composer.dart # packages/stream_chat_flutter/lib/src/message_input/attachment_picker/stream_attachment_picker.dart * start with new UI * Improve layout of gallery picker * hide picker when keyboard is visible * Improve on minimal spacing in message composer * update tests * remove unused variable * feat(ui): minor ui updates (#2528) * Update channel and messageview header * Fix thread list header * minor fixes * chore: Update Goldens * update bottom nav in sample app --------- Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> * feat(ui): redesign image CDN handling and thumbnail resizing (#2531) Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> fix incorrect `stableCacheKey` String extension reference in image CDN migration guide (#2532) * feat(llc, ui, core): introduce `StreamReactionListController` and `StreamReactionListView` for paginated reactions (#2533) Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com> * multiple message list improvements (#2530) * multiple message list improvements * update date divider * update scrolledUnderElevation of channellist * feat(ui): enhance file and media pickers with improved layout and styling * feat(ui): update poll creation button label and styling for improved clarity * feat(poll): return result from onPollCreated callback for better handling * feat(ui): improve message input with DM checkbox and refined attachment picker logic * feat(sample): implement swipe-to-reply functionality for messages with visual feedback * feat(ui): enhance message composer with improved title and subtitle rendering * feat(ui): refine button sizes and colors for improved UI consistency * feat(ui): refine button sizes and colors for improved UI consistency * feat(llc): standardize connect and receive timeout values using constants * fix analysis issues * fix unit test * chore: Update Goldens --------- Co-authored-by: Sahil Kumar <sahil@getstream.io> Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> * feat(ui): composer also send to channel (#2537) * Improve layout for 'send as dm' * Remove unused imports * remove use of default color * Changed hideSendAsDm in canAlsoSendToChannelFromThread * fix typo * fix autocomplete tap actions (#2540) * fix(ui): fix keystroke reporting (#2545) * fix keystroke reporting * tweak * introduced throttle to keystroke * fixes * search bar design (#2539) * feat(ui): preview formatter redesigned (#2542) * preview formatter redesigned * improved poll preview * draft message preview * translations change * core bump * melos fix * tests fix * chore: Update Goldens --------- Co-authored-by: Brazol <5622717+Brazol@users.noreply.github.com> * fix(ui): updated unread indicator to use core badge widget (#2546) Co-authored-by: Brazol <5622717+Brazol@users.noreply.github.com> * refactor(ui)!: stream message widget and reactions (#2547) * refactor(ui)!: redesign StreamMessageWidget with composable sub-components Replace the monolithic message widget implementation with a composable architecture using dedicated sub-components (StreamMessageHeader, StreamMessageFooter, StreamMessageLeading, StreamMessageContent, StreamMessageText, StreamMessageReactions, StreamMessageDeleted, StreamMessageSendingStatus). Introduce StreamMessageWidgetProps to encapsulate all configurable properties and a StreamMessageWidget.fromProps named constructor. Add nullable attachmentBuilders support on StreamMessageWidget, StreamMessageContent, and ParseAttachments, with a global fallback in StreamChatConfigurationData. Add configurable reactionType and reactionPosition to StreamChatConfigurationData (nullable, widget resolves defaults). Reaction overlap is now platform-aware (disabled on desktop/web). Remove legacy widgets: MessageWidgetContent, MessageCard, BottomRow, TextBubble, DeletedMessage, MessageText, Username, ThreadParticipants, ThreadPainter, UserAvatarTransform, SendingIndicatorBuilder, QuotedMessage, PinnedMessage, ReactionIndicator, ReactionBubbleOverlay, ReactionPickerBubbleOverlay, and MessageReactionsModal. BREAKING CHANGE: Removed several public message widget classes and the MessageReactionsModal. Consumers using these directly must migrate to the new composable sub-components or use StreamComponentFactory. * refactor(ui)!: rename `StreamReactionPicker` to `StreamMessageReactionPicker` and update related components * chore: merge fixes * chore: Update Goldens --------- Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com> * feat(UI): show command chip (#2541) Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> Co-authored-by: Sahil Kumar <sahil@getstream.io> * fix crossSmall to medium (#2551) * improvements on attachment in quote (#2538) * refactor(ui): unread indicator redesign (#2548) * unread indicator redesign * tweak * Add inline add more tile for gallery permissions (#2553) * Add inline add more tile for gallery permissions * Add unit test * minor improvements * update migration docs (#2555) * fix location sharing (#2556) * feat(ui): fix duration on video attachments (#2554) * fix duration on video attachments * update core reference * feat(UI): Instant commands improvements (#2550) * Add commands attachment option * merge command icons * improve layout command autocomplete * also update mentions autocomplete * formatting * fix autocomplete dispose issue * using icontheme to clean the code * also remove size from svg icon * add command picker type * feat(ui): skeleton loadings (#2552) * channel list skeleton * fix * skeletons * fix * fix * update ref * ref update * ref bump * bump again * fix command picker title --------- Co-authored-by: Rene Floor <rene.floor@getstream.io> * feat(ui): new spinner for next page loading (#2549) * new spinner for next page loading * fix * format * expose default buttons of composer (#2558) * expose default buttons of composer * formatting * fix a failing unit test (#2562) * fix a failing unit test * chore: Update Goldens --------- Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> * show edited footer always (#2565) * fix(ui): messages preview fixes + draft message fix (#2563) * messages preview fixes * changelog * feat(ui): empty states (#2557) * empty states * fix * format * chore: Update Goldens * test fix * fix --------- Co-authored-by: Brazol <5622717+Brazol@users.noreply.github.com> * don't start recording if we don't have permission (#2571) * fix mention tap (#2574) * highlight on tap (#2573) * thread arrow + translations (#2570) * feat(ui): factories for composer attachments (#2566) * factories for composer attachments * cleanup * improve on attachments * re-add missing features * Add docs * update migration doc * PR comment fixes * feat(ui): fading floating date divider (#2569) * fading floating date divider * tests fix * feat(ui): swipe to reply moved to sdk (#2567) * swipe to reply moved to sdk * reply left-to-right always * fix(ui): context menu alignment (#2568) * context menu alignment * fix * fix(ui): Multiple composer fixes (#2575) * Multiple composer fixes timestamp for video command button icon restore pre-edit message * chore: Update Goldens --------- Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> * dont start play after track seek (#2572) * allow multiple reactions in sample app (#2578) * fix jump to message if not in memory (#2577) * refactor(ui): redesign message attachments and poll components (#2576) * refactor(ui): redesign message attachments and poll components This commit introduces a significant redesign and refactoring of message attachments and poll interaction components to align with the new design system. * **Attachments**: * Refactored `StreamImageAttachment`, `StreamVideoAttachment`, `StreamFileAttachment`, `StreamGiphyAttachment`, and `StreamGalleryAttachment` to use a property-based component architecture with default implementations. * Introduced `StreamMessageAttachment` as a unified container for styling attachments. * Replaced `StreamUrlAttachment` with `StreamLinkPreviewAttachment`. * Switched from `CachedNetworkImage` to `StreamNetworkImage` from `stream_core_flutter`. * Updated attachment builders to simplify padding and shape management via the new theme system. * **Polls**: * Redesigned `StreamPollInteractor` and its sub-components (`PollHeader`, `PollOptionsListView`, `PollFooter`). * Updated poll styling to use design tokens for typography, spacing, and colors. * Integrated `StreamButton`, `StreamCheckbox`, and `StreamProgressBar` into the poll UI. * Refactored poll theming into `StreamPollInteractorThemeData` and `StreamPollOptionStyle`. * **Voice Recordings**: * Redesigned `StreamVoiceRecordingAttachment` with updated playback controls and waveform visualization. * Improved `StreamVoiceRecordingAttachmentPlaylist` with a new `itemDecorator` for better layout control in the message composer and list. * Migrated playback speed management to use `StreamPlaybackSpeed` and `StreamPlaybackSpeedToggle`. * **Theming & Layout**: * Renamed `StreamMessagePlacement` to `StreamMessageLayout`. * Introduced `StreamMessageLayoutData` to manage stack position, alignment, and content-aware layout kinds (e.g., `emojiOnly`, `singleAttachment`). * Updated `MessageWidget` to use `maxWidth` (default 264px) instead of `widthFactor`. * Added generated theme extensions for `StreamVoiceRecordingAttachmentThemeData` and `StreamPollInteractorThemeData`. * **Chore**: * Updated dependencies in `pubspec.yaml` and `melos.yaml`. * Updated Golden tests to reflect UI changes. * refactor(ui): rename `UrlAttachment` to `LinkPreviewAttachment` * Rename `UrlAttachment` to `LinkPreviewAttachment` for better clarity. * Rename `UrlAttachmentBuilder` to `LinkPreviewAttachmentBuilder`. * Update internal references and exports to reflect the naming change. * docs: add migration guide for redesigned attachment components and polls * refactor(dependencies): switch `stream_core_flutter` to use git source * chore: Update Goldens * chore: fix analysis issue * chore: merge fixes * fix: add path_provider_foundation framework to project configuration * fix: fix tests * fix: update stream_core_flutter dependency reference * chore: Update Goldens * chore: fix lints * Apply suggestions from code review Co-authored-by: Rene Floor <r.floor.1@gmail.com> * update core library --------- Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com> Co-authored-by: Rene Floor <rene.floor@getstream.io> Co-authored-by: Rene Floor <r.floor.1@gmail.com> * Revert development team (#2579) * refactor(ui): appbar redesigned (#2560) * appbar redesigned * format fix * mention color fix * chore: Update Goldens * moved base app bar to core * fix(ui): ui and translation fixes (#2564) * ui and translation fixes * chore: Update Goldens * test fix --------- Co-authored-by: Brazol <5622717+Brazol@users.noreply.github.com> * core dep * removed old appbar --------- Co-authored-by: Brazol <5622717+Brazol@users.noreply.github.com> * refactor(ui): update `ReactionIconResolver` to return `StreamEmojiContent` instead of `Widget` (#2591) Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com> * feat(ui): update icon set (#2587) * icon updates * fix size of icons * update core dependency * chore: Update Goldens * temporarily limit connectivity_plus package * update core sdk * chore: Update Goldens --------- Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> * Add option to force RTL in sample app (#2592) * chore(repo): xcode update (#2593) * run with latest xcode * downgrade xcode version * improve if statement * use version 26.3 Co-authored-by: Rene Floor <r.floor.1@gmail.com> * fix(ui): hide message replies in thread view and other improvements (#2594) * trim composer (#2586) * minor rtl fixes (#2595) * fix(ui): hide mark as unread for own messages (#2590) * hide mark as unread for own messages * tweak + test * doc comment * fixes for deleted messagees (#2581) * navigation between channel and thread (#2580) * fix(ui): fix gallery actions (reply + show in chat) (#2584) * navigation between channel and thread * fix for gallery actions * feat(ui): add error badge for failed and bounced messages (#2597) Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com> * feat: thread list view (#2598) * thread list view * tabs title fix * icon size tweak * chore: Update Goldens * fix * tweak --------- Co-authored-by: Brazol <5622717+Brazol@users.noreply.github.com> * feat(ui): animate attachment picker + close on back press (#2588) * animate attachment picker * close picker on back press * new approach for the animation * fix(ui) channel + preview redesign issues fixed (#2600) * channel + preview issues fixed * format fix * fix * Some missing migrations (#2602) * feat(ui): update quoted message when edited/deleted (#2603) * update quoted message * handle edit also + tests * format * tests fixes * update stream_core_flutter version (#2604) --------- Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com> Co-authored-by: Rene Floor <rene.floor@getstream.io> Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Maciej Brażewicz <brazol@gmail.com> Co-authored-by: Brazol <5622717+Brazol@users.noreply.github.com> Co-authored-by: Maciej Brażewicz <maciej.brazewicz@getstream.io> Co-authored-by: Rene Floor <r.floor.1@gmail.com>
1 parent 6780dc3 commit 210ff93

943 files changed

Lines changed: 45885 additions & 43153 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/dependabot.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ updates:
2525
# All packages grouped into a single configuration using multi-directory support
2626
- package-ecosystem: "pub"
2727
directories:
28-
- "/sample_app"
2928
- "/packages/stream_chat"
3029
- "/packages/stream_chat_flutter_core"
3130
- "/packages/stream_chat_flutter"

.github/workflows/distribute_external.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ jobs:
7171
with:
7272
flutter-version: ${{ env.FLUTTER_VERSION }}
7373
channel: stable
74-
cache: true
7574
cache-key: flutter-:os:-:channel:-:version:-:arch:-:hash:-${{ hashFiles('**/pubspec.lock') }}
7675

7776
- name: Setup Ruby
@@ -103,13 +102,16 @@ jobs:
103102
uses: actions/checkout@v6
104103
with:
105104
fetch-depth: 0
105+
106+
- uses: maxim-lobanov/setup-xcode@v1
107+
with:
108+
xcode-version: '26.3'
106109

107110
- name: "Install Flutter"
108111
uses: subosito/flutter-action@v2
109112
with:
110113
flutter-version: ${{ env.FLUTTER_VERSION }}
111114
channel: stable
112-
cache: true
113115
cache-key: flutter-:os:-:channel:-:version:-:arch:-:hash:-${{ hashFiles('**/pubspec.lock') }}
114116

115117
- name: Setup Ruby

.github/workflows/distribute_internal.yml

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ jobs:
7575
with:
7676
flutter-version: ${{ env.FLUTTER_VERSION }}
7777
channel: stable
78-
cache: true
7978
cache-key: flutter-:os:-:channel:-:version:-:arch:-:hash:-${{ hashFiles('**/pubspec.lock') }}
8079

8180
- name: "Install Tools"
@@ -113,13 +112,16 @@ jobs:
113112
uses: actions/checkout@v6
114113
with:
115114
fetch-depth: 0
115+
116+
- uses: maxim-lobanov/setup-xcode@v1
117+
with:
118+
xcode-version: '26.3'
116119

117120
- name: "Install Flutter"
118121
uses: subosito/flutter-action@v2
119122
with:
120123
flutter-version: ${{ env.FLUTTER_VERSION }}
121124
channel: stable
122-
cache: true
123125
cache-key: flutter-:os:-:channel:-:version:-:arch:-:hash:-${{ hashFiles('**/pubspec.lock') }}
124126

125127
- name: "Install Tools"
@@ -144,3 +146,50 @@ jobs:
144146
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
145147
APPSTORE_API_KEY: ${{ secrets.APPSTORE_API_KEY }}
146148
run: bundle exec fastlane distribute_to_firebase
149+
150+
# TODO: Remove once feat/design-refresh is merged to master
151+
ios_testflight:
152+
needs: determine_platforms
153+
if: ${{ needs.determine_platforms.outputs.run_ios == 'true' }}
154+
runs-on: macos-15 # Requires xcode 15 or later
155+
timeout-minutes: 30
156+
steps:
157+
- name: Connect Bot
158+
uses: webfactory/ssh-agent@v0.9.1
159+
with:
160+
ssh-private-key: ${{ secrets.BOT_SSH_PRIVATE_KEY }}
161+
162+
- name: "Git Checkout"
163+
uses: actions/checkout@v6
164+
with:
165+
fetch-depth: 0
166+
167+
- uses: maxim-lobanov/setup-xcode@v1
168+
with:
169+
xcode-version: '26.3'
170+
171+
- name: "Install Flutter"
172+
uses: subosito/flutter-action@v2
173+
with:
174+
flutter-version: ${{ env.FLUTTER_VERSION }}
175+
channel: stable
176+
cache-key: flutter-:os:-:channel:-:version:-:arch:-:hash:-${{ hashFiles('**/pubspec.lock') }}
177+
178+
- name: "Install Tools"
179+
run: flutter pub global activate melos
180+
181+
- name: "Bootstrap Workspace"
182+
run: melos bootstrap
183+
184+
- name: Setup Ruby
185+
uses: ruby/setup-ruby@v1
186+
with:
187+
bundler-cache: true
188+
working-directory: sample_app/ios
189+
190+
- name: Distribute to TestFlight Internal
191+
working-directory: sample_app/ios
192+
env:
193+
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
194+
APPSTORE_API_KEY: ${{ secrets.APPSTORE_API_KEY }}
195+
run: bundle exec fastlane distribute_to_testflight_internal

.github/workflows/legacy_version_analyze.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name: legacy_version_analyze
33
env:
44
# Note: The versions below should be manually updated after a new stable
55
# version comes out.
6-
flutter_version: "3.27.4"
6+
flutter_version: "3.38.1"
77

88
on:
99
push:
@@ -44,7 +44,6 @@ jobs:
4444
with:
4545
flutter-version: ${{ env.flutter_version }}
4646
channel: stable
47-
cache: true
4847
cache-key: flutter-:os:-:channel:-:version:-:arch:-:hash:-${{ hashFiles('**/pubspec.lock') }}
4948

5049
- name: 📊 Analyze and test packages

.github/workflows/stream_flutter_workflow.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ jobs:
3838
with:
3939
flutter-version: ${{ env.flutter_version }}
4040
channel: stable
41-
cache: true
4241
cache-key: flutter-:os:-:channel:-:version:-:arch:-:hash:-${{ hashFiles('**/pubspec.lock') }}
4342
- name: "Install Tools"
4443
run: |
@@ -67,7 +66,6 @@ jobs:
6766
with:
6867
flutter-version: ${{ env.flutter_version }}
6968
channel: stable
70-
cache: true
7169
cache-key: flutter-:os:-:channel:-:version:-:arch:-:hash:-${{ hashFiles('**/pubspec.lock') }}
7270
- name: "Install Tools"
7371
run: |
@@ -94,7 +92,6 @@ jobs:
9492
with:
9593
flutter-version: ${{ env.flutter_version }}
9694
channel: stable
97-
cache: true
9895
cache-key: flutter-:os:-:channel:-:version:-:arch:-:hash:-${{ hashFiles('**/pubspec.lock') }}
9996
# This step is needed due to https://github.com/actions/runner-images/issues/11279
10097
- name: Install SQLite3
@@ -168,8 +165,11 @@ jobs:
168165
with:
169166
flutter-version: ${{ env.flutter_version }}
170167
channel: stable
171-
cache: true
172168
cache-key: flutter-:os:-:channel:-:version:-:arch:-:hash:-${{ hashFiles('**/pubspec.lock') }}
169+
- uses: maxim-lobanov/setup-xcode@v1
170+
if: matrix.platform == 'ios'
171+
with:
172+
xcode-version: '26.3'
173173
- name: "Install Tools"
174174
run: flutter pub global activate melos
175175
- name: "Bootstrap Workspace"

.github/workflows/update_goldens.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ jobs:
1616
with:
1717
flutter-version: "3.x"
1818
channel: stable
19-
cache: true
2019
cache-key: flutter-:os:-:channel:-:version:-:arch:-:hash:-${{ hashFiles('**/pubspec.lock') }}
2120

2221
- name: 📦 Install Tools

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ GeneratedPluginRegistrant.*
6666
**/ios/**/xcuserdata
6767
**/ios/.generated/
6868
**/ios/Flutter/App.framework
69+
**/ios/Flutter/ephemeral
6970
**/ios/Flutter/Flutter.framework
7071
**/ios/Flutter/Flutter.podspec
7172
**/ios/Flutter/Generated.xcconfig

CLAUDE.md

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
# CLAUDE.md
2+
3+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4+
5+
## Overview
6+
7+
This is a Dart/Flutter monorepo for Stream Chat's official Flutter SDK, managed with [Melos](https://pub.dev/packages/melos). All packages live under `packages/`.
8+
9+
## Common Commands
10+
11+
### Setup
12+
```bash
13+
melos bootstrap # Fetch and link all dependencies (equivalent to pub get for all packages)
14+
```
15+
16+
### Testing
17+
```bash
18+
melos run test:all # Run all Dart & Flutter tests
19+
melos run test:dart # Run Dart-only tests
20+
melos run test:flutter # Run Flutter tests
21+
# Run tests in a specific package:
22+
cd packages/stream_chat_flutter && flutter test
23+
cd packages/stream_chat_flutter && flutter test test/src/path/to/test_file.dart
24+
```
25+
26+
### Golden Tests
27+
```bash
28+
melos run update:goldens # Regenerate all golden image files
29+
# In CI, CI goldens are used; locally, platform goldens are used (configured via alchemist)
30+
```
31+
32+
### Linting & Formatting
33+
```bash
34+
melos run lint:all # Run analyze + format
35+
melos run analyze # Run dart analyze --fatal-infos on all packages
36+
melos run format # Check formatting (page width: 120)
37+
```
38+
39+
### Code Generation
40+
```bash
41+
melos run generate:all # Run build_runner for all packages
42+
melos run generate:flutter # Run build_runner for Flutter packages only
43+
melos run generate:dart # Run build_runner for Dart packages only
44+
```
45+
46+
### Versioning
47+
```bash
48+
melos run version:update # Regenerate version.dart from pubspec.yaml (runs automatically after bootstrap)
49+
```
50+
51+
## Package Architecture
52+
53+
The SDK is layered — each package builds on top of the previous:
54+
55+
```
56+
stream_chat # Pure Dart, no Flutter dependency
57+
└── stream_chat_persistence # Local disk cache using Drift (optional)
58+
└── stream_chat_flutter_core # Flutter business logic, no UI
59+
└── stream_chat_flutter # Full UI component library
60+
└── stream_chat_localizations # i18n for UI components
61+
```
62+
63+
### `stream_chat`
64+
Low-level Dart client. Key types:
65+
- `StreamChatClient` — central API client, manages WebSocket, REST, and state
66+
- `Channel` — represents a chat channel, has its own state and streaming APIs
67+
- Models in `lib/src/core/models/`: `Message`, `User`, `Member`, `Reaction`, `Poll`, `Event`, `Attachment`, `Draft`, etc.
68+
- Generated code (`.g.dart`, `.freezed.dart`) for JSON serialization/immutable models — do not edit manually
69+
70+
### `stream_chat_flutter_core`
71+
Business logic layer. Key types:
72+
- `StreamChatCore` — root widget, manages app lifecycle, WebSocket reconnection, and connectivity
73+
- `StreamChannel` — provides a `Channel` to the widget tree via `StreamChannel.of(context)`
74+
- `PagedValueNotifier<Key, Value>` — base class for all list controllers
75+
- Controllers: `StreamChannelListController`, `StreamMessageListController` (via `MessageListCore`), `StreamUserListController`, `StreamMemberListController`, `StreamThreadListController`, `StreamDraftListController`, `StreamMessageReminderListController`, `StreamPollController`
76+
- `BetterStreamBuilder<T>` — efficient StreamBuilder that only rebuilds when data changes
77+
78+
### `stream_chat_flutter`
79+
Full UI package. Key architectural points:
80+
81+
**Root widget hierarchy:**
82+
`StreamChat``StreamChatTheme``StreamChatConfiguration``StreamChatCore` → app content
83+
84+
**Theming:** `StreamChatThemeData` (accessed via `StreamChatTheme.of(context)`) contains per-component theme data objects. Components read their theme from context. `StreamChatConfigurationData` holds non-theme UI config.
85+
86+
**Widget tree integration pattern:**
87+
- `StreamChat.of(context)` — get the chat state (current user, client)
88+
- `StreamChannel.of(context)` — get the current channel state
89+
- `StreamChatTheme.of(context)` — get current theme data
90+
91+
**Key UI components:**
92+
- `StreamChannelListView` + `StreamChannelListTile` — channel list using `StreamChannelListController`
93+
- `StreamMessageListView` — message list with floating date dividers, unread indicators, thread separators
94+
- `StreamMessageInput` (legacy) / `StreamChatMessageComposer` (new design system) — message composition
95+
- `StreamMessageWidget` — renders individual messages with attachments, reactions, threads
96+
- Scroll views in `lib/src/scroll_view/` — generic paged scroll views for channels, threads, members, users, drafts, polls
97+
98+
**New design system components** (`lib/src/components/`):
99+
- `StreamUserAvatar`, `StreamChannelAvatar`, `StreamUserAvatarGroup` — avatar components; these are chat-domain wrappers around the base components in `stream_core_flutter`
100+
- `StreamChatMessageComposer` — new composer using `MessageComposerFactory` for custom layouts
101+
102+
**Golden tests:** Use `alchemist` package. Platform goldens used locally, CI goldens used in CI (detected via `CI`/`GITHUB_ACTIONS` env vars). Goldens stored alongside tests in `goldens/` subdirectories.
103+
104+
### `stream_chat_localizations`
105+
Provides `StreamChatLocalizations` — Flutter localizations delegate with translations for all UI strings.
106+
107+
### `stream_chat_persistence`
108+
Optional local persistence using Drift (SQLite). Implements `ChatPersistenceClient` from `stream_chat`.
109+
110+
## Code Style
111+
112+
- Line length: **120 characters** (configured in `analysis_options.yaml`)
113+
- Imports: always use package imports (`always_use_package_imports`), not relative imports
114+
- All public APIs **must** have doc comments (`public_member_api_docs`)
115+
- Sort constructors first, unnamed constructors before named
116+
- Prefer `const` constructors, `final` locals, single quotes
117+
- Trailing commas: `preserve` (formatter setting)
118+
- Generated files (`.g.dart`, `.freezed.dart`) are excluded from analysis
119+
120+
## PR & Commit Conventions
121+
122+
PR titles follow [Conventional Commits](https://www.conventionalcommits.org/):
123+
- `fix(scope): description` — bug fix
124+
- `feat(scope): description` — new feature
125+
- `refactor(scope)!: description` — breaking change
126+
- `chore(scope): description`, `docs:`, `test:`, etc.
127+
128+
After modifying any package, update its `CHANGELOG.md`.
129+
130+
## Figma Designs
131+
132+
UI designs for this SDK are in the **Chat SDK Design system** Figma project. Use the Figma MCP server to look up designs when implementing or updating UI components.
133+
134+
## `stream_core_flutter` (external sibling repo)
135+
136+
Basic UI components that can be shared across Stream products live in the `stream_core_flutter` package in the **stream-core-flutter** repository (a sibling repo, not inside this monorepo). These components:
137+
- Never depend on chat domain models (`Channel`, `Message`, `User`, etc.)
138+
- Provide primitive building blocks: avatars, layout primitives, theming tokens, etc.
139+
140+
Components in this repo can be wrappers around those base components, adding chat domain models and extra logic on top. For example, `StreamChannelAvatar` wraps the base `StreamAvatarGroup` from `stream_core_flutter` and adds channel-specific member resolution logic.
141+
142+
`stream_core_flutter` types used here are re-exported via a `show` allowlist in `lib/stream_chat_flutter.dart`. When adding a new type from `stream_core_flutter`, add it to that allowlist.
143+
144+
## Dependency Management
145+
146+
Dependencies are centrally managed in `melos.yaml` under `command.bootstrap.dependencies`. Do **not** edit version constraints directly in individual `pubspec.yaml` files — update `melos.yaml` and run `melos bootstrap`.
147+
148+
> Note: `stream_chat_flutter` uses a local path dependency to `stream_core_flutter` (pointing to the sibling repo) when making changes to both repos together. Use a git dependency when no local changes to `stream_core_flutter` are needed.

analysis_options.yaml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ analyzer:
44
- packages/*/lib/scrollable_positioned_list/**
55
- packages/*/lib/**/*.freezed.dart
66

7+
formatter:
8+
page_width: 120
9+
trailing_commas: preserve
10+
711
linter:
812
rules:
913
# these rules are documented on and in the same order as
@@ -19,7 +23,6 @@ linter:
1923
- control_flow_in_finally
2024
- empty_statements
2125
- hash_and_equals
22-
- invariant_booleans
2326
- literal_only_boolean_expressions
2427
- no_adjacent_strings_in_list
2528
- no_duplicate_case_values
@@ -40,7 +43,9 @@ linter:
4043
- avoid_null_checks_in_equality_operators
4144
- avoid_positional_boolean_parameters
4245
- avoid_private_typedef_functions
43-
- avoid_redundant_argument_values
46+
# Does not always make sense to remove them; it also makes it hard
47+
# to notice future breaking changes.
48+
# - avoid_redundant_argument_values
4449
- avoid_return_types_on_setters
4550
- avoid_returning_null_for_void
4651
- avoid_shadowing_type_parameters
@@ -64,7 +69,6 @@ linter:
6469
- leading_newlines_in_multiline_strings
6570
- library_names
6671
- library_prefixes
67-
- lines_longer_than_80_chars
6872
- missing_whitespace_between_adjacent_strings
6973
- non_constant_identifier_names
7074
- null_closures
@@ -81,7 +85,6 @@ linter:
8185
- prefer_const_declarations
8286
- prefer_const_literals_to_create_immutables
8387
- prefer_contains
84-
- prefer_equal_for_default_values
8588
- prefer_final_fields
8689
- prefer_final_in_for_each
8790
- prefer_final_locals

0 commit comments

Comments
 (0)