diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 5e30ff62..1495825f 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -86,6 +86,18 @@ "type": "text", "description": "Usage hint for the command /myroomavatar" }, + "commandInvalid": "Command invalid", + "@commandInvalid": { + "type": "text" + }, + "commandMissing": "{command} is not a command.", + "@commandMissing": { + "type": "text", + "placeholders": { + "command": {} + }, + "description": "State that {command} is not a valid /command." + }, "editRoomAliases": "Edit room aliases", "@editRoomAliases": { "type": "text", @@ -1849,6 +1861,10 @@ "type": "text", "placeholders": {} }, + "sendAsText": "Send as text", + "@sendAsText": { + "type": "text" + }, "sendAudio": "Send audio", "@sendAudio": { "type": "text", diff --git a/lib/pages/chat.dart b/lib/pages/chat.dart index ccc9814c..ad5dd3f6 100644 --- a/lib/pages/chat.dart +++ b/lib/pages/chat.dart @@ -215,10 +215,31 @@ class ChatController extends State { TextEditingController sendController = TextEditingController(); - void send() { + Future send() async { if (sendController.text.trim().isEmpty) return; + var parseCommands = true; + + final commandMatch = RegExp(r'^\/(\w+)').firstMatch(sendController.text); + if (commandMatch != null && + !room.client.commands.keys.contains(commandMatch[1].toLowerCase())) { + final l10n = L10n.of(context); + final dialogResult = await showOkCancelAlertDialog( + context: context, + useRootNavigator: false, + title: l10n.commandInvalid, + message: l10n.commandMissing(commandMatch[0]), + okLabel: l10n.sendAsText, + cancelLabel: l10n.cancel, + ); + if (dialogResult == null || dialogResult == OkCancelResult.cancel) return; + parseCommands = false; + } + + // ignore: unawaited_futures room.sendTextEvent(sendController.text, - inReplyTo: replyEvent, editEventId: editEvent?.eventId); + inReplyTo: replyEvent, + editEventId: editEvent?.eventId, + parseCommands: parseCommands); sendController.value = TextEditingValue( text: pendingText, selection: TextSelection.collapsed(offset: 0),