fix timer issues

This commit is contained in:
otsmr 2026-07-09 16:35:42 +02:00
parent 2cee00aff6
commit cda52a5da8
3 changed files with 53 additions and 26 deletions

View file

@ -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

View file

@ -259,6 +259,7 @@ class _UserListItem extends State<GroupListItemComp> {
: Row(
children: [
LastMessageTimeComp(
key: ValueKey(widget.group.groupId),
dateTime: widget.group.lastMessageExchange,
),
FlameCounterWidget(
@ -281,7 +282,10 @@ class _UserListItem extends State<GroupListItemComp> {
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,

View file

@ -19,41 +19,59 @@ class LastMessageTimeComp extends StatefulWidget {
class _LastMessageTimeCompState extends State<LastMessageTimeComp> {
Timer? updateTime;
int lastMessageInSeconds = 0;
DateTime? targetTime;
StreamSubscription<MessageAction?>? _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();
}