Repository navigation
Conversation
The composer saved its text as a draft when it was unmounted, even when its channel had already been disposed (e.g. the user was disconnected with a channel page open). Saving into the disposed channel threw and interrupted the unmount. Fixes FLU-1101. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 59 minutes. View limit details
No actionable comments were generated in the recent review.
|
| Layer / File(s) | Summary |
|---|---|
E2E app and platform projects e2e_app/lib/*, e2e_app/android/*, e2e_app/ios/*, e2e_app/pubspec.yaml |
Adds the E2E app, authentication, navigation, channel and message screens, and Android and iOS project configuration. |
Test support and integration scenarios e2e_app/integration_test/* |
Adds test robots, assertions, environment setup, page finders, and integration tests for authentication, messages, channels, attachments, delivery states, polls, reminders, and other app behavior. |
Fastlane and CI migration e2e_app/fastlane/*, .github/actions/*, .github/workflows/e2e_test*.yml, melos.yaml, .gitignore, sample_app/fastlane/*, sample_app/e2e_stubs/*, sample_app/Gemfile, sample_app/pubspec*, .claude/skills/flutter-version-bump/SKILL.md |
Adds E2E selection, batching, retries, coverage, and artifact handling in Fastlane. Updates CI paths and adds a coverage-map job. Removes the former E2E support and Firebase stubs from sample_app. |
Message composer and failed-message grouping
| Layer / File(s) | Summary |
|---|---|
Guard draft processing and separate failed-message groups packages/stream_chat_flutter/lib/src/message_input/stream_message_composer.dart, packages/stream_chat_flutter/lib/src/message_list_view/*, packages/stream_chat_flutter/test/src/message_input/message_composer_draft_test.dart, packages/stream_chat_flutter/test/src/message_list_view/message_list_failed_message_grouping_test.dart, packages/stream_chat_flutter/CHANGELOG.md |
The composer skips draft processing when channel state is absent. Message grouping now treats adjacent messages with different failed states as separate groups. Tests cover both changes. |
Priority:
Estimated code review effort: 5 (Critical) | ~120 minutes
Change: Other · Severity of issue fixed: Low
Suggested reviewers: velikovpetar
Merge Risk: 
Minimal · previous review dc51a
-
The fix prevents an exception when a composer is unmounted after its channel is disposed, and draft saving still works on a usable channel. The move of E2E tooling into a dedicated app is consistent across CI and workspace configuration. No merge-blocking risk remains.
Pre-merge checks: 
4 · 
1
-
Failed checks: 1 warning Passed checks: 4 passedFull details: Docstring Coverage
-
Explanation
Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 4 functions across 9 files. (100 skipped: 100 unsupported.)
Resolution
Write docstrings for the functions missing them to satisfy the coverage threshold.
-
Finishing Touches: 💡 3
-
📝 Generate docstrings: 💡
-
- Commit to this branch
- Create a new PR
⚔️ Resolve merge conflicts: 💡
-
- Resolve merge conflict in branch
sahil/flu-1101-the-composer-throws-when-its-channel-is-disposed-while-it
- Resolve merge conflict in branch
🛠️ Fix failing CI checks: 💡
-
- Commit to this branch
- Create a new PR
🧪 Generate unit tests (beta)
-
- Commit to this branch
- Create a new PR
-
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
Comment @coderabbitai help to get the list of available commands.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #3108 +/- ##
==========================================
+ Coverage 80.28% 80.32% +0.04%
==========================================
Files 455 455
Lines 29614 29615 +1
==========================================
+ Hits 23775 23788 +13
+ Misses 5839 5827 -12 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
flu-1101-the-composer-throws-when-its-channel-is-disposed-while-it
* test(repo): assert the token date and signature policy (FLU-1083) The SDK refreshes the token on code 40 only. A token used before its issue date (42) is reconnected as-is until the server's clock catches up, and a bad signature (43) is not retried with a new token. The four tests now assert that instead of a refresh. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * test(repo): tighten the token date and signature tests (FLU-1083) Keep the invalid window open past the refresh so the refreshed token is always rejected, count token requests through an env assertion, and fix the step and file comments to match what the tests assert. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * test(repo): drop the token signature after login test (FLU-1083) A signing secret doesn't go bad mid-session, and the test only timed the SDK's reconnect backoff. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * test(repo): keep the login error across the loading screen (FLU-1083) The chooser page is replaced while connecting, so an error it stored itself was gone by the time the login failed. The auth state now carries it, and the rebuilt page shows it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vTgFwqhUc2wKCWrw635yC --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(ui): keep the footer of a sent message before a failed one (FLU-1090) A message that failed now starts its own group, so the sent message before it keeps its timestamp and delivery status. Consecutive failed messages still group together. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * docs(ui): describe every failed message in the changelog (FLU-1090) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vTgFwqhUc2wKCWrw635yC --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
flu-1101-the-composer-throws-when-its-channel-is-disposed-while-it # Conflicts: # packages/stream_chat_flutter/CHANGELOG.md
…composer-throws-when-its-channel-is-disposed-while-it # Conflicts: # e2e_app/README.md # e2e_app/fastlane/Fastfile # e2e_app/integration_test/authentication_test.dart # e2e_app/integration_test/giphy_test.dart # e2e_app/integration_test/hyper_links_test.dart # e2e_app/integration_test/message_actions_test.dart # e2e_app/integration_test/message_delivery_status_test.dart # e2e_app/integration_test/message_list_test.dart # e2e_app/integration_test/pages/channel_list_page.dart # e2e_app/integration_test/robots/backend_robot.dart # e2e_app/integration_test/robots/participant_robot.dart # e2e_app/integration_test/robots/user_robot.dart # e2e_app/integration_test/robots/user_robot_message_list_asserts.dart # e2e_app/integration_test/support/stream_test_env.dart # e2e_app/lib/auth/auth_controller.dart # e2e_app/lib/pages/channel_list_tab.dart # e2e_app/lib/pages/home_page.dart # e2e_app/lib/pages/thread_list_tab.dart # e2e_app/lib/widgets/e2e_message_actions.dart # e2e_app/lib/widgets/search_text_field.dart # e2e_app/pubspec.yaml # packages/stream_chat_flutter/CHANGELOG.md # packages/stream_chat_flutter/test/src/message_list_view/message_list_failed_message_grouping_test.dart
What
StreamMessageComposersaves its text as a draft when it is unmounted. If its channel had already been disposed (for example, the user was disconnected while a channel page with unsent text was still open), saving threwBad state: Channel … has been disposedfromdeactivate(). That interrupted the unmount and turned the screen into Flutter's error widget.The composer now skips saving the draft when the channel has no state.
Fixes FLU-1101.
Stacked on #3105 (the e2e suite); GitHub retargets it to
masteronce that merges.Verification
message_composer_draft_test.dart: unmounting with unsent text saves a draft on a usable channel, and doesn't throw once the channel is disposed. The second test fails without the fix.Draft: …in the channel list).v11: see the "Merging master into v11" comment on FLU-1101.
🤖 Generated with Claude Code
Summary by CodeRabbit