Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
5fd710f
test(e2e): add e2e_app, port native e2e suites, one app process per C…
testableapple Oct 23, 2026
0b8aa6d
chore(repo): ignore e2e mock server, Allure results and allurectl in …
testableapple Oct 23, 2026
b4979e4
test(repo): link every e2e test to its Allure TestOps case
testableapple Oct 23, 2026
b71afe2
Merge remote-tracking branch 'origin/master' into test/e2e-native-parity
testableapple Oct 23, 2026
b03e78e
test(repo): unmount the e2e app before resetting the client, verify c…
testableapple Oct 23, 2026
3bb8bd3
ci(repo): run PR e2e on API 36, use a preinstalled NDK, retry failed …
testableapple Oct 23, 2026
e7510b3
test(repo): retype into a field that ignored the text
testableapple Oct 23, 2026
1e75428
test(repo): keep the copied message id in the e2e app, bound the vid…
testableapple Oct 23, 2026
4b7a5fa
Merge branch 'master' into test/e2e-native-parity
testableapple Oct 23, 2026
8d9cef2
test(repo): scroll until a message is on screen, stop when the emulat…
testableapple Oct 23, 2026
0e4da80
ci(repo): give the e2e app's Gradle the sample app's memory settings
testableapple Oct 23, 2026
4a66a48
Bump timeout
testableapple Oct 24, 2026
ab90f31
test(repo): restart a dead emulator during the e2e run
testableapple Oct 24, 2026
c883599
test(repo): time-limit e2e runs so a dead emulator can't hang the job
testableapple Oct 24, 2026
87586b9
fix(repo): look up timeout through sh so the lane runs on Linux
testableapple Oct 24, 2026
d42a93a
ci(repo): split the e2e coverage nightly into 4 batches
testableapple Oct 25, 2026
8e73290
ci(repo): give the e2e runners memory headroom
testableapple Oct 25, 2026
b6acb2a
test(repo): retry the tap that opens the image gallery
testableapple Oct 25, 2026
f5b2efe
fix(ui): keep the replies count on a deleted thread parent
xsahil03x Oct 26, 2026
9f51279
Merge remote-tracking branch 'origin/test/e2e-native-parity' into sah…
xsahil03x Oct 26, 2026
6fdaf1d
test(repo): enable the deleted thread parent e2e tests (FLU-1092)
xsahil03x Oct 26, 2026
f88666c
fix(ui): let a deleted thread parent with replies take new replies
xsahil03x Oct 26, 2026
60295c8
Merge remote-tracking branch 'origin/sahil/flu-1092-a-deleted-thread-…
xsahil03x Oct 26, 2026
d0d5fad
test(repo): assert the token date and signature policy (#3123)
xsahil03x Oct 27, 2026
bdf15fd
fix(ui): keep the footer of a sent message before a failed one (#3122)
xsahil03x Oct 27, 2026
3923d3e
Merge remote-tracking branch 'origin/test/e2e-native-parity' into sah…
xsahil03x Oct 27, 2026
8a19f0b
Merge remote-tracking branch 'origin/sahil/flu-1092-a-deleted-thread-…
xsahil03x Oct 27, 2026
f7098df
Merge remote-tracking branch 'origin/master' into sahil/flu-1092-a-de…
xsahil03x Oct 27, 2026
f37c6b4
Merge remote-tracking branch 'origin/sahil/flu-1092-a-deleted-thread-…
xsahil03x Oct 27, 2026
7a0e302
Merge remote-tracking branch 'origin/master' into sahil/flu-1092-a-de…
xsahil03x Oct 28, 2026
5c4397f
Merge remote-tracking branch 'origin/sahil/flu-1092-a-deleted-thread-…
xsahil03x Oct 28, 2026
3985373
Merge remote-tracking branch 'origin/master' into sahil/thread-compos…
xsahil03x Oct 28, 2026
a3473da
Merge remote-tracking branch 'origin/master' into sahil/thread-compos…
xsahil03x Oct 28, 2026
989caa7
Merge remote-tracking branch 'origin/master' into sahil/thread-compos…
xsahil03x Oct 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/stream_chat_flutter/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

🐞 Fixed

- Fixed `StreamThreadPage` hiding the composer for a deleted parent message that already has replies, which can still be replied to.
- Fixed the "Only visible to you" Giphy preview showing a delivery status.
- Fixed channel list previews showing a "You:" or sender name prefix, and the delivery status, in front of a system message.
- Fixed a deleted message hiding its replies count, which left its thread unreachable from the channel.
Expand Down
7 changes: 4 additions & 3 deletions packages/stream_chat_flutter/lib/src/pages/thread_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import '../../stream_chat_flutter.dart';
/// out floating or regular according to the ambient [StreamSurfaceStyle]. Expects a
/// [StreamChannel] ancestor.
///
/// The composer is omitted when [parent] is deleted.
/// The composer is omitted when [parent] is deleted and has no replies.
///
/// ## Customizing this page
///
Expand Down Expand Up @@ -101,7 +101,8 @@ class _StreamThreadPageState extends State<StreamThreadPage> {
onBackPressed: widget.onBackPressed,
);

final composer = !widget.parent.isDeleted
final canReply = !widget.parent.isDeleted || (widget.parent.replyCount ?? 0) > 0;
final composer = canReply
? StreamMessageComposer(
focusNode: _focusNode,
messageComposerController: _messageComposerController,
Expand All @@ -113,7 +114,7 @@ class _StreamThreadPageState extends State<StreamThreadPage> {
appBar: appBar,
bottom: composer,
// Resolved from the slots so the body inset matches what the chrome draws.
// The bottom value is ignored when the composer is null (deleted parent).
// The bottom value is ignored when the composer is null.
appBarSurfaceStyle: StreamThreadHeader.resolveSurfaceStyle(context),
bottomSurfaceStyle: StreamMessageComposer.resolveSurfaceStyle(context),
body: _ThreadBody(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,22 @@ void main() {
expect(_composerController(tester).message.parentId, 'parent-id');
});

testWidgets('hides the composer when the parent message is deleted', (tester) async {
testWidgets('hides the composer when the deleted parent message has no replies', (tester) async {
final parent = Message(id: 'parent-id', text: 'Hello world!', type: 'deleted');

await _pumpThreadPage(tester, parent: parent);

expect(find.byType(StreamMessageComposer), findsNothing);
});

testWidgets('shows the composer when the deleted parent message has replies', (tester) async {
final parent = Message(id: 'parent-id', text: 'Hello world!', type: 'deleted', replyCount: 1);

await _pumpThreadPage(tester, parent: parent);

expect(find.byType(StreamMessageComposer), findsOneWidget);
});

testWidgets('still shows the thread when the parent message is deleted', (tester) async {
final parent = Message(id: 'parent-id', text: 'Hello world!', type: 'deleted');

Expand Down
Loading