Skip to content

Commit bdb0f1c

Browse files
committed
compose box: On failed message send, show error dialog
Fixes: zulip#815
1 parent d2672ce commit bdb0f1c

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

lib/widgets/compose_box.dart

+20-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:flutter/services.dart';
55
import 'package:flutter_gen/gen_l10n/zulip_localizations.dart';
66
import 'package:image_picker/image_picker.dart';
77

8+
import '../api/exception.dart';
89
import '../api/model/model.dart';
910
import '../api/route/messages.dart';
1011
import '../model/compose.dart';
@@ -716,7 +717,7 @@ class _SendButtonState extends State<_SendButton> {
716717
|| widget.contentController.hasValidationErrors.value;
717718
}
718719

719-
void _send() {
720+
void _send() async {
720721
if (_hasValidationErrors) {
721722
final zulipLocalizations = ZulipLocalizations.of(context);
722723
List<String> validationErrorMessages = [
@@ -735,9 +736,26 @@ class _SendButtonState extends State<_SendButton> {
735736

736737
final store = PerAccountStoreWidget.of(context);
737738
final content = widget.contentController.textNormalized;
738-
store.sendMessage(destination: widget.getDestination(), content: content);
739739

740740
widget.contentController.clear();
741+
742+
try {
743+
// TODO(#720) await send request, putting input(s) and send button into a
744+
// disabled "working on it" state (allowing input text to be selected
745+
// for copying).
746+
await store.sendMessage(destination: widget.getDestination(), content: content);
747+
} on ApiRequestException catch (e) {
748+
if (!mounted) return;
749+
final zulipLocalizations = ZulipLocalizations.of(context);
750+
final message = switch (e) {
751+
ZulipApiException() => zulipLocalizations.errorServerMessage(e.message),
752+
_ => e.message,
753+
};
754+
showErrorDialog(context: context,
755+
title: zulipLocalizations.errorMessageNotSent,
756+
message: message);
757+
return;
758+
}
741759
}
742760

743761
@override

test/widgets/compose_box_test.dart

+19
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import '../example_data.dart' as eg;
1616
import '../flutter_checks.dart';
1717
import '../model/binding.dart';
1818
import '../stdlib_checks.dart';
19+
import 'dialog_checks.dart';
1920

2021
void main() {
2122
TestZulipBinding.ensureInitialized();
@@ -219,5 +220,23 @@ void main() {
219220
final errorDialogs = tester.widgetList(find.byType(AlertDialog));
220221
check(errorDialogs).isEmpty();
221222
});
223+
224+
testWidgets('ZulipApiException', (tester) async {
225+
await setupAndTapSend(tester, prepareResponse: (message) {
226+
connection.prepare(
227+
httpStatus: 400,
228+
json: {
229+
'result': 'error',
230+
'code': 'BAD_REQUEST',
231+
'msg': 'You do not have permission to initiate direct message conversations.',
232+
});
233+
});
234+
final zulipLocalizations = GlobalLocalizations.zulipLocalizations;
235+
await tester.tap(find.byWidget(checkErrorDialog(tester,
236+
expectedTitle: zulipLocalizations.errorMessageNotSent,
237+
expectedMessage: zulipLocalizations.errorServerMessage(
238+
'You do not have permission to initiate direct message conversations.'),
239+
)));
240+
});
222241
});
223242
}

0 commit comments

Comments
 (0)