diff --git a/lib/features/email/presentation/extensions/calendar_event_extension.dart b/lib/features/email/presentation/extensions/calendar_event_extension.dart index 3e5b7adae..d85ad3ddc 100644 --- a/lib/features/email/presentation/extensions/calendar_event_extension.dart +++ b/lib/features/email/presentation/extensions/calendar_event_extension.dart @@ -298,37 +298,46 @@ extension CalendarEventExtension on CalendarEvent { return false; } - String dateTimeStringForAllDayEvent(DateTime startDate, DateTime endDate) { - final timeZoneOffset = DateTime.now().timeZoneOffset.inHours; - final timeZoneOffsetAsString = timeZoneOffset >= 0 ? '+$timeZoneOffset' : '$timeZoneOffset'; - - final dateStart = formatDate(AppUtils.getCurrentDateLocale(), startDate); - + String dateTimeStringForAllDayEvent({ + required DateTime startDate, + required DateTime endDate, + required date_format.DateLocale dateLocale, + required String timeZone + }) { + final dateStart = formatDate(dateLocale, startDate); final endDateToDisplay = endDate.subtract(const Duration(days: 1)); - final dateEnd = formatDate(AppUtils.getCurrentDateLocale(), endDateToDisplay); + final dateEnd = formatDate(dateLocale, endDateToDisplay); if (DateUtils.isSameDay(startDate, endDateToDisplay)) { - return '$dateStart (GMT$timeZoneOffsetAsString)'; + return '$dateStart ($timeZone)'; } else { - return '$dateStart - $dateEnd (GMT$timeZoneOffsetAsString)'; + return '$dateStart - $dateEnd ($timeZone)'; } } - String get dateTimeEventAsString { + String getDateTimeEvent({ + required date_format.DateLocale dateLocale, + required String timeZone + }) { if (isAllDayEvent) { - return dateTimeStringForAllDayEvent(startUtcDate!.value, endUtcDate!.value); + return dateTimeStringForAllDayEvent( + startDate: startUtcDate!.value, + endDate: endUtcDate!.value, + dateLocale: dateLocale, + timeZone: timeZone, + ); } if (localStartDate != null && localEndDate != null) { - final timeStart = formatDateTime(AppUtils.getCurrentDateLocale(), localStartDate!); + final timeStart = formatDateTime(dateLocale, localStartDate!); final timeEnd = DateUtils.isSameDay(localStartDate, localEndDate) - ? formatTime(AppUtils.getCurrentDateLocale(), localEndDate!) - : formatDateTime(AppUtils.getCurrentDateLocale(), localEndDate!); + ? formatTime(dateLocale, localEndDate!) + : formatDateTime(dateLocale, localEndDate!); return '$timeStart - $timeEnd'; } else if (localStartDate != null) { - return formatDateTime(AppUtils.getCurrentDateLocale(), localStartDate!); + return formatDateTime(dateLocale, localStartDate!); } else if (localEndDate != null) { - return formatDateTime(AppUtils.getCurrentDateLocale(), localEndDate!); + return formatDateTime(dateLocale, localEndDate!); } else { return ''; } diff --git a/lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart index 1acc6e70b..231a4ea57 100644 --- a/lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart @@ -13,6 +13,7 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_location_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_time_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_title_widget.dart'; +import 'package:tmail_ui_user/main/utils/app_utils.dart'; class CalendarEventDetailWidget extends StatelessWidget { @@ -77,11 +78,7 @@ class CalendarEventDetailWidget extends StatelessWidget { onMailtoDelegateAction: onMailtoDelegateAction, ) ), - if (calendarEvent.dateTimeEventAsString.isNotEmpty) - Padding( - padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), - child: EventTimeWidgetWidget(timeEvent: calendarEvent.dateTimeEventAsString), - ), + _buildEventTimeWidget(), if (calendarEvent.videoConferences.isNotEmpty) Padding( padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), @@ -110,4 +107,19 @@ class CalendarEventDetailWidget extends StatelessWidget { ), ); } + + Widget _buildEventTimeWidget() { + final dateTimeEvent = calendarEvent.getDateTimeEvent( + dateLocale: AppUtils.getCurrentDateLocale(), + timeZone: AppUtils.getTimeZone() + ); + if (dateTimeEvent.isNotEmpty) { + return Padding( + padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), + child: EventTimeWidgetWidget(timeEvent: dateTimeEvent), + ); + } else { + return const SizedBox.shrink(); + } + } } diff --git a/lib/features/email/presentation/widgets/calendar_event/calendar_event_information_widget.dart b/lib/features/email/presentation/widgets/calendar_event/calendar_event_information_widget.dart index a2b1d0f44..d2ab65b8b 100644 --- a/lib/features/email/presentation/widgets/calendar_event/calendar_event_information_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/calendar_event_information_widget.dart @@ -7,14 +7,15 @@ import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart'; import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_event_extension.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/calendar_event_information_widget_styles.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_date_icon_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_action_button_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_attendee_information_widget.dart'; -import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_date_icon_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_location_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_location_information_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_time_information_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_title_widget.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/utils/app_utils.dart'; class CalendarEventInformationWidget extends StatelessWidget { @@ -94,11 +95,7 @@ class CalendarEventInformationWidget extends StatelessWidget { const SizedBox(height: CalendarEventInformationWidgetStyles.space), if (calendarEvent.title?.isNotEmpty == true) EventTitleWidget(title: calendarEvent.title!), - if (calendarEvent.dateTimeEventAsString.isNotEmpty) - Padding( - padding: const EdgeInsets.only(top: CalendarEventInformationWidgetStyles.fieldTopPadding), - child: EventTimeInformationWidget(timeEvent: calendarEvent.dateTimeEventAsString), - ), + _buildEventTimeInformationWidget(), if (calendarEvent.location?.isNotEmpty == true) Padding( padding: const EdgeInsets.only(top: CalendarEventInformationWidgetStyles.fieldTopPadding), @@ -168,11 +165,7 @@ class CalendarEventInformationWidget extends StatelessWidget { const SizedBox(height: CalendarEventInformationWidgetStyles.space), if (calendarEvent.title?.isNotEmpty == true) EventTitleWidget(title: calendarEvent.title!), - if (calendarEvent.dateTimeEventAsString.isNotEmpty) - Padding( - padding: const EdgeInsets.only(top: CalendarEventInformationWidgetStyles.fieldTopPadding), - child: EventTimeInformationWidget(timeEvent: calendarEvent.dateTimeEventAsString), - ), + _buildEventTimeInformationWidget(), if (calendarEvent.location?.isNotEmpty == true) Padding( padding: const EdgeInsets.only(top: CalendarEventInformationWidgetStyles.fieldTopPadding), @@ -202,4 +195,19 @@ class CalendarEventInformationWidget extends StatelessWidget { ), ); } + + Widget _buildEventTimeInformationWidget() { + final dateTimeEvent = calendarEvent.getDateTimeEvent( + dateLocale: AppUtils.getCurrentDateLocale(), + timeZone: AppUtils.getTimeZone() + ); + if (dateTimeEvent.isNotEmpty) { + return Padding( + padding: const EdgeInsets.only(top: CalendarEventInformationWidgetStyles.fieldTopPadding), + child: EventTimeInformationWidget(timeEvent: dateTimeEvent), + ); + } else { + return const SizedBox.shrink(); + } + } } \ No newline at end of file diff --git a/lib/main/utils/app_utils.dart b/lib/main/utils/app_utils.dart index 7b619502e..cfbde8b7a 100644 --- a/lib/main/utils/app_utils.dart +++ b/lib/main/utils/app_utils.dart @@ -68,4 +68,10 @@ class AppUtils { return const date_format.EnglishDateLocale(); } } + + static String getTimeZone() { + final timeZoneOffset = DateTime.now().timeZoneOffset.inHours; + final timeZoneOffsetAsString = timeZoneOffset >= 0 ? '+$timeZoneOffset' : '$timeZoneOffset'; + return 'GMT$timeZoneOffsetAsString'; + } } \ No newline at end of file diff --git a/test/features/features/email/presentation/extensions/calendar_event_extension_test.dart b/test/features/features/email/presentation/extensions/calendar_event_extension_test.dart index 5e52a74a6..193827bd3 100644 --- a/test/features/features/email/presentation/extensions/calendar_event_extension_test.dart +++ b/test/features/features/email/presentation/extensions/calendar_event_extension_test.dart @@ -1,3 +1,4 @@ +import 'package:date_format/date_format.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:jmap_dart_client/jmap/core/utc_date.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart'; @@ -18,7 +19,10 @@ void main() { endUtcDate: UTCDate(endDate), ); - final formattedDateString = calendarEvent.dateTimeEventAsString; + final formattedDateString = calendarEvent.getDateTimeEvent( + timeZone: 'GMT+0', + dateLocale: const EnglishDateLocale() + ); expect(formattedDateString, expectedFormattedDateString); }); @@ -36,7 +40,10 @@ void main() { endUtcDate: UTCDate(endDate), ); - final formattedDateString = calendarEvent.dateTimeEventAsString; + final formattedDateString = calendarEvent.getDateTimeEvent( + timeZone: 'GMT+0', + dateLocale: const EnglishDateLocale() + ); expect(formattedDateString, expectedFormattedDateString); });