Skip to content

Commit 9c2c403

Browse files
committed
msglist: Retrieve topic from failed-to-send messages
Fixes: #1441
1 parent 24508b3 commit 9c2c403

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
@@ -1615,7 +1615,6 @@ class OutboxMessageWithPossibleSender extends StatelessWidget {
16151615

16161616
final MessageListOutboxMessageItem item;
16171617

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

16351641
@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';
@@ -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)