Skip to content

Commit d54befe

Browse files
committed
msglist: Retrieve topic from failed-to-send messages
Fixes: zulip#1441
1 parent 366ed2b commit d54befe

File tree

2 files changed

+29
-18
lines changed

2 files changed

+29
-18
lines changed

lib/widgets/compose_box.dart

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,15 +1289,8 @@ class _SendButtonState extends State<_SendButton> {
12891289
final content = controller.content.textNormalized;
12901290

12911291
controller.content.clear();
1292-
// The following `stoppedComposing` call is currently redundant,
1293-
// because clearing input sends a "typing stopped" notice.
1294-
// It will be necessary once we resolve #720.
1295-
store.typingNotifier.stoppedComposing();
12961292

12971293
try {
1298-
// TODO(#720) clear content input only on success response;
1299-
// while waiting, put input(s) and send button into a disabled
1300-
// "working on it" state (letting input text be selected for copying).
13011294
await store.sendMessage(destination: widget.getDestination(), content: content);
13021295
} on ApiRequestException catch (e) {
13031296
if (!mounted) return;
@@ -1389,7 +1382,6 @@ class _ComposeBoxContainer extends StatelessWidget {
13891382
border: Border(top: BorderSide(color: designVariables.borderBar)),
13901383
boxShadow: ComposeBoxTheme.of(context).boxShadow,
13911384
),
1392-
// TODO(#720) try a Stack for the overlaid linear progress indicator
13931385
child: Material(
13941386
color: designVariables.composeBoxBg,
13951387
child: Column(
@@ -1725,10 +1717,6 @@ class _ErrorBanner extends _Banner {
17251717

17261718
@override
17271719
Widget? buildTrailing(context) {
1728-
// TODO(#720) "x" button goes here.
1729-
// 24px square with 8px touchable padding in all directions?
1730-
// and `bool get padEnd => false`; see Figma:
1731-
// https://www.figma.com/design/1JTNtYo9memgW7vV6d0ygq/Zulip-Mobile?node-id=4031-17029&m=dev
17321720
return null;
17331721
}
17341722
}
@@ -2092,11 +2080,6 @@ class _ComposeBoxState extends State<ComposeBox> with PerAccountStoreAwareStateM
20922080
}
20932081
}
20942082

2095-
// TODO(#720) dismissable message-send error, maybe something like:
2096-
// if (controller.sendMessageError.value != null) {
2097-
// errorBanner = _ErrorBanner(label:
2098-
// ZulipLocalizations.of(context).errorSendMessageTimeout);
2099-
// }
21002083
return ComposeBoxInheritedWidget.fromComposeBoxState(this,
21012084
child: _ComposeBoxContainer(body: body, banner: banner));
21022085
}

test/widgets/message_list_test.dart

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:zulip/api/model/events.dart';
1111
import 'package:zulip/api/model/initial_snapshot.dart';
1212
import 'package:zulip/api/model/model.dart';
1313
import 'package:zulip/api/model/narrow.dart';
14+
import 'package:zulip/api/route/channels.dart';
1415
import 'package:zulip/api/route/messages.dart';
1516
import 'package:zulip/model/actions.dart';
1617
import 'package:zulip/model/localizations.dart';
@@ -1460,6 +1461,8 @@ void main() {
14601461
final stream = eg.stream();
14611462
const content = 'outbox message content';
14621463

1464+
final topicInputFinder = find.byWidgetPredicate(
1465+
(widget) => widget is TextField && widget.controller is ComposeTopicController);
14631466
final contentInputFinder = find.byWidgetPredicate(
14641467
(widget) => widget is TextField && widget.controller is ComposeContentController);
14651468

@@ -1510,7 +1513,32 @@ void main() {
15101513
localMessageId: store.outboxMessages.keys.single));
15111514
});
15121515

1513-
testWidgets('failed to send message, retrieve the content to compose box', (tester) async {
1516+
testWidgets('in channel narrow, failed to send message, retrieve both topic and content to compose box', (tester) async {
1517+
await setupMessageListPage(tester,
1518+
narrow: ChannelNarrow(stream.streamId), streams: [stream],
1519+
messages: []);
1520+
1521+
connection.prepare(json: GetStreamTopicsResult(topics: []).toJson());
1522+
await tester.enterText(topicInputFinder, 'test topic');
1523+
await sendMessageAndFail(tester);
1524+
1525+
final controller = tester.state<ComposeBoxState>(find.byType(ComposeBox)).controller;
1526+
controller as StreamComposeBoxController;
1527+
await tester.enterText(topicInputFinder, 'different topic');
1528+
check(controller.content).text.isNotNull().isEmpty();
1529+
1530+
// Tap the message. This should put its content back into the compose box
1531+
// and remove it.
1532+
await tester.tap(outboxMessageFinder);
1533+
await tester.pump();
1534+
check(outboxMessageFinder).findsNothing();
1535+
check(controller.topic).text.equals('test topic');
1536+
check(controller.content).text.equals('$content\n\n');
1537+
1538+
await tester.pump(kLocalEchoDebounceDuration);
1539+
});
1540+
1541+
testWidgets('in topic narrow, failed to send message, retrieve the content to compose box', (tester) async {
15141542
await setupMessageListPage(tester,
15151543
narrow: eg.topicNarrow(stream.streamId, 'topic'), streams: [stream],
15161544
messages: []);

0 commit comments

Comments
 (0)