Conversation
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
# Conflicts: # packages/stream_chat_flutter/CHANGELOG.md
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
# Conflicts: # packages/stream_chat_flutter/CHANGELOG.md
# Conflicts: # packages/stream_chat_flutter/CHANGELOG.md # packages/stream_chat_flutter_core/CHANGELOG.md
# Conflicts: # melos.yaml # packages/stream_chat/CHANGELOG.md # packages/stream_chat/example/pubspec.yaml # packages/stream_chat/lib/version.dart # packages/stream_chat/pubspec.yaml # packages/stream_chat_flutter/example/pubspec.yaml # packages/stream_chat_flutter/pubspec.yaml # packages/stream_chat_flutter_core/example/pubspec.yaml # packages/stream_chat_flutter_core/pubspec.yaml # packages/stream_chat_localizations/CHANGELOG.md # packages/stream_chat_localizations/example/pubspec.yaml # packages/stream_chat_localizations/pubspec.yaml # packages/stream_chat_persistence/CHANGELOG.md # packages/stream_chat_persistence/example/pubspec.yaml # packages/stream_chat_persistence/pubspec.yaml # sample_app/pubspec.yaml
# Conflicts: # packages/stream_chat/CHANGELOG.md # packages/stream_chat_flutter_core/CHANGELOG.md
# Conflicts: # melos.yaml # packages/stream_chat/CHANGELOG.md # packages/stream_chat/example/pubspec.yaml # packages/stream_chat/lib/version.dart # packages/stream_chat/pubspec.yaml # packages/stream_chat_flutter/CHANGELOG.md # packages/stream_chat_flutter/example/pubspec.yaml # packages/stream_chat_flutter/pubspec.yaml # packages/stream_chat_flutter_core/example/pubspec.yaml # packages/stream_chat_flutter_core/pubspec.yaml # packages/stream_chat_localizations/CHANGELOG.md # packages/stream_chat_localizations/example/pubspec.yaml # packages/stream_chat_localizations/pubspec.yaml # packages/stream_chat_persistence/CHANGELOG.md # packages/stream_chat_persistence/example/pubspec.yaml # packages/stream_chat_persistence/pubspec.yaml # sample_app/pubspec.yaml
Co-authored-by: xsahil03x <25670178+xsahil03x@users.noreply.github.com>
# Conflicts: # packages/stream_chat/CHANGELOG.md # packages/stream_chat_flutter_core/CHANGELOG.md
# Conflicts: # packages/stream_chat_flutter/CHANGELOG.md # packages/stream_chat_flutter/lib/src/message_input/stream_message_input.dart # packages/stream_chat_persistence/CHANGELOG.md
The animation curves and durations for the reaction picker and message modal have been updated for a smoother user experience. - The `reaction_picker_icon_list.dart` animation curve is now `Curves.easeOutBack` and the duration is 335 milliseconds. - The `message_modal.dart` transition duration is now 335 milliseconds, and the scale animation curve is `Curves.easeOutBack`.
# Conflicts: # packages/stream_chat_persistence/CHANGELOG.md # packages/stream_chat_persistence/lib/src/db/drift_chat_database.dart
# Conflicts: # packages/stream_chat_flutter/CHANGELOG.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…attachment validation (#2706) * Add appSettings API for upload config * rename sizeLimit * Added validation also for dropping attachments * fix doc for maxAttachmentSize * cover localizations * fix(ui): remove padding from StreamPhotoGallery * Wrap `StreamPhotoGallery` with `MediaQuery.removePadding` to fix a bottom padding issue in the gallery picker. * refactor(llc, ui): restructure appSettings into AppSettingsManager and StreamAttachmentValidator LLC: - Move appSettings caching into a dedicated AppSettingsManager owned by the client; expose `client.appSettings` (cached) and `client.getAppSettings()` (refresh). Auto-loads on connect, clears on disconnect. - Drop the `UploadConfig.isAllowed` helper — validation logic lives in the UI package where it has access to translations and the composer error sheet. - Add `UploadConfig.defaultSizeLimit` (100 MB, matching backend default). - Make `AppSettings` and `UploadConfig` equatable. UI: - Add `StreamAttachmentValidator` — a stateless rule set built from `AppSettings`. Exposes `validateCount(int)` and `validate(Attachment)` that return typed errors instead of throwing. - Add typed errors `AttachmentLimitReachedError`, `AttachmentTooLargeError`, and `AttachmentBlockedError`. - `StreamAttachmentPickerController` now takes a single `validator` param. - `StreamMessageComposer` validates picked/pasted/dropped attachments via the validator (built from `client.appSettings`) and surfaces the first failure through the localized error sheet. - Remove `StreamMessageComposer.maxAttachmentSize`, `onAttachmentLimitExceed`, the `AttachmentLimitExceedListener` typedef, and `kDefaultMaxAttachmentSize`. - `attachmentLimit` becomes non-nullable, defaulting to `StreamAttachmentValidator.defaultMaxAttachmentCount` (30 — the backend cap). Tests: - 9 new tests for `AppSettingsManager` (cache, refresh, clear, error swallow). - 28 tests for `StreamAttachmentValidator` covering both lists across both dimensions, size fallback, image/file routing, compound extensions, and count validation. Docs: - Update CHANGELOGs for both packages to reflect the shipped surface. - Rewrite the `attachmentLimit` section in `migrations/redesign/message_composer.md` and add an "AppSettings-driven attachment validation" section. - Add `AttachmentBlockedError` to the typed-errors section in `migrations/v10-migration.md`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: point custom-error-UI guidance to StreamMessageComposer.onError `onError` on the composer short-circuits the default error sheet and receives the typed validator errors directly, so it's the right hook for custom UI. The previous wording reached past the composer into `StreamAttachmentPickerController.addAttachment`, which leaked internal wiring. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: document new fileTypeNotSupportedError translation key Add the new abstract member to: - migrations/redesign/localizations.md (New Required Abstract Members + checklist count) - stream_chat_localizations CHANGELOG (Added) - stream_chat_flutter CHANGELOG (cross-references the localizations migration) The key is mandatory for any custom Translations subclass and was missing from the migration docs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * refactor(localizations): use early-return in fileTypeNotSupportedError Replace the inline ternary with an explicit early-return for the extension-known branch across all locale implementations, the DefaultTranslations base, the example custom-locale, and the migration guide. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * i18n: translate fileTypeNotSupportedError across all locales Replace the English fallback with actual translations in ca, de, es, fr, hi, it, ja, ko, no, and pt — matching the tone of the adjacent fileTooLargeError in each locale. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: attribute upload config to Stream Dashboard, not the backend The size/extension/MIME lists in AppSettings are configured by customers in the Stream Dashboard and served via GET /app — they're not defined by the backend. References to "backend-configured" / "the backend value" / "by the backend" mis-attributed the source; updated to "app-configured" or "configured in the Stream Dashboard". Kept "backend" where it's still correct: - The hard-coded MaxNumberOfMessageAttachments = 30 cap (a backend constant). - Server-side enforcement (the server does reject mis-typed messages). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: drop "construct your own picker controller" suggestion The picker controller is constructed inside StreamMessageComposer, not by SDK users, so suggesting they instantiate one to inject a custom validator was misleading. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: tighten changelog entries to public surface only Drop impl details from the AppSettings changelog entries — users care about the public API (StreamChatClient.appSettings, the typed errors via onError, the new translation key, the removed/changed composer params) not about how the SDK loads, caches, or wires things together under the hood. Removed entries for StreamAttachmentValidator (plumbing — users never construct it) and the standalone "Added typed validator errors" line (the errors are mentioned where they matter, inside the composer behavior entry). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: drop duplicate migration-doc links from changelog entries Multiple breaking entries linked to the same message_composer.md section; the localizations entry duplicated the catch-all link already present further down. Readers find the migration docs through the normal route. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs: trim verbose changelog entries to match neighbour density - Tighten the composer-validates entry from two long sentences to two short ones (drops "every picked, pasted, and dropped attachment" and the "render your own UI" tail). - Drop the trailing "Required override on any custom Translations subclass" — line 58 catch-all already states this. - Restore the "(replaces the previous size / limit / config parameters)" context on the picker controller breaking entry — it's migration info, not impl detail, and matches the rename-style neighbours. - Tighten the localizations changelog entry to two lines, matching the threadLabel / commandUsernameLabel format. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(localizations): drop UI context from changelog entry The stream_chat_localizations package doesn't know which UI surface consumes a translation; localizations CHANGELOG entries should describe the translation itself, not the consumer. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Sahil Kumar <sahil@getstream.io> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Sahil Kumar <xdsahil@gmail.com>
4 tasks
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* deprecate typedef * deprecate icons --------- Co-authored-by: Sahil Kumar <xdsahil@gmail.com>
Contributor
|
Caution Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted. Error details |
* docs(screenshots): add delivery states, avatar factory, and composer header goldens New golden tests for docs screenshots: - message_delivery_states: four StreamSendingIndicator states (sending/sent/delivered/read) - avatar_group_custom / avatar_stack_custom: custom avatarGroup and avatarStack factory slots - message_composer_input_header: custom messageComposerInputHeader slot with a banner Avatar tests register networkImage: goldenNetworkImageBuilder in the inner StreamComponentFactory so the outer GoldenComponentFactory's image stub isn't shadowed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Add emoji autocomplete example * Add channellist draft and RTL screenshots * Add tests for default avatars * chore: Update Goldens * fix formatting and pubspec order --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com> Co-authored-by: Sahil Kumar <xdsahil@gmail.com>
* update core_flutter package * removed todo
Restores the missing piece from #2726 that wasn't carried over in the master -> v10.0.0 merge. CHANGELOGs already advertised the switch. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* perf(persistence): Reduce the number of read message per channel from DB when paginating (part 1) (#2679) * refactor(dao): Filter reactions by userId at DB level. * refactor(dao): Filter reactions by userId at DB level (pinned messages). * refactor(dao): optimize message retrieval with SQL-side pagination filters * refactor(dao): fix formatting * refactor(dao): Update CHANGELOG.md * refactor(dao): Apply formatting * refactor(dao): enhance message pagination logic to support inclusive cursors * refactor(dao): Update docs * refactor(dao): Add message.id tiebreakier * refactor(dao): Add message.id tiebreaker * refactor(dao): Update CHANGELOG.md * perf(persistence): Reduce the number of read message per channel from DB when paginating (part 2) (#2681) * refactor(dao): Filter reactions by userId at DB level. * refactor(dao): Filter reactions by userId at DB level (pinned messages). * refactor(dao): optimize message retrieval with SQL-side pagination filters * refactor(dao): fix formatting * refactor(dao): Update CHANGELOG.md * refactor(dao): Apply formatting * refactor(dao): optimize message and reaction retrieval with grouped queries * refactor(dao): add tests for new methods * refactor(dao): enhance message pagination logic to support inclusive cursors * refactor(dao): Update docs * refactor(dao): Remove legacy method * refactor(dao): Remove legacy method * refactor(dao): Remove legacy method * refactor(dao): Fix warnings * refactor(dao): Add message.id tiebreakier * refactor(dao): Add message.id tiebreaker * refactor(dao): Update CHANGELOG.md * fix(persistence): Prevent fetching drafts/quotes for quoted messages. * chore(repo): release v9.25.0 (#2730) * feat(persistence): Add batched getLocationsByMessageIds. * Clean-up location dao. * Fix formatting. * Fix PR remarks. --------- Co-authored-by: Sahil Kumar <xdsahil@gmail.com>
# Conflicts: # melos.yaml # packages/stream_chat/CHANGELOG.md # packages/stream_chat/example/pubspec.yaml # packages/stream_chat/lib/version.dart # packages/stream_chat/pubspec.yaml # packages/stream_chat_flutter/CHANGELOG.md # packages/stream_chat_flutter/example/pubspec.yaml # packages/stream_chat_flutter/pubspec.yaml # packages/stream_chat_flutter_core/CHANGELOG.md # packages/stream_chat_flutter_core/example/pubspec.yaml # packages/stream_chat_flutter_core/pubspec.yaml # packages/stream_chat_localizations/CHANGELOG.md # packages/stream_chat_localizations/example/pubspec.yaml # packages/stream_chat_localizations/pubspec.yaml # packages/stream_chat_persistence/CHANGELOG.md # packages/stream_chat_persistence/example/pubspec.yaml # packages/stream_chat_persistence/lib/src/dao/draft_message_dao.dart # packages/stream_chat_persistence/lib/src/dao/message_dao.dart # packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart # packages/stream_chat_persistence/lib/src/dao/pinned_message_reaction_dao.dart # packages/stream_chat_persistence/lib/src/dao/poll_dao.dart # packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart # packages/stream_chat_persistence/lib/src/db/query_utils.dart # packages/stream_chat_persistence/pubspec.yaml # packages/stream_chat_persistence/test/src/dao/draft_message_dao_test.dart # packages/stream_chat_persistence/test/src/dao/message_dao_test.dart # packages/stream_chat_persistence/test/src/dao/pinned_message_dao_test.dart # packages/stream_chat_persistence/test/src/dao/pinned_message_reaction_dao_test.dart # packages/stream_chat_persistence/test/src/dao/poll_dao_test.dart # packages/stream_chat_persistence/test/src/dao/poll_vote_dao_test.dart # packages/stream_chat_persistence/test/src/dao/reaction_dao_test.dart # sample_app/pubspec.yaml
* update sdk readmes * fix review issues * make hero image smaller
renefloor
approved these changes
Jun 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
v10.0.0 — Design Refresh & API Modernization
This is the v10.0.0 major release for Stream Chat Flutter. It introduces a refreshed UI, redesigned customization APIs, new chat features (location sharing, delete-for-me, slow mode UI), and aligns naming with the Android and iOS SDKs.
📖 Full migration guide — start here if you're upgrading from v9.x or any v10 beta.
Headline changes
🎨 SDK redesign (#2503)
A full visual refresh across the entire UI package, synced with the Figma design system. New default theme, updated channel/message/composer/poll/media surfaces, simplified icon set (#2619), default chat SDK defaults updated for v10 (#2691).
💬 New chat features
endAt(feat(llc): Store endAt in UTC #2428)MessageDeleteScopeAPI (feat(llc, ui): add delete message for me #2394), persistence fields (feat(persistence): add deletedForMe and deletedMessages fields #2395), event handling (feat(llc, persistence): handle user.messages.deleted event #2423)/appendpoint wired up; attachments are validated against per-appAppSettings(size limits, allowed/blocked extensions and MIME types, total attachment count) before they enter the composer (feat(llc, ui, localization)!: AppSettings API and AppSettings-driven attachment validation #2706)AttachmentFileUploader(feat(llc)!: add standalone file/image upload/remove methods #2396)emoji_codesupport across LLC, persistence, and UI (feat(llc, ui, persistence)!: add support for reaction emoji_code #2326)reactionIndicatorBuilder(feat(ui): add reactionIndicatorBuilder for custom reaction indicators #2440)attachmentPickerOptionsBuilder#2415)onAttachmentTapfallback — call default behavior from custom handlers (feat(ui)!: enhance onAttachmentTap with fallback to default behavior #2426)StreamChatConfiguration.maybeOf()— non-throwing variantmessageLeading/messageHeader/messageFooterbuilders, parity with Android/iOS/RN (feat(ui): factory slots for message item leading, header, footer #2710)🧱 Breaking API redesigns
sendReactionnow takes aReactionobject; reaction picker rewritten withonReactionPickedcallbacks (refactor!(ui): add support for customising reaction picker #2248, refactor(ui)!: improve reaction bubble implementation #2277);reactionOverlapremoved (overlap now derived fromreactionPosition) (fix(ui): Remove reactionOverlap from config #2708)StreamAttachmentPickerControllernow takes avalidator: StreamAttachmentValidator(feat(llc, ui, localization)!: AppSettings API and AppSettings-driven attachment validation #2706)showStreamDialogreplacesshowStreamMessageModal(refactor(ui)!: re-wrote message actions and modals #2156, refactor(ui): introduce showStreamDialog and replace showStreamMessageModal #2344)MessageItem,MessageAction, etc. (refactor(ui, sample)!: align message item naming with android and ios sdks #2643)inputController→composerController(feat(UI): rename message input #2642, fix(ui, core): rename input controller to composer controller #2646); composermaxAttachmentSize/onAttachmentLimitExceedremoved in favor ofAppSettings+onError(feat(llc, ui, localization)!: AppSettings API and AppSettings-driven attachment validation #2706);StreamMessageComposer.attachmentLimitis now a non-nullableintdefaulting to30(feat(llc, ui, localization)!: AppSettings API and AppSettings-driven attachment validation #2706)StreamChatconfig/theme accessors —streamChatConfigData/streamChatThemeDatarenamed toconfigData/themeData(drop redundantStreamprefix) (rename config and themedata #2725)StreamMessageListViewconstructor — consolidated intoStreamMessageListViewConfigurationandStreamMessageListViewBuilders; highlight color moved to theme (Feat(ui): simplify messagelist constructor #2674)AttachmentPickerControllererrors — typedAttachmentTooLargeError/AttachmentLimitReachedErrorinstead ofArgumentError(refactor(ui)!: replace ArgumentError with typed errors #2479)ClientStatecollections — immutable returns, prevent external mutation (fix(llc)!: prevent external mutation of ClientState collections #2686)>=3.41.0and Dart^3.11.0across all packages (chore(repo): bump min Flutter to 3.41.0 and Dart SDK to 3.11.0 #2721)file_picker11 (chore(deps)!: bump dep floors, widen plus-plugin majors, migrate file_picker 11 #2644),jiffy^6.4.5(chore(deps): bump jiffy to ^6.4.5 #2719),stream_core_flutterpublished version (chore(ui): update core_flutter package #2729)StreamSvgIconusages removed from sources (fix(ui): Remove use of svg icon #2697)🛠 Other notable changes
child,enabled,onRefresh) (feat(ui): thread list banner redesign #2608)SampleAppConfig(feat(samples): implementSampleAppConfigand modernize UI architechture #2614), refreshed app icons (chore(sample): refresh app icons #2707, chore(samples): update launcher icons size for android #2723)StreamChat.maybeOflookup backed byStreamStateScopefor cheaper lookups (perf)MessageDetailsremoved (docs(ui)!: correct migration docs; remove dead MessageDetails #2680)🐞 Notable fixes
emoji_coderegression fix (fix(ui): fix regression in emoji_code support for reactions #2474)sendReplycapability (fix(ui): enable sending reply in threads for users with sendReply capability #2385)fileSizeonly required when a file is present (fix(llc): require attachment fileSize only when there is a file #2673)null(fix(ui): preserve composer state when draft stream emits initial null #2699)supportedReactions(fix(ui): apply filter of supported emoji #2698)xxlavatar maps toxxlonline indicator size per Figma (fix(ui): map xxl avatar to xxl online indicator size #2711)messageLimitrespected inStreamChatPersistenceClient.getChannelStates(fix(persistence): EnsuremessageLimitis respected ingetChannelStates#2717)Scope
master(13 beta releases:10.0.0-beta.1through10.0.0-beta.13)mastermerged in via chore(repo): merge master into v10.0.0 #2682 and Mergemastertov10.0.0(08.06.2026) #2731Test plan
CI status as of the latest push:
analyze,analyze_legacy_versions(Flutter 3.41.0 floor), CodeQL, language-specific analyzers (actions, c-cpp, ruby) all greenformatjob green (page width 120)stream_chat,stream_chat_flutter,stream_chat_flutter_core,stream_chat_localizations,stream_chat_persistencebuild (ios)andiosend-to-end greencodecov/patchandcodecov/projectgreencheck_entity_modifications,conventional_pr_title,semantic_changelog_updategreenbuild (android),android,ios_testflightjobs still running on the latest commitv10.0.0-beta.13→10.0.0🤖 Generated with Claude Code