From 34ec8481e360bf5a2cc51a160a97a5db8f47f1ec Mon Sep 17 00:00:00 2001 From: otsmr Date: Mon, 10 Feb 2025 23:40:35 +0100 Subject: [PATCH] fix hopefully #15 --- lib/src/model/messages_model.dart | 5 ++- lib/src/utils/misc.dart | 17 ++++++++-- .../views/chats/chat_item_details_view.dart | 4 +-- lib/src/views/chats/chat_list_view.dart | 3 +- test/time_difference_test.dart | 31 +++++++++++++++++++ 5 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 test/time_difference_test.dart diff --git a/lib/src/model/messages_model.dart b/lib/src/model/messages_model.dart index b8ddcb3..092c86c 100644 --- a/lib/src/model/messages_model.dart +++ b/lib/src/model/messages_model.dart @@ -8,6 +8,7 @@ import 'package:twonly/src/app.dart'; import 'package:twonly/src/components/message_send_state_icon.dart'; import 'package:twonly/src/model/json/message.dart'; import 'package:twonly/src/providers/api/api.dart'; +import 'package:twonly/src/utils/misc.dart'; class DbMessage { DbMessage({ @@ -383,7 +384,9 @@ class DbMessages extends CvModelBase { if (messageOpenedAt != null) { messageOpenedAt = DateTime.tryParse(fromDb[i][columnMessageOpenedAt]); if (tmp is TextMessageContent && messageOpenedAt != null) { - if ((DateTime.now()).difference(messageOpenedAt).inHours >= 24) { + if (calculateTimeDifference(DateTime.now(), messageOpenedAt) + .inHours >= + 24) { deleteTextContent(fromDb[i][columnMessageId], tmp); } } diff --git a/lib/src/utils/misc.dart b/lib/src/utils/misc.dart index 267a5a1..70aa4b4 100644 --- a/lib/src/utils/misc.dart +++ b/lib/src/utils/misc.dart @@ -152,7 +152,7 @@ int getFlameCounter(List dates) { int flamesCount = 0; DateTime lastFlameCount = DateTime.now(); - if (dates[0].difference(lastFlameCount).inDays == 0) { + if (calculateTimeDifference(dates[0], lastFlameCount).inDays == 0) { flamesCount = 1; lastFlameCount = dates[0]; } @@ -161,7 +161,7 @@ int getFlameCounter(List dates) { for (int i = 1; i < dates.length; i++) { // print( // "${dates[i]} ${dates[i].difference(dates[i - 1]).inDays} ${dates[i].difference(lastFlameCount).inDays}"); - if (dates[i].difference(dates[i - 1]).inDays == 0) { + if (calculateTimeDifference(dates[i], dates[i - 1]).inDays == 0) { if (lastFlameCount.difference(dates[i]).inDays == 1) { flamesCount++; lastFlameCount = dates[i]; @@ -190,3 +190,16 @@ Future getFlamesForOtherUser(int otherUserId) async { // print("Received $a and send $b"); return min(a, b); } + +Duration calculateTimeDifference(DateTime now, DateTime startTime) { + // Get the timezone offsets + Duration nowOffset = now.timeZoneOffset; + Duration startTimeOffset = startTime.timeZoneOffset; + + // Convert both DateTime objects to UTC + DateTime nowInUTC = now.subtract(nowOffset); + DateTime startTimeInUTC = startTime.subtract(startTimeOffset); + + // Calculate the difference + return nowInUTC.difference(startTimeInUTC); +} diff --git a/lib/src/views/chats/chat_item_details_view.dart b/lib/src/views/chats/chat_item_details_view.dart index 71831cb..98c75b3 100644 --- a/lib/src/views/chats/chat_item_details_view.dart +++ b/lib/src/views/chats/chat_item_details_view.dart @@ -224,8 +224,8 @@ class _ChatItemDetailsViewState extends State { messages[i].messageOtherId != null); } if (messages[i].messageOpenedAt != null) { - if ((DateTime.now()) - .difference(messages[i].messageOpenedAt!) + if (calculateTimeDifference( + DateTime.now(), messages[i].messageOpenedAt!) .inHours >= 24) { return Container(); diff --git a/lib/src/views/chats/chat_list_view.dart b/lib/src/views/chats/chat_list_view.dart index f753fa4..daac4ee 100644 --- a/lib/src/views/chats/chat_list_view.dart +++ b/lib/src/views/chats/chat_list_view.dart @@ -158,7 +158,8 @@ class _UserListItem extends State { Widget build(BuildContext context) { if (widget.lastMessage != null) { lastMessageInSeconds = - DateTime.now().difference(widget.lastMessage!.sendAt).inSeconds; + calculateTimeDifference(DateTime.now(), widget.lastMessage!.sendAt) + .inSeconds; state = widget.lastMessage!.getSendState(); diff --git a/test/time_difference_test.dart b/test/time_difference_test.dart new file mode 100644 index 0000000..82a7182 --- /dev/null +++ b/test/time_difference_test.dart @@ -0,0 +1,31 @@ +// Function to calculate time difference +import 'package:flutter_test/flutter_test.dart'; +import 'package:twonly/src/utils/misc.dart'; + +void main() { + test('Time difference calculation between different time zones', () { + // Test case 1: Current time is in UTC and start time is in UTC+2 + DateTime now = DateTime.parse('2023-10-01T10:00:00Z'); // 10:00 UTC + DateTime startTime = + DateTime.parse('2023-10-01T12:00:00+02:00'); // 12:00 UTC+2 + + Duration difference = calculateTimeDifference(now, startTime); + expect(difference.inHours, equals(0)); // 10:00 UTC - 12:00 UTC+2 = 0 hours + + // Test case 2: Current time is in UTC-1 and start time is in UTC+1 + now = DateTime.parse('2023-10-01T09:00:00-01:00'); // 09:00 UTC-1 + startTime = DateTime.parse('2023-10-01T11:00:00+01:00'); // 11:00 UTC+1 + + difference = calculateTimeDifference(now, startTime); + expect( + difference.inHours, equals(0)); // 09:00 UTC-1 - 11:00 UTC+1 = 0 hours + + // Test case 3: Current time is in UTC+3 and start time is in UTC-1 + now = DateTime.parse('2023-10-01T15:00:00+03:00'); // 15:00 UTC+3 + startTime = DateTime.parse('2023-10-01T13:00:00-01:00'); // 13:00 UTC-1 + + difference = calculateTimeDifference(now, startTime); + expect( + difference.inHours, equals(-2)); // 15:00 UTC+3 - 13:00 UTC-1 = -2 hours + }); +}