From 481443379012ccb29e8322508a5d98986d20ecf0 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 27 Jul 2023 09:30:56 +0700 Subject: [PATCH 01/14] TF-2057 Add event title widget --- ...endar_event_information_widget_styles.dart | 1 - .../styles/event_title_widget_styles.dart | 4 ++++ .../calendar_event_information_widget.dart | 21 +++++------------- .../calendar_event/event_title_widget.dart | 22 +++++++++++++++++++ 4 files changed, 31 insertions(+), 17 deletions(-) create mode 100644 lib/features/email/presentation/styles/event_title_widget_styles.dart create mode 100644 lib/features/email/presentation/widgets/calendar_event/event_title_widget.dart diff --git a/lib/features/email/presentation/styles/calendar_event_information_widget_styles.dart b/lib/features/email/presentation/styles/calendar_event_information_widget_styles.dart index 4ef35f7ff1..507a7b643c 100644 --- a/lib/features/email/presentation/styles/calendar_event_information_widget_styles.dart +++ b/lib/features/email/presentation/styles/calendar_event_information_widget_styles.dart @@ -11,7 +11,6 @@ class CalendarEventInformationWidgetStyles { static const Color calendarDateIconBackgroundColor = AppColor.colorCalendarEventInformationBackground; static const double calendarInformationMargin = 16; static const double invitationMessageTextSize = 16; - static const double titleTextSize = 24; static const double fieldTopPadding = 16; static const double space = 8; static const Color titleColor = Colors.black; diff --git a/lib/features/email/presentation/styles/event_title_widget_styles.dart b/lib/features/email/presentation/styles/event_title_widget_styles.dart new file mode 100644 index 0000000000..fdcf622414 --- /dev/null +++ b/lib/features/email/presentation/styles/event_title_widget_styles.dart @@ -0,0 +1,4 @@ + +class EventTitleWidgetStyles { + static const double textSize = 24; +} \ No newline at end of file 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 ed1cde64b8..62062c4102 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 @@ -10,6 +10,7 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event 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_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'; class CalendarEventInformationWidget extends StatelessWidget { @@ -82,14 +83,8 @@ class CalendarEventInformationWidget extends StatelessWidget { ) ), const SizedBox(height: CalendarEventInformationWidgetStyles.space), - Text( - calendarEvent.title ?? '', - style: const TextStyle( - fontWeight: FontWeight.w500, - fontSize: CalendarEventInformationWidgetStyles.titleTextSize, - color: CalendarEventInformationWidgetStyles.titleColor - ) - ), + if (calendarEvent.title?.isNotEmpty == true) + EventTitleWidget(title: calendarEvent.title!), if (calendarEvent.dateTimeEventAsString.isNotEmpty) Padding( padding: const EdgeInsets.only(top: CalendarEventInformationWidgetStyles.fieldTopPadding), @@ -153,14 +148,8 @@ class CalendarEventInformationWidget extends StatelessWidget { ) ), const SizedBox(height: CalendarEventInformationWidgetStyles.space), - Text( - calendarEvent.title ?? '', - style: const TextStyle( - fontWeight: FontWeight.w500, - fontSize: CalendarEventInformationWidgetStyles.titleTextSize, - color: CalendarEventInformationWidgetStyles.titleColor - ) - ), + if (calendarEvent.title?.isNotEmpty == true) + EventTitleWidget(title: calendarEvent.title!), if (calendarEvent.dateTimeEventAsString.isNotEmpty) Padding( padding: const EdgeInsets.only(top: CalendarEventInformationWidgetStyles.fieldTopPadding), diff --git a/lib/features/email/presentation/widgets/calendar_event/event_title_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_title_widget.dart new file mode 100644 index 0000000000..416a685476 --- /dev/null +++ b/lib/features/email/presentation/widgets/calendar_event/event_title_widget.dart @@ -0,0 +1,22 @@ + +import 'package:flutter/material.dart'; +import 'package:tmail_ui_user/features/email/presentation/styles/event_title_widget_styles.dart'; + +class EventTitleWidget extends StatelessWidget { + + final String title; + + const EventTitleWidget({super.key, required this.title}); + + @override + Widget build(BuildContext context) { + return Text( + title, + style: const TextStyle( + fontWeight: FontWeight.w500, + fontSize: EventTitleWidgetStyles.textSize, + color: Colors.black + ) + ); + } +} \ No newline at end of file From a0100cd3ac702a8a6d0e4b05ecefcbbde8a4982e Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 27 Jul 2023 16:32:46 +0700 Subject: [PATCH 02/14] TF-2057 Add event time detail widget --- .../extensions/color_extension.dart | 1 + .../event_time_detail_widget_styles.dart | 5 +++ .../event_time_detail_widget.dart | 43 +++++++++++++++++++ lib/l10n/intl_messages.arb | 20 ++++++++- lib/main/localizations/app_localizations.dart | 19 ++++++++ 5 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 lib/features/email/presentation/styles/event_time_detail_widget_styles.dart create mode 100644 lib/features/email/presentation/widgets/calendar_event/event_time_detail_widget.dart diff --git a/core/lib/presentation/extensions/color_extension.dart b/core/lib/presentation/extensions/color_extension.dart index 2d26a5607e..680f0bc6a0 100644 --- a/core/lib/presentation/extensions/color_extension.dart +++ b/core/lib/presentation/extensions/color_extension.dart @@ -195,6 +195,7 @@ extension AppColor on Color { static const colorCalendarEventInformationStroke = Color(0x1F000000); static const colorShadowCalendarDateIcon = Color(0x26000000); static const colorOrganizerMailto = Color(0xFFB3B3B3); + static const colorMailto = Color(0xFFB3B3B3); static const mapGradientColor = [ [Color(0xFF21D4FD), Color(0xFFB721FF)], diff --git a/lib/features/email/presentation/styles/event_time_detail_widget_styles.dart b/lib/features/email/presentation/styles/event_time_detail_widget_styles.dart new file mode 100644 index 0000000000..ca2c78ecfc --- /dev/null +++ b/lib/features/email/presentation/styles/event_time_detail_widget_styles.dart @@ -0,0 +1,5 @@ + +class EventTimeDetailWidgetStyles { + static const double maxWidth = 100; + static const double textSize = 16; +} \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/calendar_event/event_time_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_time_detail_widget.dart new file mode 100644 index 0000000000..487034d282 --- /dev/null +++ b/lib/features/email/presentation/widgets/calendar_event/event_time_detail_widget.dart @@ -0,0 +1,43 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:tmail_ui_user/features/email/presentation/styles/event_time_detail_widget_styles.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class EventTimeWidgetWidget extends StatelessWidget { + + final String timeEvent; + + const EventTimeWidgetWidget({ + super.key, + required this.timeEvent + }); + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: EventTimeDetailWidgetStyles.maxWidth, + child: Text( + AppLocalizations.of(context).time, + style: const TextStyle( + fontSize: EventTimeDetailWidgetStyles.textSize, + fontWeight: FontWeight.w500, + color: AppColor.colorSubTitleEventActionText + ), + ), + ), + Expanded(child: Text( + timeEvent, + style: const TextStyle( + fontSize: EventTimeDetailWidgetStyles.textSize, + fontWeight: FontWeight.w500, + color: Colors.black + ), + )) + ], + ); + } +} \ No newline at end of file diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index b5aa0216c2..7318d458a9 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2023-07-26T18:42:34.026265", + "@@last_modified": "2023-07-27T12:18:46.254059", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -3077,5 +3077,23 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "time": "Time", + "@time": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "location": "Location", + "@location": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "attendees": "Attendees", + "@attendees": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index f4102265b6..b1fc129668 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -3173,4 +3173,23 @@ class AppLocalizations { 'Organizer', name: 'organizer'); } + + String get time { + return Intl.message( + 'Time', + name: 'time', + ); + } + + String get location { + return Intl.message( + 'Location', + name: 'location'); + } + + String get attendees { + return Intl.message( + 'Attendees', + name: 'attendees'); + } } \ No newline at end of file From 7b1abc5eefb20a5980043a5fb94e09e404d09373 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 27 Jul 2023 16:32:58 +0700 Subject: [PATCH 03/14] TF-2057 Add event location detail widget --- .../event_location_detail_widget_styles.dart | 5 +++ .../event_location_detail_widget.dart | 43 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 lib/features/email/presentation/styles/event_location_detail_widget_styles.dart create mode 100644 lib/features/email/presentation/widgets/calendar_event/event_location_detail_widget.dart diff --git a/lib/features/email/presentation/styles/event_location_detail_widget_styles.dart b/lib/features/email/presentation/styles/event_location_detail_widget_styles.dart new file mode 100644 index 0000000000..94030be48e --- /dev/null +++ b/lib/features/email/presentation/styles/event_location_detail_widget_styles.dart @@ -0,0 +1,5 @@ + +class EventLocationDetailWidgetStyles { + static const double maxWidth = 100; + static const double textSize = 16; +} \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/calendar_event/event_location_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_location_detail_widget.dart new file mode 100644 index 0000000000..fef6ba7aae --- /dev/null +++ b/lib/features/email/presentation/widgets/calendar_event/event_location_detail_widget.dart @@ -0,0 +1,43 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:tmail_ui_user/features/email/presentation/styles/event_location_detail_widget_styles.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class EventLocationDetailWidget extends StatelessWidget { + + final String locationEvent; + + const EventLocationDetailWidget({ + super.key, + required this.locationEvent + }); + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: EventLocationDetailWidgetStyles.maxWidth, + child: Text( + AppLocalizations.of(context).location, + style: const TextStyle( + fontSize: EventLocationDetailWidgetStyles.textSize, + fontWeight: FontWeight.w500, + color: AppColor.colorSubTitleEventActionText + ), + ), + ), + Expanded(child: Text( + locationEvent, + style: const TextStyle( + fontSize: EventLocationDetailWidgetStyles.textSize, + fontWeight: FontWeight.w500, + color: Colors.black + ), + )) + ], + ); + } +} \ No newline at end of file From d39b6c57e9ef1615c3e11ab3fdbe306c6be1e32f Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 27 Jul 2023 16:34:48 +0700 Subject: [PATCH 04/14] TF-2057 Add event attendees detail widget --- .../styles/attendee_widget_styles.dart | 5 ++ .../event_attendee_detail_widget_styles.dart | 5 ++ .../calendar_event/attendee_widget.dart | 48 +++++++++++++ .../event_attendee_detail_widget.dart | 68 +++++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 lib/features/email/presentation/styles/attendee_widget_styles.dart create mode 100644 lib/features/email/presentation/styles/event_attendee_detail_widget_styles.dart create mode 100644 lib/features/email/presentation/widgets/calendar_event/attendee_widget.dart create mode 100644 lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart diff --git a/lib/features/email/presentation/styles/attendee_widget_styles.dart b/lib/features/email/presentation/styles/attendee_widget_styles.dart new file mode 100644 index 0000000000..cbc59f6dbf --- /dev/null +++ b/lib/features/email/presentation/styles/attendee_widget_styles.dart @@ -0,0 +1,5 @@ + +class AttendeeWidgetStyles { + static const double maxWidth = 100; + static const double textSize = 16; +} \ No newline at end of file diff --git a/lib/features/email/presentation/styles/event_attendee_detail_widget_styles.dart b/lib/features/email/presentation/styles/event_attendee_detail_widget_styles.dart new file mode 100644 index 0000000000..93449a1f4e --- /dev/null +++ b/lib/features/email/presentation/styles/event_attendee_detail_widget_styles.dart @@ -0,0 +1,5 @@ + +class EventAttendeeDetailWidgetStyles { + static const double maxWidth = 100; + static const double textSize = 16; +} \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/calendar_event/attendee_widget.dart b/lib/features/email/presentation/widgets/calendar_event/attendee_widget.dart new file mode 100644 index 0000000000..91053ee44c --- /dev/null +++ b/lib/features/email/presentation/widgets/calendar_event/attendee_widget.dart @@ -0,0 +1,48 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:jmap_dart_client/jmap/mail/calendar/properties/attendee/calendar_attendee.dart'; +import 'package:jmap_dart_client/jmap/mail/calendar/properties/calendar_organizer.dart'; +import 'package:tmail_ui_user/features/email/presentation/styles/attendee_widget_styles.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class AttendeeWidget extends StatelessWidget { + + final CalendarAttendee attendee; + final CalendarOrganizer organizer; + + const AttendeeWidget({ + super.key, + required this.attendee, + required this.organizer + }); + + @override + Widget build(BuildContext context) { + return RichText( + text: TextSpan( + style: const TextStyle( + fontSize: AttendeeWidgetStyles.textSize, + fontWeight: FontWeight.w500, + color: Colors.black + ), + children: [ + if (attendee.name?.name.isNotEmpty == true) + TextSpan(text: attendee.name!.name), + if (attendee.mailto?.mailAddress.value.isNotEmpty == true) + TextSpan( + text: ' <${attendee.mailto!.mailAddress.value}> ', + style: const TextStyle( + color: AppColor.colorMailto, + fontSize: AttendeeWidgetStyles.textSize, + fontWeight: FontWeight.w500 + ), + ), + if (attendee.mailto?.mailAddress == organizer.mailto) + TextSpan(text: '(${AppLocalizations.of(context).organizer})'), + const TextSpan(text: ', '), + ] + ) + ); + } +} \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart new file mode 100644 index 0000000000..7b4a0333d1 --- /dev/null +++ b/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart @@ -0,0 +1,68 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:jmap_dart_client/jmap/mail/calendar/properties/attendee/calendar_attendee.dart'; +import 'package:jmap_dart_client/jmap/mail/calendar/properties/calendar_organizer.dart'; +import 'package:tmail_ui_user/features/email/presentation/extensions/list_attendee_extension.dart'; +import 'package:tmail_ui_user/features/email/presentation/styles/event_attendee_detail_widget_styles.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/attendee_widget.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class EventAttendeeDetailWidget extends StatelessWidget { + + static const int _maxAttendeeDisplayed = 5; + + final List attendees; + final CalendarOrganizer organizer; + + const EventAttendeeDetailWidget({ + super.key, + required this.attendees, + required this.organizer + }); + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: EventAttendeeDetailWidgetStyles.maxWidth, + child: Text( + AppLocalizations.of(context).attendees, + style: const TextStyle( + fontSize: EventAttendeeDetailWidgetStyles.textSize, + fontWeight: FontWeight.w500, + color: AppColor.colorSubTitleEventActionText + ), + ), + ), + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (attendeeOrganizer != null) + AttendeeWidget(attendee: attendeeOrganizer!, organizer: organizer), + ..._attendeesDisplayed + .map((attendee) => AttendeeWidget(attendee: attendee, organizer: organizer)) + .toList() + ] + )) + ], + ); + } + + CalendarAttendee? get attendeeOrganizer { + try { + return attendees.firstWhere((attendee) => attendee.mailto?.mailAddress == organizer.mailto); + } catch (e) { + return null; + } + } + + List get _attendeesDisplayed { + final attendeesWithoutOrganizer = attendees.withoutOrganizer(organizer); + return attendeesWithoutOrganizer.length > _maxAttendeeDisplayed + ? attendeesWithoutOrganizer.sublist(0, _maxAttendeeDisplayed - 1) + : attendeesWithoutOrganizer; + } +} \ No newline at end of file From 0aae9980cf041cfb825e700a8dee456ab3879fb9 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 27 Jul 2023 18:41:08 +0700 Subject: [PATCH 05/14] TF-2057 Add event description detail widget --- assets/images/ic_format_quote.svg | 5 ++ .../extensions/color_extension.dart | 1 + .../presentation/resources/image_paths.dart | 1 + ...vent_description_detail_widget_styles.dart | 7 +++ .../event_description_detail_widget.dart | 47 +++++++++++++++++++ 5 files changed, 61 insertions(+) create mode 100644 assets/images/ic_format_quote.svg create mode 100644 lib/features/email/presentation/styles/event_description_detail_widget_styles.dart create mode 100644 lib/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart diff --git a/assets/images/ic_format_quote.svg b/assets/images/ic_format_quote.svg new file mode 100644 index 0000000000..6806d928a4 --- /dev/null +++ b/assets/images/ic_format_quote.svg @@ -0,0 +1,5 @@ + + + diff --git a/core/lib/presentation/extensions/color_extension.dart b/core/lib/presentation/extensions/color_extension.dart index 680f0bc6a0..34b2157184 100644 --- a/core/lib/presentation/extensions/color_extension.dart +++ b/core/lib/presentation/extensions/color_extension.dart @@ -196,6 +196,7 @@ extension AppColor on Color { static const colorShadowCalendarDateIcon = Color(0x26000000); static const colorOrganizerMailto = Color(0xFFB3B3B3); static const colorMailto = Color(0xFFB3B3B3); + static const colorEventDescriptionBackground = Color(0x05000000); static const mapGradientColor = [ [Color(0xFF21D4FD), Color(0xFFB721FF)], diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart index d5a010dd7c..cea00d9f59 100644 --- a/core/lib/presentation/resources/image_paths.dart +++ b/core/lib/presentation/resources/image_paths.dart @@ -198,6 +198,7 @@ class ImagePaths { String get icEventInvited => _getImagePath('ic_event_invited.svg'); String get icEventUpdated => _getImagePath('ic_event_updated.svg'); String get icEventCanceled => _getImagePath('ic_event_canceled.svg'); + String get icFormatQuote => _getImagePath('ic_format_quote.svg'); String _getImagePath(String imageName) { return AssetsPaths.images + imageName; diff --git a/lib/features/email/presentation/styles/event_description_detail_widget_styles.dart b/lib/features/email/presentation/styles/event_description_detail_widget_styles.dart new file mode 100644 index 0000000000..427b7a794b --- /dev/null +++ b/lib/features/email/presentation/styles/event_description_detail_widget_styles.dart @@ -0,0 +1,7 @@ + +class EventDescriptionDetailWidgetStyles { + static const double textSize = 16; + static const double borderRadius = 16; + static const double contentPadding = 16; + static const double fieldTopPadding = 16; +} \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart new file mode 100644 index 0000000000..c430c54201 --- /dev/null +++ b/lib/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart @@ -0,0 +1,47 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/email/presentation/styles/event_description_detail_widget_styles.dart'; + +class EventDescriptionDetailWidget extends StatelessWidget { + + final String description; + + const EventDescriptionDetailWidget({ + super.key, + required this.description + }); + + @override + Widget build(BuildContext context) { + final imagePath = Get.find(); + return Container( + clipBehavior: Clip.antiAlias, + decoration: const BoxDecoration( + color: AppColor.colorEventDescriptionBackground, + borderRadius: BorderRadius.all(Radius.circular(EventDescriptionDetailWidgetStyles.borderRadius)), + ), + padding: const EdgeInsetsDirectional.all(EventDescriptionDetailWidgetStyles.contentPadding), + child: Stack( + children: [ + Text( + description, + style: const TextStyle( + fontWeight: FontWeight.w500, + fontSize: EventDescriptionDetailWidgetStyles.textSize, + color: Colors.black + ) + ), + PositionedDirectional( + top: 0, + end: 0, + child: SvgPicture.asset(imagePath.icFormatQuote) + ) + ], + ), + ); + } +} \ No newline at end of file From bd44f671cac8b83bada96fc19c256c361b0d42c7 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 27 Jul 2023 18:41:33 +0700 Subject: [PATCH 06/14] TF-2057 Add calendar event detail widget --- .../email/presentation/email_view.dart | 10 +++ .../calendar_event_detail_widget_styles.dart | 9 +++ .../calendar_event_detail_widget.dart | 73 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 lib/features/email/presentation/styles/calendar_event_detail_widget_styles.dart create mode 100644 lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index f47912de2e..f9d844fc46 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -29,6 +29,7 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/app_bar_mail_w import 'package:tmail_ui_user/features/email/presentation/widgets/attachment_file_tile_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/bottom_bar_mail_widget_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_action_banner_widget.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_information_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/information_sender_and_receiver_builder.dart'; @@ -302,6 +303,15 @@ class EmailView extends GetWidget with AppLoaderMixin { return const SizedBox.shrink(); } }), + Obx(() { + if (controller.calendarEvent.value != null) { + return CalendarEventDetailWidget( + calendarEvent: controller.calendarEvent.value! + ); + } else { + return const SizedBox.shrink(); + } + }), if (PlatformInfo.isWeb) Expanded(child: Padding( padding: const EdgeInsetsDirectional.only(start: 16, bottom: 16), diff --git a/lib/features/email/presentation/styles/calendar_event_detail_widget_styles.dart b/lib/features/email/presentation/styles/calendar_event_detail_widget_styles.dart new file mode 100644 index 0000000000..f76e337173 --- /dev/null +++ b/lib/features/email/presentation/styles/calendar_event_detail_widget_styles.dart @@ -0,0 +1,9 @@ + +class CalendarEventDetailWidgetStyles { + static const double textSize = 24; + static const double borderRadius = 16; + static const double verticalMargin = 12; + static const double horizontalMargin = 16; + static const double contentPadding = 16; + static const double fieldTopPadding = 16; +} \ No newline at end of file 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 new file mode 100644 index 0000000000..d0e2f5140e --- /dev/null +++ b/lib/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart @@ -0,0 +1,73 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.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_detail_widget_styles.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_description_detail_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_time_detail_widget.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_title_widget.dart'; + +class CalendarEventDetailWidget extends StatelessWidget { + + final CalendarEvent calendarEvent; + + const CalendarEventDetailWidget({ + super.key, + required this.calendarEvent + }); + + @override + Widget build(BuildContext context) { + return Container( + clipBehavior: Clip.antiAlias, + decoration: const ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 0.5, + color: AppColor.colorCalendarEventInformationStroke, + ), + borderRadius: BorderRadius.all(Radius.circular(CalendarEventDetailWidgetStyles.borderRadius)), + ), + ), + margin: const EdgeInsetsDirectional.symmetric( + vertical: CalendarEventDetailWidgetStyles.verticalMargin, + horizontal: CalendarEventDetailWidgetStyles.horizontalMargin), + padding: const EdgeInsets.all(CalendarEventDetailWidgetStyles.contentPadding), + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (calendarEvent.title?.isNotEmpty == true) + EventTitleWidget(title: calendarEvent.title!), + if (calendarEvent.description?.isNotEmpty == true) + Padding( + padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), + child: EventDescriptionDetailWidget(description: calendarEvent.description!) + ), + if (calendarEvent.dateTimeEventAsString.isNotEmpty) + Padding( + padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), + child: EventTimeWidgetWidget(timeEvent: calendarEvent.dateTimeEventAsString), + ), + if (calendarEvent.location?.isNotEmpty == true) + Padding( + padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), + child: EventLocationDetailWidget(locationEvent: calendarEvent.location!), + ), + if (calendarEvent.participants?.isNotEmpty == true && calendarEvent.organizer != null) + Padding( + padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), + child: EventAttendeeDetailWidget( + attendees: calendarEvent.participants!, + organizer: calendarEvent.organizer!, + ), + ), + ], + ), + ); + } +} From 3e3afd963f1014894e33944b22e40620453a3ffd Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 28 Jul 2023 00:27:11 +0700 Subject: [PATCH 07/14] TF-2057 Hide email content as html when has calendar event --- .../email/presentation/email_view.dart | 130 +++++++++--------- 1 file changed, 67 insertions(+), 63 deletions(-) diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index f9d844fc46..b4cc816f5b 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -23,6 +23,7 @@ import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/base/widget/custom_scroll_behavior.dart'; import 'package:tmail_ui_user/features/base/widget/popup_item_widget.dart'; import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart'; +import 'package:tmail_ui_user/features/email/domain/state/parse_calendar_event_state.dart'; import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/email_view_styles.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/app_bar_mail_widget_builder.dart'; @@ -229,7 +230,7 @@ class EmailView extends GetWidget with AppLoaderMixin { } Widget _buildEmailBody(BuildContext context, PresentationEmail email) { - if (PlatformInfo.isWeb) { + if (PlatformInfo.isWeb && !email.hasCalendarEvent) { return _buildEmailMessage(context, email); } else { return SingleChildScrollView( @@ -282,63 +283,55 @@ class EmailView extends GetWidget with AppLoaderMixin { imagePaths: imagePaths, responsiveUtils: responsiveUtils, ), - _buildLoadingContentView(), _buildAttachments(context), - Obx(() { - if (controller.calendarEvent.value != null) { - return CalendarEventInformationWidget( - calendarEvent: controller.calendarEvent.value! - ); - } else { - return const SizedBox.shrink(); - } - }), - Obx(() { - if (controller.calendarEvent.value != null) { - return CalendarEventActionBannerWidget( - calendarEvent: controller.calendarEvent.value!, - listFromEmailAddress: controller.currentEmail?.from - ); - } else { - return const SizedBox.shrink(); - } - }), - Obx(() { - if (controller.calendarEvent.value != null) { - return CalendarEventDetailWidget( - calendarEvent: controller.calendarEvent.value! - ); - } else { - return const SizedBox.shrink(); - } - }), - if (PlatformInfo.isWeb) - Expanded(child: Padding( - padding: const EdgeInsetsDirectional.only(start: 16, bottom: 16), - child: _buildEmailContent(context, constraints, email) - )) + _buildLoadingContentView(email), + if (email.hasCalendarEvent) + Obx(() { + if (controller.calendarEvent.value != null) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + CalendarEventInformationWidget( + calendarEvent: controller.calendarEvent.value! + ), + CalendarEventActionBannerWidget( + calendarEvent: controller.calendarEvent.value!, + listFromEmailAddress: controller.currentEmail?.from + ), + CalendarEventDetailWidget( + calendarEvent: controller.calendarEvent.value! + ), + ], + ); + } else { + return const SizedBox.shrink(); + } + }) else - Padding( - padding: const EdgeInsetsDirectional.symmetric( - vertical: EmailViewStyles.mobileContentVerticalMargin, - horizontal: EmailViewStyles.mobileContentHorizontalMargin - ), - child: _buildEmailContent(context, constraints, email) - ) + _buildEmailContent(context, constraints, email) ], ); }); } - Widget _buildLoadingContentView() { + Widget _buildLoadingContentView(PresentationEmail selectedEmail) { return Obx(() { return controller.viewState.value.fold( (failure) => const SizedBox.shrink(), (success) { - if (success is GetEmailContentLoading) { - return loadingWidget; + if (selectedEmail.hasCalendarEvent) { + if ((success is GetEmailContentLoading || success is ParseCalendarEventLoading)) { + return loadingWidget; + } else { + return const SizedBox.shrink(); + } } else { - return const SizedBox.shrink(); + if (success is GetEmailContentLoading) { + return loadingWidget; + } else { + return const SizedBox.shrink(); + } } }); }); @@ -473,25 +466,36 @@ class EmailView extends GetWidget with AppLoaderMixin { final allEmailContents = controller.emailContents.value; if (PlatformInfo.isWeb) { - return HtmlContentViewerOnWeb( - widthContent: constraints.maxWidth, - heightContent: responsiveUtils.getSizeScreenHeight(context), - contentHtml: allEmailContents ?? "", - controller: HtmlViewerControllerForWeb(), - mailtoDelegate: (uri) => controller.openMailToLink(uri), - direction: AppUtils.getCurrentDirection(context), + return Expanded( + child: Padding( + padding: const EdgeInsetsDirectional.only(start: 16, bottom: 16), + child: HtmlContentViewerOnWeb( + widthContent: constraints.maxWidth, + heightContent: responsiveUtils.getSizeScreenHeight(context), + contentHtml: allEmailContents ?? "", + controller: HtmlViewerControllerForWeb(), + mailtoDelegate: (uri) => controller.openMailToLink(uri), + direction: AppUtils.getCurrentDirection(context), + ), + ), ); } else { - return HtmlContentViewer( - heightContent: responsiveUtils.getSizeScreenHeight(context), - contentHtml: allEmailContents ?? "", - mailtoDelegate: (uri) async => controller.openMailToLink(uri), - onScrollHorizontalEnd: controller.toggleScrollPhysicsPagerView, - onWebViewLoaded: (isScrollPageViewActivated) { - log('EmailView::_buildEmailContent(): isScrollPageViewActivated: $isScrollPageViewActivated'); - controller.emailSupervisorController.updateScrollPhysicPageView(isScrollPageViewActivated: isScrollPageViewActivated); - }, - direction: AppUtils.getCurrentDirection(context), + return Padding( + padding: const EdgeInsetsDirectional.symmetric( + vertical: EmailViewStyles.mobileContentVerticalMargin, + horizontal: EmailViewStyles.mobileContentHorizontalMargin + ), + child: HtmlContentViewer( + heightContent: responsiveUtils.getSizeScreenHeight(context), + contentHtml: allEmailContents ?? "", + mailtoDelegate: (uri) async => controller.openMailToLink(uri), + onScrollHorizontalEnd: controller.toggleScrollPhysicsPagerView, + onWebViewLoaded: (isScrollPageViewActivated) { + log('EmailView::_buildEmailContent(): isScrollPageViewActivated: $isScrollPageViewActivated'); + controller.emailSupervisorController.updateScrollPhysicPageView(isScrollPageViewActivated: isScrollPageViewActivated); + }, + direction: AppUtils.getCurrentDirection(context), + ), ); } } else { From 36721612314263140238f4e3dec7adc314b4d1b8 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 28 Jul 2023 00:32:33 +0700 Subject: [PATCH 08/14] TF-2057 Enable scroll page view when email has calendar event --- .../presentation/controller/single_email_controller.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 8d75bf248e..8ad0ce6041 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -1279,6 +1279,11 @@ class SingleEmailController extends BaseController with AppLoaderMixin { void _handleParseCalendarEventSuccess(ParseCalendarEventSuccess success) { if (success.calendarEventList.isNotEmpty) { calendarEvent.value = success.calendarEventList.first; + _enableScrollPageView(); } } + + void _enableScrollPageView() { + emailSupervisorController.scrollPhysicsPageView.value = null; + } } \ No newline at end of file From bbeef23fa53b865b1b09f9b9f589aabec04ca853 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 28 Jul 2023 01:09:02 +0700 Subject: [PATCH 09/14] TF-2057 Set full width size event description widget --- .../widgets/calendar_event/event_description_detail_widget.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart index c430c54201..33cb2212bf 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart @@ -24,6 +24,7 @@ class EventDescriptionDetailWidget extends StatelessWidget { color: AppColor.colorEventDescriptionBackground, borderRadius: BorderRadius.all(Radius.circular(EventDescriptionDetailWidgetStyles.borderRadius)), ), + width: double.infinity, padding: const EdgeInsetsDirectional.all(EventDescriptionDetailWidgetStyles.contentPadding), child: Stack( children: [ From c93a589d8ba8dfb224265dc8f5d6f2fe09bda6ad Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 28 Jul 2023 01:26:02 +0700 Subject: [PATCH 10/14] TF-2057 Set max lines text event information --- .../event_attendee_information_widget.dart | 10 +++++++++- .../event_location_information_widget.dart | 8 ++++++-- .../calendar_event/event_time_information_widget.dart | 8 ++++++-- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/features/email/presentation/widgets/calendar_event/event_attendee_information_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_attendee_information_widget.dart index 4567c94926..026664b4c1 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_attendee_information_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_attendee_information_widget.dart @@ -1,5 +1,8 @@ +import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:core/presentation/utils/style_utils.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/properties/attendee/calendar_attendee.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/properties/calendar_organizer.dart'; import 'package:tmail_ui_user/features/email/presentation/extensions/list_attendee_extension.dart'; @@ -19,6 +22,7 @@ class EventAttendeeInformationWidget extends StatelessWidget { @override Widget build(BuildContext context) { + final responsiveUtils = Get.find(); return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -52,7 +56,11 @@ class EventAttendeeInformationWidget extends StatelessWidget { const TextSpan(text: ', '), TextSpan(text: attendees.withoutOrganizer(organizer).mailtoAsString) ] - ) + ), + overflow: responsiveUtils.isPortraitMobile(context) + ? TextOverflow.ellipsis + : CommonTextStyle.defaultTextOverFlow, + maxLines: responsiveUtils.isPortraitMobile(context) ? null : 2, )) ], ); diff --git a/lib/features/email/presentation/widgets/calendar_event/event_location_information_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_location_information_widget.dart index f19c917d71..3aa35ff053 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_location_information_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_location_information_widget.dart @@ -1,6 +1,8 @@ +import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/style_utils.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/event_location_information_widget_styles.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -15,6 +17,7 @@ class EventLocationInformationWidget extends StatelessWidget { @override Widget build(BuildContext context) { + final responsiveUtils = Get.find(); return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -31,8 +34,9 @@ class EventLocationInformationWidget extends StatelessWidget { ), Expanded(child: Text( locationEvent, - overflow: CommonTextStyle.defaultTextOverFlow, - softWrap: CommonTextStyle.defaultSoftWrap, + overflow: responsiveUtils.isPortraitMobile(context) ? null : CommonTextStyle.defaultTextOverFlow, + softWrap: responsiveUtils.isPortraitMobile(context) ? null : CommonTextStyle.defaultSoftWrap, + maxLines: responsiveUtils.isPortraitMobile(context) ? null : 1, style: const TextStyle( fontSize: EventLocationInformationWidgetStyles.textSize, fontWeight: FontWeight.w500, diff --git a/lib/features/email/presentation/widgets/calendar_event/event_time_information_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_time_information_widget.dart index 4d8af58d42..1130e5a23e 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_time_information_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_time_information_widget.dart @@ -1,6 +1,8 @@ +import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/style_utils.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/event_time_information_widget_styles.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -15,6 +17,7 @@ class EventTimeInformationWidget extends StatelessWidget { @override Widget build(BuildContext context) { + final responsiveUtils = Get.find(); return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -31,8 +34,9 @@ class EventTimeInformationWidget extends StatelessWidget { ), Expanded(child: Text( timeEvent, - overflow: CommonTextStyle.defaultTextOverFlow, - softWrap: CommonTextStyle.defaultSoftWrap, + overflow: responsiveUtils.isPortraitMobile(context) ? null : CommonTextStyle.defaultTextOverFlow, + softWrap: responsiveUtils.isPortraitMobile(context) ? null : CommonTextStyle.defaultSoftWrap, + maxLines: responsiveUtils.isPortraitMobile(context) ? null : 1, style: const TextStyle( fontSize: EventTimeInformationWidgetStyles.textSize, fontWeight: FontWeight.w500, From a44d08bd7b05823e534aa4aac923d634d01732c4 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 28 Jul 2023 01:38:18 +0700 Subject: [PATCH 11/14] TF-2057 Add event organizer widget --- .../calendar_event/attendee_widget.dart | 8 +--- .../event_attendee_detail_widget.dart | 16 ++----- .../calendar_event/organizer_widget.dart | 44 +++++++++++++++++++ 3 files changed, 49 insertions(+), 19 deletions(-) create mode 100644 lib/features/email/presentation/widgets/calendar_event/organizer_widget.dart diff --git a/lib/features/email/presentation/widgets/calendar_event/attendee_widget.dart b/lib/features/email/presentation/widgets/calendar_event/attendee_widget.dart index 91053ee44c..c3d601e702 100644 --- a/lib/features/email/presentation/widgets/calendar_event/attendee_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/attendee_widget.dart @@ -2,19 +2,15 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/properties/attendee/calendar_attendee.dart'; -import 'package:jmap_dart_client/jmap/mail/calendar/properties/calendar_organizer.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/attendee_widget_styles.dart'; -import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; class AttendeeWidget extends StatelessWidget { final CalendarAttendee attendee; - final CalendarOrganizer organizer; const AttendeeWidget({ super.key, - required this.attendee, - required this.organizer + required this.attendee }); @override @@ -38,8 +34,6 @@ class AttendeeWidget extends StatelessWidget { fontWeight: FontWeight.w500 ), ), - if (attendee.mailto?.mailAddress == organizer.mailto) - TextSpan(text: '(${AppLocalizations.of(context).organizer})'), const TextSpan(text: ', '), ] ) diff --git a/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart index 7b4a0333d1..9a450d6801 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart @@ -6,11 +6,12 @@ import 'package:jmap_dart_client/jmap/mail/calendar/properties/calendar_organize import 'package:tmail_ui_user/features/email/presentation/extensions/list_attendee_extension.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/event_attendee_detail_widget_styles.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/attendee_widget.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/organizer_widget.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; class EventAttendeeDetailWidget extends StatelessWidget { - static const int _maxAttendeeDisplayed = 5; + static const int _maxAttendeeDisplayed = 6; final List attendees; final CalendarOrganizer organizer; @@ -40,10 +41,9 @@ class EventAttendeeDetailWidget extends StatelessWidget { Expanded(child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (attendeeOrganizer != null) - AttendeeWidget(attendee: attendeeOrganizer!, organizer: organizer), + OrganizerWidget(organizer: organizer), ..._attendeesDisplayed - .map((attendee) => AttendeeWidget(attendee: attendee, organizer: organizer)) + .map((attendee) => AttendeeWidget(attendee: attendee)) .toList() ] )) @@ -51,14 +51,6 @@ class EventAttendeeDetailWidget extends StatelessWidget { ); } - CalendarAttendee? get attendeeOrganizer { - try { - return attendees.firstWhere((attendee) => attendee.mailto?.mailAddress == organizer.mailto); - } catch (e) { - return null; - } - } - List get _attendeesDisplayed { final attendeesWithoutOrganizer = attendees.withoutOrganizer(organizer); return attendeesWithoutOrganizer.length > _maxAttendeeDisplayed diff --git a/lib/features/email/presentation/widgets/calendar_event/organizer_widget.dart b/lib/features/email/presentation/widgets/calendar_event/organizer_widget.dart new file mode 100644 index 0000000000..0925bb7587 --- /dev/null +++ b/lib/features/email/presentation/widgets/calendar_event/organizer_widget.dart @@ -0,0 +1,44 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:jmap_dart_client/jmap/mail/calendar/properties/calendar_organizer.dart'; +import 'package:tmail_ui_user/features/email/presentation/styles/attendee_widget_styles.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class OrganizerWidget extends StatelessWidget { + + final CalendarOrganizer organizer; + + const OrganizerWidget({ + super.key, + required this.organizer + }); + + @override + Widget build(BuildContext context) { + return RichText( + text: TextSpan( + style: const TextStyle( + fontSize: AttendeeWidgetStyles.textSize, + fontWeight: FontWeight.w500, + color: Colors.black + ), + children: [ + if (organizer.name?.isNotEmpty == true) + TextSpan(text: organizer.name!), + if (organizer.mailto?.value.isNotEmpty == true) + TextSpan( + text: ' <${organizer.mailto!.value}> ', + style: const TextStyle( + color: AppColor.colorMailto, + fontSize: AttendeeWidgetStyles.textSize, + fontWeight: FontWeight.w500 + ), + ), + TextSpan(text: '(${AppLocalizations.of(context).organizer})'), + const TextSpan(text: ', '), + ] + ) + ); + } +} \ No newline at end of file From 0eaa0a26b254b6d3b9ac29a3b488016b3dd8c529 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 28 Jul 2023 02:01:50 +0700 Subject: [PATCH 12/14] TF-2057 Add see all attendees button --- .../event_attendee_detail_widget_styles.dart | 1 + ...ee_all_attendees_button_widget_styles.dart | 8 ++++ .../event_attendee_detail_widget.dart | 45 ++++++++++++++++--- .../see_all_attendees_button_widget.dart | 36 +++++++++++++++ lib/l10n/intl_messages.arb | 8 +++- lib/main/localizations/app_localizations.dart | 6 +++ 6 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 lib/features/email/presentation/styles/see_all_attendees_button_widget_styles.dart create mode 100644 lib/features/email/presentation/widgets/calendar_event/see_all_attendees_button_widget.dart diff --git a/lib/features/email/presentation/styles/event_attendee_detail_widget_styles.dart b/lib/features/email/presentation/styles/event_attendee_detail_widget_styles.dart index 93449a1f4e..6c11de9b4a 100644 --- a/lib/features/email/presentation/styles/event_attendee_detail_widget_styles.dart +++ b/lib/features/email/presentation/styles/event_attendee_detail_widget_styles.dart @@ -2,4 +2,5 @@ class EventAttendeeDetailWidgetStyles { static const double maxWidth = 100; static const double textSize = 16; + static const double fieldTopPadding = 8; } \ No newline at end of file diff --git a/lib/features/email/presentation/styles/see_all_attendees_button_widget_styles.dart b/lib/features/email/presentation/styles/see_all_attendees_button_widget_styles.dart new file mode 100644 index 0000000000..37e0787ec5 --- /dev/null +++ b/lib/features/email/presentation/styles/see_all_attendees_button_widget_styles.dart @@ -0,0 +1,8 @@ + +class SeeAllAttendeesButtonWidgetStyles { + static const double textSize = 16; + static const double horizontalPadding = 8; + static const double verticalPadding = 4; + static const double borderRadius = 20; + static const double horizontalMargin = -8; +} \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart index 9a450d6801..73c53bb3f0 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart @@ -7,9 +7,10 @@ import 'package:tmail_ui_user/features/email/presentation/extensions/list_attend import 'package:tmail_ui_user/features/email/presentation/styles/event_attendee_detail_widget_styles.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/attendee_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/organizer_widget.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/see_all_attendees_button_widget.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; -class EventAttendeeDetailWidget extends StatelessWidget { +class EventAttendeeDetailWidget extends StatefulWidget { static const int _maxAttendeeDisplayed = 6; @@ -22,6 +23,24 @@ class EventAttendeeDetailWidget extends StatelessWidget { required this.organizer }); + @override + State createState() => _EventAttendeeDetailWidgetState(); +} + +class _EventAttendeeDetailWidgetState extends State { + + late List _attendeesDisplayed; + bool _isShowAllAttendee = false; + + @override + void initState() { + super.initState(); + _attendeesDisplayed = _splitAttendees(widget.attendees); + if (_attendeesDisplayed.length == widget.attendees.length - 1) { + _isShowAllAttendee = true; + } + } + @override Widget build(BuildContext context) { return Row( @@ -41,20 +60,32 @@ class EventAttendeeDetailWidget extends StatelessWidget { Expanded(child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - OrganizerWidget(organizer: organizer), + OrganizerWidget(organizer: widget.organizer), ..._attendeesDisplayed .map((attendee) => AttendeeWidget(attendee: attendee)) - .toList() + .toList(), + if (!_isShowAllAttendee) + Padding( + padding: const EdgeInsets.only(top: EventAttendeeDetailWidgetStyles.fieldTopPadding), + child: SeeAllAttendeesButtonWidget( + onTap: () { + setState(() { + _attendeesDisplayed = widget.attendees.withoutOrganizer(widget.organizer); + _isShowAllAttendee = true; + }); + } + ), + ) ] )) ], ); } - List get _attendeesDisplayed { - final attendeesWithoutOrganizer = attendees.withoutOrganizer(organizer); - return attendeesWithoutOrganizer.length > _maxAttendeeDisplayed - ? attendeesWithoutOrganizer.sublist(0, _maxAttendeeDisplayed - 1) + List _splitAttendees(List attendees) { + final attendeesWithoutOrganizer = attendees.withoutOrganizer(widget.organizer); + return attendeesWithoutOrganizer.length > EventAttendeeDetailWidget._maxAttendeeDisplayed + ? attendeesWithoutOrganizer.sublist(0, EventAttendeeDetailWidget._maxAttendeeDisplayed - 1) : attendeesWithoutOrganizer; } } \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/calendar_event/see_all_attendees_button_widget.dart b/lib/features/email/presentation/widgets/calendar_event/see_all_attendees_button_widget.dart new file mode 100644 index 0000000000..038a44ddb7 --- /dev/null +++ b/lib/features/email/presentation/widgets/calendar_event/see_all_attendees_button_widget.dart @@ -0,0 +1,36 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:tmail_ui_user/features/base/widget/material_text_button.dart'; +import 'package:tmail_ui_user/features/email/presentation/styles/see_all_attendees_button_widget_styles.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class SeeAllAttendeesButtonWidget extends StatelessWidget { + + final VoidCallback onTap; + + const SeeAllAttendeesButtonWidget({ + super.key, + required this.onTap + }); + + @override + Widget build(BuildContext context) { + return Transform( + transform: Matrix4.translationValues(SeeAllAttendeesButtonWidgetStyles.horizontalMargin, 0.0, 0.0), + child: MaterialTextButton( + label: AppLocalizations.of(context).seeAllAttendees, + onTap: onTap, + borderRadius: SeeAllAttendeesButtonWidgetStyles.borderRadius, + padding: const EdgeInsetsDirectional.symmetric( + horizontal: SeeAllAttendeesButtonWidgetStyles.horizontalPadding, + vertical: SeeAllAttendeesButtonWidgetStyles.verticalPadding + ), + customStyle: const TextStyle( + fontSize: SeeAllAttendeesButtonWidgetStyles.textSize, + color: AppColor.colorTextButton + ), + ), + ); + } +} diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 7318d458a9..3c8fb07e68 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2023-07-27T12:18:46.254059", + "@@last_modified": "2023-07-28T02:01:26.243299", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -3095,5 +3095,11 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "seeAllAttendees": "See all attendees", + "@seeAllAttendees": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index b1fc129668..790ebaeb6c 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -3192,4 +3192,10 @@ class AppLocalizations { 'Attendees', name: 'attendees'); } + + String get seeAllAttendees { + return Intl.message( + 'See all attendees', + name: 'seeAllAttendees'); + } } \ No newline at end of file From 6f9c52f17af883551e81e5bcc2ac888c69a9c121 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 28 Jul 2023 02:47:10 +0700 Subject: [PATCH 13/14] TF-2057 Add event hyper link detail widget --- .../base/widget/hyper_link_widget.dart | 33 +++++++++++++++ .../extensions/calendar_event_extension.dart | 16 ++++++++ .../calendar_event_detail_widget.dart | 6 +++ .../event_attendee_detail_widget.dart | 14 +++---- .../event_link_detail_widget.dart | 40 +++++++++++++++++++ lib/l10n/intl_messages.arb | 8 +++- lib/main/localizations/app_localizations.dart | 6 +++ 7 files changed, 115 insertions(+), 8 deletions(-) create mode 100644 lib/features/base/widget/hyper_link_widget.dart create mode 100644 lib/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart diff --git a/lib/features/base/widget/hyper_link_widget.dart b/lib/features/base/widget/hyper_link_widget.dart new file mode 100644 index 0000000000..39c0d93147 --- /dev/null +++ b/lib/features/base/widget/hyper_link_widget.dart @@ -0,0 +1,33 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/widgets.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +class HyperLinkWidget extends StatelessWidget { + + final String urlString; + + const HyperLinkWidget({Key? key, required this.urlString}) : super(key: key); + + @override + Widget build(BuildContext context) { + return RichText( + text: TextSpan( + text: urlString, + style: const TextStyle( + color: AppColor.primaryColor, + fontSize: 16, + decoration: TextDecoration.underline + ), + recognizer: TapGestureRecognizer()..onTap = () async { + if (await canLaunchUrlString(urlString)) { + launchUrlString( + urlString, + mode: LaunchMode.externalApplication + ); + } + } + ) + ); + } +} diff --git a/lib/features/email/presentation/extensions/calendar_event_extension.dart b/lib/features/email/presentation/extensions/calendar_event_extension.dart index ad55b6ee58..164c4d6a9a 100644 --- a/lib/features/email/presentation/extensions/calendar_event_extension.dart +++ b/lib/features/email/presentation/extensions/calendar_event_extension.dart @@ -269,4 +269,20 @@ extension CalendarEventExtension on CalendarEvent { return ''; } } + + List get videoConferences { + if (extensionFields != null && extensionFields!.mapFields.isNotEmpty) { + final videoConferences = extensionFields!.mapFields['X-OPENPAAS-VIDEOCONFERENCE']; + if (videoConferences != null) { + final videoConferencesNotEmpty = videoConferences + .whereNotNull() + .where((link) => link.isNotEmpty) + .toList(); + log('CalendarEventExtension::getListVideoConference: $videoConferencesNotEmpty'); + return videoConferencesNotEmpty; + } + } + + return []; + } } \ No newline at end of file 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 d0e2f5140e..9e3f823905 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 @@ -6,6 +6,7 @@ import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_ev import 'package:tmail_ui_user/features/email/presentation/styles/calendar_event_detail_widget_styles.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_link_detail_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_time_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/event_title_widget.dart'; @@ -53,6 +54,11 @@ class CalendarEventDetailWidget extends StatelessWidget { padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), child: EventTimeWidgetWidget(timeEvent: calendarEvent.dateTimeEventAsString), ), + if (calendarEvent.videoConferences.isNotEmpty) + Padding( + padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), + child: EventLinkDetailWidget(listHyperLink: calendarEvent.videoConferences), + ), if (calendarEvent.location?.isNotEmpty == true) Padding( padding: const EdgeInsets.only(top: CalendarEventDetailWidgetStyles.fieldTopPadding), diff --git a/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart index 73c53bb3f0..26a640f3a4 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart @@ -1,5 +1,6 @@ import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/utils/app_logger.dart'; import 'package:flutter/material.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/properties/attendee/calendar_attendee.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/properties/calendar_organizer.dart'; @@ -12,7 +13,7 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; class EventAttendeeDetailWidget extends StatefulWidget { - static const int _maxAttendeeDisplayed = 6; + static const int maxAttendeeDisplayed = 6; final List attendees; final CalendarOrganizer organizer; @@ -30,15 +31,14 @@ class EventAttendeeDetailWidget extends StatefulWidget { class _EventAttendeeDetailWidgetState extends State { late List _attendeesDisplayed; - bool _isShowAllAttendee = false; + late bool _isShowAllAttendee; @override void initState() { super.initState(); _attendeesDisplayed = _splitAttendees(widget.attendees); - if (_attendeesDisplayed.length == widget.attendees.length - 1) { - _isShowAllAttendee = true; - } + _isShowAllAttendee = widget.attendees.length <= EventAttendeeDetailWidget.maxAttendeeDisplayed; + log('_EventAttendeeDetailWidgetState::initState:attendees: ${widget.attendees.length} | _isShowAllAttendee: $_isShowAllAttendee'); } @override @@ -84,8 +84,8 @@ class _EventAttendeeDetailWidgetState extends State { List _splitAttendees(List attendees) { final attendeesWithoutOrganizer = attendees.withoutOrganizer(widget.organizer); - return attendeesWithoutOrganizer.length > EventAttendeeDetailWidget._maxAttendeeDisplayed - ? attendeesWithoutOrganizer.sublist(0, EventAttendeeDetailWidget._maxAttendeeDisplayed - 1) + return attendeesWithoutOrganizer.length > EventAttendeeDetailWidget.maxAttendeeDisplayed + ? attendeesWithoutOrganizer.sublist(0, EventAttendeeDetailWidget.maxAttendeeDisplayed - 1) : attendeesWithoutOrganizer; } } \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart new file mode 100644 index 0000000000..b7bcaaf9ac --- /dev/null +++ b/lib/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart @@ -0,0 +1,40 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:tmail_ui_user/features/base/widget/hyper_link_widget.dart'; +import 'package:tmail_ui_user/features/email/presentation/styles/event_location_detail_widget_styles.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class EventLinkDetailWidget extends StatelessWidget { + + final List listHyperLink; + + const EventLinkDetailWidget({ + super.key, + required this.listHyperLink + }); + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: EventLocationDetailWidgetStyles.maxWidth, + child: Text( + AppLocalizations.of(context).link, + style: const TextStyle( + fontSize: EventLocationDetailWidgetStyles.textSize, + fontWeight: FontWeight.w500, + color: AppColor.colorSubTitleEventActionText + ), + ), + ), + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: listHyperLink.map((link) => HyperLinkWidget(urlString: link)).toList(), + )) + ], + ); + } +} \ No newline at end of file diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 3c8fb07e68..7dfb0a04b5 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2023-07-28T02:01:26.243299", + "@@last_modified": "2023-07-28T02:46:38.430701", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -3101,5 +3101,11 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "link": "Link", + "@link": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 790ebaeb6c..29e81d2090 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -3198,4 +3198,10 @@ class AppLocalizations { 'See all attendees', name: 'seeAllAttendees'); } + + String get link { + return Intl.message( + 'Link', + name: 'link'); + } } \ No newline at end of file From 586f07d30afbb4741567254fc895a83dc31d0ce7 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 28 Jul 2023 09:29:31 +0700 Subject: [PATCH 14/14] TF-2057 Add color/size to styles --- .../cupertino_loading_widget_styles.dart | 7 ++++ .../base/styles/hyper_link_widget_styles.dart | 7 ++++ .../base/widget/cupertino_loading_widget.dart | 17 ++++++++++ .../base/widget/hyper_link_widget.dart | 6 ++-- .../email/presentation/email_view.dart | 30 +++------------- .../styles/attendee_widget_styles.dart | 5 +++ .../calendar_event_detail_widget_styles.dart | 5 +++ .../event_attendee_detail_widget_styles.dart | 5 +++ ...vent_description_detail_widget_styles.dart | 4 ++- .../event_link_detail_widget_styles.dart | 10 ++++++ .../event_location_detail_widget_styles.dart | 5 +++ .../event_time_detail_widget_styles.dart | 5 +++ .../styles/event_title_widget_styles.dart | 3 ++ .../styles/organizer_widget_styles.dart | 10 ++++++ ...ee_all_attendees_button_widget_styles.dart | 4 +++ .../calendar_event/attendee_widget.dart | 5 ++- .../calendar_event_detail_widget.dart | 5 ++- .../event_attendee_detail_widget.dart | 3 +- .../event_attendee_information_widget.dart | 5 ++- .../event_description_detail_widget.dart | 2 +- .../event_link_detail_widget.dart | 9 +++-- .../event_location_detail_widget.dart | 5 ++- .../event_time_detail_widget.dart | 5 ++- .../calendar_event/event_title_widget.dart | 2 +- .../calendar_event/organizer_widget.dart | 11 +++--- .../see_all_attendees_button_widget.dart | 3 +- .../email_view_loading_bar_widget.dart | 34 +++++++++++++++++++ 27 files changed, 151 insertions(+), 61 deletions(-) create mode 100644 lib/features/base/styles/cupertino_loading_widget_styles.dart create mode 100644 lib/features/base/styles/hyper_link_widget_styles.dart create mode 100644 lib/features/base/widget/cupertino_loading_widget.dart create mode 100644 lib/features/email/presentation/styles/event_link_detail_widget_styles.dart create mode 100644 lib/features/email/presentation/styles/organizer_widget_styles.dart create mode 100644 lib/features/email/presentation/widgets/email_view_loading_bar_widget.dart diff --git a/lib/features/base/styles/cupertino_loading_widget_styles.dart b/lib/features/base/styles/cupertino_loading_widget_styles.dart new file mode 100644 index 0000000000..3000ad3694 --- /dev/null +++ b/lib/features/base/styles/cupertino_loading_widget_styles.dart @@ -0,0 +1,7 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; + +class CupertinoLoadingWidgetStyles { + static const Color progressColor = AppColor.colorLoading; + static const double size = 24; +} \ No newline at end of file diff --git a/lib/features/base/styles/hyper_link_widget_styles.dart b/lib/features/base/styles/hyper_link_widget_styles.dart new file mode 100644 index 0000000000..c8668cb476 --- /dev/null +++ b/lib/features/base/styles/hyper_link_widget_styles.dart @@ -0,0 +1,7 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; + +class HyperLinkWidgetStyles { + static const Color textColor = AppColor.primaryColor; + static const double textSize = 16; +} \ No newline at end of file diff --git a/lib/features/base/widget/cupertino_loading_widget.dart b/lib/features/base/widget/cupertino_loading_widget.dart new file mode 100644 index 0000000000..0c8d3e72a9 --- /dev/null +++ b/lib/features/base/widget/cupertino_loading_widget.dart @@ -0,0 +1,17 @@ +import 'package:flutter/cupertino.dart'; +import 'package:tmail_ui_user/features/base/styles/cupertino_loading_widget_styles.dart'; + +class CupertinoLoadingWidget extends StatelessWidget { + const CupertinoLoadingWidget({super.key}); + + @override + Widget build(BuildContext context) { + return const Center( + child: SizedBox( + width: CupertinoLoadingWidgetStyles.size, + height: CupertinoLoadingWidgetStyles.size, + child: CupertinoActivityIndicator(color: CupertinoLoadingWidgetStyles.progressColor) + ) + ); + } +} \ No newline at end of file diff --git a/lib/features/base/widget/hyper_link_widget.dart b/lib/features/base/widget/hyper_link_widget.dart index 39c0d93147..f0249179ea 100644 --- a/lib/features/base/widget/hyper_link_widget.dart +++ b/lib/features/base/widget/hyper_link_widget.dart @@ -1,6 +1,6 @@ -import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/widgets.dart'; +import 'package:tmail_ui_user/features/base/styles/hyper_link_widget_styles.dart'; import 'package:url_launcher/url_launcher_string.dart'; class HyperLinkWidget extends StatelessWidget { @@ -15,8 +15,8 @@ class HyperLinkWidget extends StatelessWidget { text: TextSpan( text: urlString, style: const TextStyle( - color: AppColor.primaryColor, - fontSize: 16, + color: HyperLinkWidgetStyles.textColor, + fontSize: HyperLinkWidgetStyles.textSize, decoration: TextDecoration.underline ), recognizer: TapGestureRecognizer()..onTap = () async { diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index b4cc816f5b..e3594bf0f8 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -22,8 +22,6 @@ import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/base/widget/custom_scroll_behavior.dart'; import 'package:tmail_ui_user/features/base/widget/popup_item_widget.dart'; -import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart'; -import 'package:tmail_ui_user/features/email/domain/state/parse_calendar_event_state.dart'; import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/email_view_styles.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/app_bar_mail_widget_builder.dart'; @@ -33,6 +31,7 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_detail_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/calendar_event/calendar_event_information_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_loading_bar_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/information_sender_and_receiver_builder.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart'; @@ -284,7 +283,10 @@ class EmailView extends GetWidget with AppLoaderMixin { responsiveUtils: responsiveUtils, ), _buildAttachments(context), - _buildLoadingContentView(email), + Obx(() => EmailViewLoadingBarWidget( + viewState: controller.viewState.value, + selectedEmail: email + )), if (email.hasCalendarEvent) Obx(() { if (controller.calendarEvent.value != null) { @@ -315,28 +317,6 @@ class EmailView extends GetWidget with AppLoaderMixin { }); } - Widget _buildLoadingContentView(PresentationEmail selectedEmail) { - return Obx(() { - return controller.viewState.value.fold( - (failure) => const SizedBox.shrink(), - (success) { - if (selectedEmail.hasCalendarEvent) { - if ((success is GetEmailContentLoading || success is ParseCalendarEventLoading)) { - return loadingWidget; - } else { - return const SizedBox.shrink(); - } - } else { - if (success is GetEmailContentLoading) { - return loadingWidget; - } else { - return const SizedBox.shrink(); - } - } - }); - }); - } - Widget _buildAttachments(BuildContext context) { return Obx(() { final attachments = controller.attachments.listAttachmentsDisplayedOutSide; diff --git a/lib/features/email/presentation/styles/attendee_widget_styles.dart b/lib/features/email/presentation/styles/attendee_widget_styles.dart index cbc59f6dbf..0a66107c97 100644 --- a/lib/features/email/presentation/styles/attendee_widget_styles.dart +++ b/lib/features/email/presentation/styles/attendee_widget_styles.dart @@ -1,5 +1,10 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; + class AttendeeWidgetStyles { static const double maxWidth = 100; static const double textSize = 16; + static const Color textColor = Colors.black; + static const Color mailtoColor = AppColor.colorMailto; } \ No newline at end of file diff --git a/lib/features/email/presentation/styles/calendar_event_detail_widget_styles.dart b/lib/features/email/presentation/styles/calendar_event_detail_widget_styles.dart index f76e337173..80d262e2d9 100644 --- a/lib/features/email/presentation/styles/calendar_event_detail_widget_styles.dart +++ b/lib/features/email/presentation/styles/calendar_event_detail_widget_styles.dart @@ -1,4 +1,7 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; + class CalendarEventDetailWidgetStyles { static const double textSize = 24; static const double borderRadius = 16; @@ -6,4 +9,6 @@ class CalendarEventDetailWidgetStyles { static const double horizontalMargin = 16; static const double contentPadding = 16; static const double fieldTopPadding = 16; + static const Color borderStrokeColor = AppColor.colorCalendarEventInformationStroke; + static const double borderStrokeWidth = 0.5; } \ No newline at end of file diff --git a/lib/features/email/presentation/styles/event_attendee_detail_widget_styles.dart b/lib/features/email/presentation/styles/event_attendee_detail_widget_styles.dart index 6c11de9b4a..f510184b20 100644 --- a/lib/features/email/presentation/styles/event_attendee_detail_widget_styles.dart +++ b/lib/features/email/presentation/styles/event_attendee_detail_widget_styles.dart @@ -1,6 +1,11 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; + class EventAttendeeDetailWidgetStyles { static const double maxWidth = 100; static const double textSize = 16; static const double fieldTopPadding = 8; + static const Color labelColor = AppColor.colorSubTitleEventActionText; + static const Color valueColor = Colors.black; } \ No newline at end of file diff --git a/lib/features/email/presentation/styles/event_description_detail_widget_styles.dart b/lib/features/email/presentation/styles/event_description_detail_widget_styles.dart index 427b7a794b..82b3591bd9 100644 --- a/lib/features/email/presentation/styles/event_description_detail_widget_styles.dart +++ b/lib/features/email/presentation/styles/event_description_detail_widget_styles.dart @@ -1,7 +1,9 @@ +import 'package:flutter/material.dart'; + class EventDescriptionDetailWidgetStyles { static const double textSize = 16; static const double borderRadius = 16; static const double contentPadding = 16; - static const double fieldTopPadding = 16; + static const Color valueColor = Colors.black; } \ No newline at end of file diff --git a/lib/features/email/presentation/styles/event_link_detail_widget_styles.dart b/lib/features/email/presentation/styles/event_link_detail_widget_styles.dart new file mode 100644 index 0000000000..e91c8ba779 --- /dev/null +++ b/lib/features/email/presentation/styles/event_link_detail_widget_styles.dart @@ -0,0 +1,10 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; + +class EventLinkDetailWidgetStyles { + static const double maxWidth = 100; + static const double textSize = 16; + static const Color labelColor = AppColor.colorSubTitleEventActionText; + static const Color valueColor = Colors.black; +} \ No newline at end of file diff --git a/lib/features/email/presentation/styles/event_location_detail_widget_styles.dart b/lib/features/email/presentation/styles/event_location_detail_widget_styles.dart index 94030be48e..8abe0cdf06 100644 --- a/lib/features/email/presentation/styles/event_location_detail_widget_styles.dart +++ b/lib/features/email/presentation/styles/event_location_detail_widget_styles.dart @@ -1,5 +1,10 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; + class EventLocationDetailWidgetStyles { static const double maxWidth = 100; static const double textSize = 16; + static const Color labelColor = AppColor.colorSubTitleEventActionText; + static const Color valueColor = Colors.black; } \ No newline at end of file diff --git a/lib/features/email/presentation/styles/event_time_detail_widget_styles.dart b/lib/features/email/presentation/styles/event_time_detail_widget_styles.dart index ca2c78ecfc..af54d01924 100644 --- a/lib/features/email/presentation/styles/event_time_detail_widget_styles.dart +++ b/lib/features/email/presentation/styles/event_time_detail_widget_styles.dart @@ -1,5 +1,10 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; + class EventTimeDetailWidgetStyles { static const double maxWidth = 100; static const double textSize = 16; + static const Color labelColor = AppColor.colorSubTitleEventActionText; + static const Color valueColor = Colors.black; } \ No newline at end of file diff --git a/lib/features/email/presentation/styles/event_title_widget_styles.dart b/lib/features/email/presentation/styles/event_title_widget_styles.dart index fdcf622414..f53abaf925 100644 --- a/lib/features/email/presentation/styles/event_title_widget_styles.dart +++ b/lib/features/email/presentation/styles/event_title_widget_styles.dart @@ -1,4 +1,7 @@ +import 'package:flutter/material.dart'; + class EventTitleWidgetStyles { static const double textSize = 24; + static const Color textColor = Colors.black; } \ No newline at end of file diff --git a/lib/features/email/presentation/styles/organizer_widget_styles.dart b/lib/features/email/presentation/styles/organizer_widget_styles.dart new file mode 100644 index 0000000000..1ea478c4bc --- /dev/null +++ b/lib/features/email/presentation/styles/organizer_widget_styles.dart @@ -0,0 +1,10 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; + +class OrganizerWidgetStyles { + static const double maxWidth = 100; + static const double textSize = 16; + static const Color textColor = Colors.black; + static const Color mailtoColor = AppColor.colorMailto; +} \ No newline at end of file diff --git a/lib/features/email/presentation/styles/see_all_attendees_button_widget_styles.dart b/lib/features/email/presentation/styles/see_all_attendees_button_widget_styles.dart index 37e0787ec5..a64f3ce54e 100644 --- a/lib/features/email/presentation/styles/see_all_attendees_button_widget_styles.dart +++ b/lib/features/email/presentation/styles/see_all_attendees_button_widget_styles.dart @@ -1,8 +1,12 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; + class SeeAllAttendeesButtonWidgetStyles { static const double textSize = 16; static const double horizontalPadding = 8; static const double verticalPadding = 4; static const double borderRadius = 20; static const double horizontalMargin = -8; + static const Color textColor = AppColor.primaryColor; } \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/calendar_event/attendee_widget.dart b/lib/features/email/presentation/widgets/calendar_event/attendee_widget.dart index c3d601e702..03ebcf3d3d 100644 --- a/lib/features/email/presentation/widgets/calendar_event/attendee_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/attendee_widget.dart @@ -1,5 +1,4 @@ -import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/properties/attendee/calendar_attendee.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/attendee_widget_styles.dart'; @@ -20,7 +19,7 @@ class AttendeeWidget extends StatelessWidget { style: const TextStyle( fontSize: AttendeeWidgetStyles.textSize, fontWeight: FontWeight.w500, - color: Colors.black + color: AttendeeWidgetStyles.textColor ), children: [ if (attendee.name?.name.isNotEmpty == true) @@ -29,7 +28,7 @@ class AttendeeWidget extends StatelessWidget { TextSpan( text: ' <${attendee.mailto!.mailAddress.value}> ', style: const TextStyle( - color: AppColor.colorMailto, + color: AttendeeWidgetStyles.mailtoColor, fontSize: AttendeeWidgetStyles.textSize, fontWeight: FontWeight.w500 ), 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 9e3f823905..0d6c39bf21 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 @@ -1,5 +1,4 @@ -import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart'; import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_event_extension.dart'; @@ -28,8 +27,8 @@ class CalendarEventDetailWidget extends StatelessWidget { color: Colors.white, shape: RoundedRectangleBorder( side: BorderSide( - width: 0.5, - color: AppColor.colorCalendarEventInformationStroke, + width: CalendarEventDetailWidgetStyles.borderStrokeWidth, + color: CalendarEventDetailWidgetStyles.borderStrokeColor, ), borderRadius: BorderRadius.all(Radius.circular(CalendarEventDetailWidgetStyles.borderRadius)), ), diff --git a/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart index 26a640f3a4..13f3026e6d 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_attendee_detail_widget.dart @@ -1,5 +1,4 @@ -import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/utils/app_logger.dart'; import 'package:flutter/material.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/properties/attendee/calendar_attendee.dart'; @@ -53,7 +52,7 @@ class _EventAttendeeDetailWidgetState extends State { style: const TextStyle( fontSize: EventAttendeeDetailWidgetStyles.textSize, fontWeight: FontWeight.w500, - color: AppColor.colorSubTitleEventActionText + color: EventAttendeeDetailWidgetStyles.labelColor ), ), ), diff --git a/lib/features/email/presentation/widgets/calendar_event/event_attendee_information_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_attendee_information_widget.dart index 026664b4c1..f38edc797a 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_attendee_information_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_attendee_information_widget.dart @@ -1,6 +1,5 @@ import 'package:core/presentation/utils/responsive_utils.dart'; -import 'package:core/presentation/utils/style_utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/properties/attendee/calendar_attendee.dart'; @@ -58,8 +57,8 @@ class EventAttendeeInformationWidget extends StatelessWidget { ] ), overflow: responsiveUtils.isPortraitMobile(context) - ? TextOverflow.ellipsis - : CommonTextStyle.defaultTextOverFlow, + ? TextOverflow.clip + : TextOverflow.ellipsis, maxLines: responsiveUtils.isPortraitMobile(context) ? null : 2, )) ], diff --git a/lib/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart index 33cb2212bf..298a5465e7 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_description_detail_widget.dart @@ -33,7 +33,7 @@ class EventDescriptionDetailWidget extends StatelessWidget { style: const TextStyle( fontWeight: FontWeight.w500, fontSize: EventDescriptionDetailWidgetStyles.textSize, - color: Colors.black + color: EventDescriptionDetailWidgetStyles.valueColor ) ), PositionedDirectional( diff --git a/lib/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart index b7bcaaf9ac..32bbccd945 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_link_detail_widget.dart @@ -1,8 +1,7 @@ -import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; import 'package:tmail_ui_user/features/base/widget/hyper_link_widget.dart'; -import 'package:tmail_ui_user/features/email/presentation/styles/event_location_detail_widget_styles.dart'; +import 'package:tmail_ui_user/features/email/presentation/styles/event_link_detail_widget_styles.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; class EventLinkDetailWidget extends StatelessWidget { @@ -20,13 +19,13 @@ class EventLinkDetailWidget extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - width: EventLocationDetailWidgetStyles.maxWidth, + width: EventLinkDetailWidgetStyles.maxWidth, child: Text( AppLocalizations.of(context).link, style: const TextStyle( - fontSize: EventLocationDetailWidgetStyles.textSize, + fontSize: EventLinkDetailWidgetStyles.textSize, fontWeight: FontWeight.w500, - color: AppColor.colorSubTitleEventActionText + color: EventLinkDetailWidgetStyles.labelColor ), ), ), diff --git a/lib/features/email/presentation/widgets/calendar_event/event_location_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_location_detail_widget.dart index fef6ba7aae..36b046848d 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_location_detail_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_location_detail_widget.dart @@ -1,5 +1,4 @@ -import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/event_location_detail_widget_styles.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -25,7 +24,7 @@ class EventLocationDetailWidget extends StatelessWidget { style: const TextStyle( fontSize: EventLocationDetailWidgetStyles.textSize, fontWeight: FontWeight.w500, - color: AppColor.colorSubTitleEventActionText + color: EventLocationDetailWidgetStyles.labelColor ), ), ), @@ -34,7 +33,7 @@ class EventLocationDetailWidget extends StatelessWidget { style: const TextStyle( fontSize: EventLocationDetailWidgetStyles.textSize, fontWeight: FontWeight.w500, - color: Colors.black + color: EventLocationDetailWidgetStyles.valueColor ), )) ], diff --git a/lib/features/email/presentation/widgets/calendar_event/event_time_detail_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_time_detail_widget.dart index 487034d282..1af9a6ca94 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_time_detail_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_time_detail_widget.dart @@ -1,5 +1,4 @@ -import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/event_time_detail_widget_styles.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -25,7 +24,7 @@ class EventTimeWidgetWidget extends StatelessWidget { style: const TextStyle( fontSize: EventTimeDetailWidgetStyles.textSize, fontWeight: FontWeight.w500, - color: AppColor.colorSubTitleEventActionText + color: EventTimeDetailWidgetStyles.labelColor ), ), ), @@ -34,7 +33,7 @@ class EventTimeWidgetWidget extends StatelessWidget { style: const TextStyle( fontSize: EventTimeDetailWidgetStyles.textSize, fontWeight: FontWeight.w500, - color: Colors.black + color: EventTimeDetailWidgetStyles.valueColor ), )) ], diff --git a/lib/features/email/presentation/widgets/calendar_event/event_title_widget.dart b/lib/features/email/presentation/widgets/calendar_event/event_title_widget.dart index 416a685476..99284c95c1 100644 --- a/lib/features/email/presentation/widgets/calendar_event/event_title_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/event_title_widget.dart @@ -15,7 +15,7 @@ class EventTitleWidget extends StatelessWidget { style: const TextStyle( fontWeight: FontWeight.w500, fontSize: EventTitleWidgetStyles.textSize, - color: Colors.black + color: EventTitleWidgetStyles.textColor ) ); } diff --git a/lib/features/email/presentation/widgets/calendar_event/organizer_widget.dart b/lib/features/email/presentation/widgets/calendar_event/organizer_widget.dart index 0925bb7587..4ac0dce035 100644 --- a/lib/features/email/presentation/widgets/calendar_event/organizer_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/organizer_widget.dart @@ -1,8 +1,7 @@ -import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/properties/calendar_organizer.dart'; -import 'package:tmail_ui_user/features/email/presentation/styles/attendee_widget_styles.dart'; +import 'package:tmail_ui_user/features/email/presentation/styles/organizer_widget_styles.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; class OrganizerWidget extends StatelessWidget { @@ -19,9 +18,9 @@ class OrganizerWidget extends StatelessWidget { return RichText( text: TextSpan( style: const TextStyle( - fontSize: AttendeeWidgetStyles.textSize, + fontSize: OrganizerWidgetStyles.textSize, fontWeight: FontWeight.w500, - color: Colors.black + color: OrganizerWidgetStyles.textColor ), children: [ if (organizer.name?.isNotEmpty == true) @@ -30,8 +29,8 @@ class OrganizerWidget extends StatelessWidget { TextSpan( text: ' <${organizer.mailto!.value}> ', style: const TextStyle( - color: AppColor.colorMailto, - fontSize: AttendeeWidgetStyles.textSize, + color: OrganizerWidgetStyles.mailtoColor, + fontSize: OrganizerWidgetStyles.textSize, fontWeight: FontWeight.w500 ), ), diff --git a/lib/features/email/presentation/widgets/calendar_event/see_all_attendees_button_widget.dart b/lib/features/email/presentation/widgets/calendar_event/see_all_attendees_button_widget.dart index 038a44ddb7..78ce4d4dcf 100644 --- a/lib/features/email/presentation/widgets/calendar_event/see_all_attendees_button_widget.dart +++ b/lib/features/email/presentation/widgets/calendar_event/see_all_attendees_button_widget.dart @@ -1,5 +1,4 @@ -import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/cupertino.dart'; import 'package:tmail_ui_user/features/base/widget/material_text_button.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/see_all_attendees_button_widget_styles.dart'; @@ -28,7 +27,7 @@ class SeeAllAttendeesButtonWidget extends StatelessWidget { ), customStyle: const TextStyle( fontSize: SeeAllAttendeesButtonWidgetStyles.textSize, - color: AppColor.colorTextButton + color: SeeAllAttendeesButtonWidgetStyles.textColor ), ), ); diff --git a/lib/features/email/presentation/widgets/email_view_loading_bar_widget.dart b/lib/features/email/presentation/widgets/email_view_loading_bar_widget.dart new file mode 100644 index 0000000000..4d92cf4785 --- /dev/null +++ b/lib/features/email/presentation/widgets/email_view_loading_bar_widget.dart @@ -0,0 +1,34 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:dartz/dartz.dart'; +import 'package:flutter/material.dart'; +import 'package:model/email/presentation_email.dart'; +import 'package:tmail_ui_user/features/base/widget/cupertino_loading_widget.dart'; +import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart'; +import 'package:tmail_ui_user/features/email/domain/state/parse_calendar_event_state.dart'; + +class EmailViewLoadingBarWidget extends StatelessWidget { + + final PresentationEmail selectedEmail; + final Either viewState; + + const EmailViewLoadingBarWidget({ + super.key, + required this.viewState, + required this.selectedEmail + }); + + @override + Widget build(BuildContext context) { + return viewState.fold( + (failure) => const SizedBox.shrink(), + (success) { + if (success is GetEmailContentLoading || (success is ParseCalendarEventLoading && selectedEmail.hasCalendarEvent)) { + return const CupertinoLoadingWidget(); + } else { + return const SizedBox.shrink(); + } + } + ); + } +}