diff --git a/lib/src/visual/views/chats/chat_messages.view.dart b/lib/src/visual/views/chats/chat_messages.view.dart index 0e4c856e..46077800 100644 --- a/lib/src/visual/views/chats/chat_messages.view.dart +++ b/lib/src/visual/views/chats/chat_messages.view.dart @@ -146,7 +146,9 @@ class _ChatMessagesViewState extends State _nextTypingIndicator = Timer.periodic(const Duration(seconds: 2), ( _, ) async { - await sendTypingIndication(widget.groupId, false); + if (_isViewActive()) { + await sendTypingIndication(widget.groupId, false); + } }); } } diff --git a/lib/src/visual/views/chats/chat_messages_components/message_input.dart b/lib/src/visual/views/chats/chat_messages_components/message_input.dart index cc54579c..f2e8a192 100644 --- a/lib/src/visual/views/chats/chat_messages_components/message_input.dart +++ b/lib/src/visual/views/chats/chat_messages_components/message_input.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; import 'package:audio_waveforms/audio_waveforms.dart'; +import 'package:clock/clock.dart'; import 'package:drift/drift.dart' show Value; import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; import 'package:flutter/material.dart'; @@ -51,6 +52,7 @@ class _MessageInputState extends State { Offset _recordingOffset = Offset.zero; RecordingState _recordingState = RecordingState.none; Timer? _nextTypingIndicator; + DateTime? _lastTextChangeTime; Future _sendMessage() async { if (_textFieldController.text == '') return; @@ -70,6 +72,7 @@ class _MessageInputState extends State { void initState() { super.initState(); _textFieldController = TextEditingController(); + _textFieldController.addListener(_handleTextChange); if (widget.group.draftMessage != null) { _textFieldController.text = widget.group.draftMessage!; } @@ -78,7 +81,10 @@ class _MessageInputState extends State { _nextTypingIndicator = Timer.periodic(const Duration(seconds: 1), ( _, ) async { - if (widget.textFieldFocus.hasFocus) { + if (widget.textFieldFocus.hasFocus && + _lastTextChangeTime != null && + DateTime.now().difference(_lastTextChangeTime!) <= + const Duration(seconds: 6)) { await sendTypingIndication(widget.group.groupId, true); } }); @@ -88,6 +94,7 @@ class _MessageInputState extends State { @override void dispose() { + _textFieldController.removeListener(_handleTextChange); widget.textFieldFocus.removeListener(_handleTextFocusChange); widget.textFieldFocus.dispose(); recorderController.dispose(); @@ -105,6 +112,10 @@ class _MessageInputState extends State { }); } + void _handleTextChange() { + _lastTextChangeTime = clock.now(); + } + void _handleTextFocusChange() { if (widget.textFieldFocus.hasFocus) { setState(() {