From 01ad8471ccea34a6c4d8bafcc14d83f877f2a17c Mon Sep 17 00:00:00 2001 From: zjs81 Date: Thu, 2 Apr 2026 19:52:43 -0700 Subject: [PATCH] fix: improve message sending logic and handle range download errors in translation service --- lib/screens/channel_chat_screen.dart | 14 +++++--------- lib/screens/chat_screen.dart | 6 ++---- lib/services/translation_service.dart | 8 ++++++-- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/lib/screens/channel_chat_screen.dart b/lib/screens/channel_chat_screen.dart index f413694..57e1dfe 100644 --- a/lib/screens/channel_chat_screen.dart +++ b/lib/screens/channel_chat_screen.dart @@ -1162,13 +1162,6 @@ class _ChannelChatScreenState extends State { } _lastChannelSendAt = now; - // Capture reply state before clearing, then clear input synchronously - // to prevent double-send during async translation. - final replyingTo = _replyingToMessage; - _textController.clear(); - _cancelReply(); - _textFieldFocusNode.requestFocus(); - final connector = context.read(); final settings = context.read().settings; final translationService = context.read(); @@ -1200,8 +1193,8 @@ class _ChannelChatScreenState extends State { } } } - if (replyingTo != null) { - messageText = '@[${replyingTo.senderName}] $messageText'; + if (_replyingToMessage != null) { + messageText = '@[${_replyingToMessage!.senderName}] $messageText'; } final maxBytes = maxChannelMessageBytes(connector.selfName); @@ -1212,6 +1205,9 @@ class _ChannelChatScreenState extends State { return; } + _textController.clear(); + _cancelReply(); + _textFieldFocusNode.requestFocus(); connector.sendChannelMessage( widget.channel, messageText, diff --git a/lib/screens/chat_screen.dart b/lib/screens/chat_screen.dart index 5f9a2ee..cdb31f1 100644 --- a/lib/screens/chat_screen.dart +++ b/lib/screens/chat_screen.dart @@ -642,10 +642,6 @@ class _ChatScreenState extends State { } _lastTextSendAt = now; - // Clear input synchronously to prevent double-send - _textController.clear(); - _textFieldFocusNode.requestFocus(); - final settings = context.read().settings; final translationService = context.read(); var outgoingText = text; @@ -683,6 +679,8 @@ class _ChatScreenState extends State { return; } + _textController.clear(); + _textFieldFocusNode.requestFocus(); connector.sendMessage( _resolveContact(connector), outgoingText, diff --git a/lib/services/translation_service.dart b/lib/services/translation_service.dart index 3dd65d5..1f7c80a 100644 --- a/lib/services/translation_service.dart +++ b/lib/services/translation_service.dart @@ -317,8 +317,12 @@ class TranslationService extends ChangeNotifier { final request = http.Request('GET', uri); request.headers['Range'] = 'bytes=$start-$end'; final response = await client.send(request); - if (response.statusCode != 206 && response.statusCode != 200) { - throw StateError('Range download failed: HTTP ${response.statusCode}'); + if (response.statusCode != 206) { + await response.stream.drain(); + throw StateError( + 'Range download failed: HTTP ${response.statusCode}' + '${response.statusCode == 200 ? ' (server ignored Range header)' : ''}', + ); } final trackedStream = _trackDownloadProgress(response.stream); await _fileStore.writeModelBytes(