Skip to content

Commit 176477d

Browse files
committed
msglist: Retrieve topic from failed-to-send messages
Fixes: zulip#1441
1 parent f07af1f commit 176477d

File tree

3 files changed

+36
-19
lines changed

3 files changed

+36
-19
lines changed

lib/widgets/compose_box.dart

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

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

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

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

2064-
// TODO(#720) dismissable message-send error, maybe something like:
2065-
// if (controller.sendMessageError.value != null) {
2066-
// errorBanner = _ErrorBanner(label:
2067-
// ZulipLocalizations.of(context).errorSendMessageTimeout);
2068-
// }
20692052
return ComposeBoxInheritedWidget.fromComposeBoxState(this,
20702053
child: _ComposeBoxContainer(body: body, banner: banner));
20712054
}

lib/widgets/message_list.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1616,7 +1616,6 @@ class OutboxMessageWithPossibleSender extends StatelessWidget {
16161616

16171617
final MessageListOutboxMessageItem item;
16181618

1619-
// TODO restore the topic too
16201619
void _handlePress(BuildContext context) {
16211620
final store = PerAccountStoreWidget.of(context);
16221621
assert(store.outboxMessages.containsKey(item.message.localMessageId));
@@ -1631,6 +1630,13 @@ class OutboxMessageWithPossibleSender extends StatelessWidget {
16311630
if (!composeBoxController.contentFocusNode.hasFocus) {
16321631
composeBoxController.contentFocusNode.requestFocus();
16331632
}
1633+
1634+
if (composeBoxController case StreamComposeBoxController(:final topic)) {
1635+
final conversation = message.conversation;
1636+
if (conversation is StreamConversation) {
1637+
topic.setTopic(conversation.topic);
1638+
}
1639+
}
16341640
}
16351641

16361642
@override

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';
@@ -1422,6 +1423,8 @@ void main() {
14221423
final stream = eg.stream();
14231424
const content = 'outbox message content';
14241425

1426+
final topicInputFinder = find.byWidgetPredicate(
1427+
(widget) => widget is TextField && widget.controller is ComposeTopicController);
14251428
final contentInputFinder = find.byWidgetPredicate(
14261429
(widget) => widget is TextField && widget.controller is ComposeContentController);
14271430

@@ -1472,7 +1475,32 @@ void main() {
14721475
localMessageId: store.outboxMessages.keys.single));
14731476
});
14741477

1475-
testWidgets('failed to send message, retrieve the content to compose box', (tester) async {
1478+
testWidgets('in channel narrow, failed to send message, retrieve both topic and content to compose box', (tester) async {
1479+
await setupMessageListPage(tester,
1480+
narrow: ChannelNarrow(stream.streamId), streams: [stream],
1481+
messages: []);
1482+
1483+
connection.prepare(json: GetStreamTopicsResult(topics: []).toJson());
1484+
await tester.enterText(topicInputFinder, 'test topic');
1485+
await sendMessageAndFail(tester);
1486+
1487+
final controller = tester.state<ComposeBoxState>(find.byType(ComposeBox)).controller;
1488+
controller as StreamComposeBoxController;
1489+
await tester.enterText(topicInputFinder, 'different topic');
1490+
check(controller.content).text.isNotNull().isEmpty();
1491+
1492+
// Tap the message. This should put its content back into the compose box
1493+
// and remove it.
1494+
await tester.tap(outboxMessageFinder);
1495+
await tester.pump();
1496+
check(outboxMessageFinder).findsNothing();
1497+
check(controller.topic).text.equals('test topic');
1498+
check(controller.content).text.equals('$content\n\n');
1499+
1500+
await tester.pump(kLocalEchoDebounceDuration);
1501+
});
1502+
1503+
testWidgets('in topic narrow, failed to send message, retrieve the content to compose box', (tester) async {
14761504
await setupMessageListPage(tester,
14771505
narrow: eg.topicNarrow(stream.streamId, 'topic'), streams: [stream],
14781506
messages: []);

0 commit comments

Comments
 (0)