diff --git a/CHANGELOG.md b/CHANGELOG.md index 5888736d..38773913 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 0.3.5 + +- Fix: Performance issue caused by an out-of-sync Signal session +- Fix: Multiple smaller bug fixes + ## 0.3.3 - Fix: Multiple UI issues diff --git a/lib/src/visual/views/chats/chat_list_components/group_list_item.comp.dart b/lib/src/visual/views/chats/chat_list_components/group_list_item.comp.dart index 8c773cb0..b755e859 100644 --- a/lib/src/visual/views/chats/chat_list_components/group_list_item.comp.dart +++ b/lib/src/visual/views/chats/chat_list_components/group_list_item.comp.dart @@ -259,6 +259,7 @@ class _UserListItem extends State { : Row( children: [ LastMessageTimeComp( + key: ValueKey(widget.group.groupId), dateTime: widget.group.lastMessageExchange, ), FlameCounterWidget( @@ -281,7 +282,10 @@ class _UserListItem extends State { const Text('•'), const SizedBox(width: 5), if (_currentMessage != null) - LastMessageTimeComp(message: _currentMessage), + LastMessageTimeComp( + key: ValueKey(widget.group.groupId), + message: _currentMessage, + ), FlameCounterWidget( groupId: widget.group.groupId, prefix: true, diff --git a/lib/src/visual/views/chats/chat_list_components/last_message_time.comp.dart b/lib/src/visual/views/chats/chat_list_components/last_message_time.comp.dart index 3621e45a..7cefd901 100644 --- a/lib/src/visual/views/chats/chat_list_components/last_message_time.comp.dart +++ b/lib/src/visual/views/chats/chat_list_components/last_message_time.comp.dart @@ -19,41 +19,59 @@ class LastMessageTimeComp extends StatefulWidget { class _LastMessageTimeCompState extends State { Timer? updateTime; int lastMessageInSeconds = 0; + DateTime? targetTime; + StreamSubscription? _actionSubscription; @override void initState() { super.initState(); - // Change the color every 200 milliseconds - updateTime = Timer.periodic(const Duration(milliseconds: 500), ( - timer, - ) async { - if (widget.message != null) { - final lastAction = await twonlyDB.messagesDao.getLastMessageAction( - widget.message!.messageId, - ); - lastMessageInSeconds = clock - .now() - .difference(lastAction?.actionAt ?? widget.message!.createdAt) - .inSeconds; - } else if (widget.dateTime != null) { - lastMessageInSeconds = clock - .now() - .difference(widget.dateTime!) - .inSeconds; - } - if (mounted) { - setState(() { - if (lastMessageInSeconds < 0) { - lastMessageInSeconds = 0; - } - }); - } + _loadTargetTime(); + + updateTime = Timer.periodic( + const Duration(milliseconds: 500), + (_) => _updateSeconds(), + ); + } + + @override + void didUpdateWidget(LastMessageTimeComp oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.message?.messageId != widget.message?.messageId || + oldWidget.dateTime != widget.dateTime) { + _loadTargetTime(); + } + } + + void _loadTargetTime() { + _actionSubscription?.cancel(); + _actionSubscription = null; + + if (widget.message != null) { + _actionSubscription = twonlyDB.messagesDao + .watchLastMessageAction(widget.message!.messageId) + .listen((lastAction) { + targetTime = lastAction?.actionAt ?? widget.message!.createdAt; + _updateSeconds(); + }); + } else if (widget.dateTime != null) { + targetTime = widget.dateTime; + _updateSeconds(); + } + } + + void _updateSeconds() { + if (targetTime == null || !mounted) return; + + final seconds = clock.now().difference(targetTime!).inSeconds; + setState(() { + lastMessageInSeconds = seconds < 0 ? 0 : seconds; }); } @override void dispose() { updateTime?.cancel(); + _actionSubscription?.cancel(); super.dispose(); }